|
- import pickle, os
- import logging
-
- import requests # type: ignore
-
- from ..config import VERSION
- from ..returnvalues import ReturnValue
- from ..storage import templates
- from .contact import update_local_chatrooms, update_local_friends
- from .messages import produce_msg
-
- logger = logging.getLogger('itchat')
-
- def load_hotreload(core):
- core.dump_login_status = dump_login_status
- core.load_login_status = load_login_status
-
- async def dump_login_status(self, fileDir=None):
- fileDir = fileDir or self.hotReloadDir
- try:
- with open(fileDir, 'w') as f:
- f.write('itchat - DELETE THIS')
- os.remove(fileDir)
- except:
- raise Exception('Incorrect fileDir')
- status = {
- 'version' : VERSION,
- 'loginInfo' : self.loginInfo,
- 'cookies' : self.s.cookies.get_dict(),
- 'storage' : self.storageClass.dumps()}
- with open(fileDir, 'wb') as f:
- pickle.dump(status, f)
- logger.debug('Dump login status for hot reload successfully.')
-
- async def load_login_status(self, fileDir,
- loginCallback=None, exitCallback=None):
- try:
- with open(fileDir, 'rb') as f:
- j = pickle.load(f)
- except Exception as e:
- logger.debug('No such file, loading login status failed.')
- return ReturnValue({'BaseResponse': {
- 'ErrMsg': 'No such file, loading login status failed.',
- 'Ret': -1002, }})
-
- if j.get('version', '') != VERSION:
- logger.debug(('you have updated itchat from %s to %s, ' +
- 'so cached status is ignored') % (
- j.get('version', 'old version'), VERSION))
- return ReturnValue({'BaseResponse': {
- 'ErrMsg': 'cached status ignored because of version',
- 'Ret': -1005, }})
- self.loginInfo = j['loginInfo']
- self.loginInfo['User'] = templates.User(self.loginInfo['User'])
- self.loginInfo['User'].core = self
- self.s.cookies = requests.utils.cookiejar_from_dict(j['cookies'])
- self.storageClass.loads(j['storage'])
- try:
- msgList, contactList = self.get_msg()
- except:
- msgList = contactList = None
- if (msgList or contactList) is None:
- self.logout()
- await load_last_login_status(self.s, j['cookies'])
- logger.debug('server refused, loading login status failed.')
- return ReturnValue({'BaseResponse': {
- 'ErrMsg': 'server refused, loading login status failed.',
- 'Ret': -1003, }})
- else:
- if contactList:
- for contact in contactList:
- if '@@' in contact['UserName']:
- update_local_chatrooms(self, [contact])
- else:
- update_local_friends(self, [contact])
- if msgList:
- msgList = produce_msg(self, msgList)
- for msg in msgList: self.msgList.put(msg)
- await self.start_receiving(exitCallback)
- logger.debug('loading login status succeeded.')
- if hasattr(loginCallback, '__call__'):
- await loginCallback(self.storageClass.userName)
- return ReturnValue({'BaseResponse': {
- 'ErrMsg': 'loading login status succeeded.',
- 'Ret': 0, }})
-
- async def load_last_login_status(session, cookiesDict):
- try:
- session.cookies = requests.utils.cookiejar_from_dict({
- 'webwxuvid': cookiesDict['webwxuvid'],
- 'webwx_auth_ticket': cookiesDict['webwx_auth_ticket'],
- 'login_frequency': '2',
- 'last_wxuin': cookiesDict['wxuin'],
- 'wxloadtime': cookiesDict['wxloadtime'] + '_expired',
- 'wxpluginkey': cookiesDict['wxloadtime'],
- 'wxuin': cookiesDict['wxuin'],
- 'mm_lang': 'zh_CN',
- 'MM_WX_NOTIFY_STATE': '1',
- 'MM_WX_SOUND_STATE': '1', })
- except:
- logger.info('Load status for push login failed, we may have experienced a cookies change.')
- logger.info('If you are using the newest version of itchat, you may report a bug.')
|