feature: add support for multiple roles bound to the same account
This commit is contained in:
parent
6d7a16425c
commit
bb29590f6c
87
genshin.py
87
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,10 +97,22 @@ 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):
|
||||
md5 = hashlib.md5()
|
||||
@ -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
|
||||
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
|
||||
return {
|
||||
'x-rpc-device_id': str(uuid.uuid3(
|
||||
uuid.NAMESPACE_URL, self._cookie)).replace('-','').upper(),
|
||||
'x-rpc-client_type': '5',
|
||||
'Accept-Encoding': 'gzip, deflate, br',
|
||||
'User-Agent': Conf.ua,
|
||||
@ -144,26 +149,11 @@ 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))
|
||||
self._region = rolesList[i]['region']
|
||||
self._region_name = rolesList[i]['region_name']
|
||||
self._uid = rolesList[i]['game_uid']
|
||||
|
||||
data = {
|
||||
'act_id': 'e202009291139501',
|
||||
@ -171,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(),
|
||||
@ -192,21 +184,27 @@ 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
|
||||
|
||||
try:
|
||||
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(input().strip()).run()
|
||||
jdict = Sign(cookie).run()
|
||||
jstr = json.dumps(jdict, ensure_ascii=False)
|
||||
code = jdict['retcode']
|
||||
except Exception as e:
|
||||
jstr = str(e)
|
||||
|
||||
result = makeResult('Failed', jstr)
|
||||
|
||||
try:
|
||||
code
|
||||
except NameError:
|
||||
@ -219,4 +217,9 @@ if __name__ == "__main__":
|
||||
ret = 0
|
||||
|
||||
logging.info(result)
|
||||
|
||||
logging.info('Sign in complete!')
|
||||
except Exception as e:
|
||||
logging.info(result)
|
||||
|
||||
exit(ret)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user