diff --git a/genshin.py b/genshin.py index a71ed4b..4753ebd 100755 --- a/genshin.py +++ b/genshin.py @@ -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,29 +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._cookie = 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 time(s) ..." %(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 time(s) ..." %(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 @@ -103,9 +97,21 @@ class Sign(object): break try: - self._bindList = self._roles['data']['list'] + self._rolesInfo except AttributeError: raise Exception(errstr) + + return self._rolesInfo + + +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): @@ -126,14 +132,13 @@ class Sign(object): "&utm_medium=%s&utm_campaign=%s" %( Conf.index_url, 'true', actid, 'bbs', 'mys', 'icon') - # x-rpc-client_type - # 1: ios - # 2: android - # 4: pc web - # 5: mobile web 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, @@ -144,41 +149,28 @@ class Sign(object): } def run(self): - for i in range(len(self._bindList)): - # region - # cn_gf01: 天空岛 - # cn_qd01: 世界树 - try: - self._region = self._bindList[i]['region'] - except: - raise KeyError(str(self._roles)) - - try: - self._region_name = self._bindList[i]['region_name'] - except: - raise KeyError(str(self._roles)) - - try: - self._uid = self._bindList[i]['game_uid'] - except: - raise KeyError(str(self._roles)) - - logging.info('Your account has been bound %s role(s), UID %s is %s in %s' %(len(self._bindList), i+1, str(self._uid).replace(str(self._uid)[3:6],'***',1), self._region_name)) - - data = { - 'act_id': 'e202009291139501', - 'region': self._region, - 'uid': self._uid - } - - try: - jdict = json.loads(requests.Session().post( - self._url, headers = self.get_header(), - data = json.dumps(data, ensure_ascii=False)).text) - except Exception as e: - raise - - return jdict + # 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', + 'region': self._region, + '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(), + data = json.dumps(data, ensure_ascii=False)).text) + except Exception as e: + raise + + return jdict def makeResult(result:str, data=None): @@ -192,31 +184,42 @@ def makeResult(result:str, data=None): if __name__ == "__main__": - seconds = random.randint(10, 300) + cookie = input().strip() + 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(1, 3) + 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) + + logging.info('Sign in complete!') 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) exit(ret)