Merge pull request #51 from y1ndan/dev

feature: add support for multiple roles, closes #27; add wechat notification, closes #19, closes #33, closes #38
This commit is contained in:
y1ndan 2020-12-27 08:42:25 +08:00 committed by GitHub
commit 97ca6ee515
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -28,7 +28,8 @@ class ConfMeta(type):
@property
def ua(self):
return 'Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) ' \
'AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/%s' %(self.app_version)
'AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/%s' \
%(self.app_version)
class Conf(metaclass=ConfMeta):
@ -69,28 +70,22 @@ class Roles(object):
return jdict
class Sign(object):
def __init__(self, cookie:str=None):
if type(cookie) is not str:
raise TypeError("%s want a %s but got %s" %(
self.__class__, type(__name__), type(cookie)))
self._url = 'https://api-takumi.mihoyo.com/event/bbs_sign_reward/sign'
roles = Roles(cookie)
def get_rolesInfo(self):
logging.info('Start getting user information ...')
errstr = None
for i in range(1, 4):
try:
self._roles = roles.get_roles()
self._rolesInfo = self.get_roles()
except HTTPError as e:
logging.error("HTTP error when get user game roles, retry %s times ..." %(i))
logging.error("HTTP error when get user game roles, " \
"retry %s time(s) ..." %(i))
logging.error("error is %s" %(e))
errstr = str(e)
continue
except KeyError as e:
logging.error("Wrong response to get user game roles, retry %s times ..." %(i))
logging.error("Wrong response to get user game roles, " \
"retry %s time(s) ..." %(i))
logging.error("response is %s" %(e))
errstr = str(e)
continue
@ -102,23 +97,21 @@ class Sign(object):
break
try:
self._roles
self._rolesInfo
except AttributeError:
raise Exception(errstr)
return self._rolesInfo
# cn_gf01: Official server
# cn_qd01: Bilibili server
try:
self._region = self._roles['data']['list'][0]['region']
except:
raise KeyError(str(self._roles))
try:
self._uid = self._roles['data']['list'][0]['game_uid']
except:
raise KeyError(str(self._roles))
class Sign(object):
def __init__(self, cookie:str=None):
if type(cookie) is not str:
raise TypeError("%s want a %s but got %s" %(
self.__class__, type(__name__), type(cookie)))
self._cookie = cookie
self._url = 'https://api-takumi.mihoyo.com/event/bbs_sign_reward/sign'
# Provided by Steesha
def md5(self, text):
@ -142,6 +135,10 @@ class Sign(object):
return {
'x-rpc-device_id': str(uuid.uuid3(
uuid.NAMESPACE_URL, self._cookie)).replace('-','').upper(),
# 1: ios
# 2: android
# 4: pc web
# 5: mobile web
'x-rpc-client_type': '5',
'Accept-Encoding': 'gzip, deflate, br',
'User-Agent': Conf.ua,
@ -152,7 +149,11 @@ class Sign(object):
}
def run(self):
logging.info('UID is %s' %(str(self._uid).replace(str(self._uid)[3:6],'***',1)))
# cn_gf01: 天空岛
# cn_qd01: 世界树
self._region = rolesList[i]['region']
self._region_name = rolesList[i]['region_name']
self._uid = rolesList[i]['game_uid']
data = {
'act_id': 'e202009291139501',
@ -160,6 +161,8 @@ class Sign(object):
'uid': self._uid
}
logging.info('Start signing in the NO.%s role which UID is %s in %s ...' %(
i+1, str(self._uid).replace(str(self._uid)[3:6],'***',1), self._region_name))
try:
jdict = json.loads(requests.Session().post(
self._url, headers = self.get_header(),
@ -179,34 +182,70 @@ def makeResult(result:str, data=None):
sort_keys=False, indent=2, ensure_ascii=False
)
def notify(key, massage):
if key != '':
logging.info('正在推送通知...')
url = 'https://sc.ftqq.com/%s.send' %(key)
data = {'text':'原神签到小助手', 'desp':massage}
try:
jdict = json.loads(
requests.Session().post(url, data = data).text)
errmsg = jdict['errmsg']
if errmsg == 'success':
logging.info('推送通知成功')
else:
logging.info('推送通知失败')
logging.error(jdict)
except Exception as e:
logging.error(e)
raise HTTPError
return jdict
else:
logging.info('未配置SCKEY,正在跳过推送...')
if __name__ == "__main__":
seconds = random.randint(10, 300)
secret = input().strip().rsplit(' ', 1)
secret.append('')
cookie=secret[0]
sckey=secret[1]
jstr = Roles(cookie).get_rolesInfo()
result = makeResult('Failed', jstr)
ret = -1
logging.info('Sleep for %s seconds ...' %(seconds))
time.sleep(seconds)
try:
jdict = Sign(input().strip()).run()
jstr = json.dumps(jdict, ensure_ascii=False)
code = jdict['retcode']
rolesList = jstr['data']['list']
logging.info('Your account has been bound %s role(s)' %(len(rolesList)))
for i in range(len(rolesList)):
seconds = random.randint(10, 300)
logging.info('Sleep for %s seconds ...' %(seconds))
time.sleep(seconds)
try:
jdict = Sign(cookie).run()
jstr = json.dumps(jdict, ensure_ascii=False)
code = jdict['retcode']
except Exception as e:
jstr = str(e)
try:
code
except NameError:
code = -1
# 0: success
# -5003: already signed in
if code in [0, -5003]:
result = makeResult('Success', jstr)
ret = 0
logging.info(result)
except Exception as e:
jstr = str(e)
logging.info(result)
result = makeResult('Failed', jstr)
try:
code
except NameError:
code = -1
# 0: success
# -5003: already signed in
if code in [0, -5003]:
result = makeResult('Success', jstr)
ret = 0
logging.info(result)
notify(sckey, result)
logging.info('签到完成!')
exit(ret)