|
import pickle, os |
|
import logging |
|
|
|
import requests |
|
|
|
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.') |
|
|