1- import os , sys , time , re
1+ import os , sys , time , re , io
22import threading
33import json , xml .dom .minidom
44import copy , pickle , random
@@ -24,7 +24,7 @@ def load_login(core):
2424 core .get_msg = get_msg
2525 core .logout = logout
2626
27- def login (self , enableCmdQR = False , picDir = None ,
27+ def login (self , enableCmdQR = False , picDir = None , qrCallback = None ,
2828 loginCallback = None , exitCallback = None ):
2929 if self .alive :
3030 logger .debug ('itchat has already logged in.' )
@@ -34,19 +34,28 @@ def login(self, enableCmdQR=False, picDir=None,
3434 logger .info ('Getting uuid of QR code.' )
3535 while not self .get_QRuuid (): time .sleep (1 )
3636 logger .info ('Downloading QR code.' )
37- if self .get_QR (enableCmdQR = enableCmdQR , picDir = picDir ):
37+ qrStorage = self .get_QR (enableCmdQR = enableCmdQR ,
38+ picDir = picDir , qrCallback = qrCallback )
39+ if qrStorage :
3840 break
3941 elif 9 == getCount :
4042 logger .info ('Failed to get QR code, please restart the program.' )
4143 sys .exit ()
4244 logger .info ('Please scan the QR code to log in.' )
43- status = self .check_login ()
44- if status == '201' :
45- logger .info ('Please press confirm on your phone.' )
46- while status == '201' :
47- status = self .check_login ()
48- time .sleep (1 )
49- if status == '200' : break
45+ isLoggedIn = False
46+ while not isLoggedIn :
47+ status = self .check_login ()
48+ if hasattr (qrCallback , '__call__' ):
49+ qrCallback (uuid = self .uuid , status = status , qrcode = qrStorage .getvalue ())
50+ if status == '200' :
51+ isLoggedIn = True
52+ elif status == '201' :
53+ if isLoggedIn is not None :
54+ logger .info ('Please press confirm on your phone.' )
55+ isLoggedIn = None
56+ elif status != '408' :
57+ break
58+ if isLoggedIn : break
5059 logger .info ('Log in time out, reloading QR code' )
5160 self .web_init ()
5261 self .show_mobile_login ()
@@ -72,39 +81,43 @@ def get_QRuuid(self):
7281 self .uuid = data .group (2 )
7382 return self .uuid
7483
75- def get_QR (self , uuid = None , enableCmdQR = False , picDir = None ):
84+ def get_QR (self , uuid = None , enableCmdQR = False , picDir = None , qrCallback = None ):
85+ uuid = uuid or self .uuid
86+ picDir = picDir or config .DEFAULT_QR
87+ url = '%s/qrcode/%s' % (config .BASE_URL , uuid )
88+ headers = { 'User-Agent' : config .USER_AGENT }
7689 try :
77- uuid = uuid or self .uuid
78- picDir = picDir or config .DEFAULT_QR
79- url = '%s/qrcode/%s' % (config .BASE_URL , uuid )
80- headers = { 'User-Agent' : config .USER_AGENT }
8190 r = self .s .get (url , stream = True , headers = headers )
82- with open (picDir , 'wb' ) as f : f .write (r .content )
8391 except :
8492 return False
85- if enableCmdQR :
86- utils .print_cmd_qr (picDir , enableCmdQR = enableCmdQR )
93+ qrStorage = io .BytesIO (r .content )
94+ if hasattr (qrCallback , '__call__' ):
95+ qrCallback (uuid = uuid , status = '0' , qrcode = qrStorage .getvalue ())
8796 else :
88- utils .print_qr (picDir )
89- return True
97+ with open (picDir , 'wb' ) as f : f .write (r .content )
98+ if enableCmdQR :
99+ utils .print_cmd_qr (picDir , enableCmdQR = enableCmdQR )
100+ else :
101+ utils .print_qr (picDir )
102+ return qrStorage
90103
91104def check_login (self , uuid = None ):
92105 uuid = uuid or self .uuid
93106 url = '%s/cgi-bin/mmwebwx-bin/login' % config .BASE_URL
94- params = 'tip=1&uuid=%s&_=%s' % (uuid , int (time .time ()))
107+ localTime = int (time .time ())
108+ params = 'loginicon=true&uuid=%s&tip=0&r=%s&_=%s' % (
109+ uuid , localTime / 1579 , localTime )
95110 headers = { 'User-Agent' : config .USER_AGENT }
96111 r = self .s .get (url , params = params , headers = headers )
97112 regx = r'window.code=(\d+)'
98113 data = re .search (regx , r .text )
99114 if data and data .group (1 ) == '200' :
100115 process_login_info (self , r .text )
101116 return '200'
102- elif data and data .group (1 ) == '201' :
103- return '201'
104- elif data and data .group (1 ) == '408' :
105- return '408'
117+ elif data :
118+ return data .group (1 )
106119 else :
107- return '0 '
120+ return '400 '
108121
109122def process_login_info (core , loginContent ):
110123 ''' when finish login (scanning qrcode)
0 commit comments