11
11
import itchat
12
12
import magic
13
13
import xmltodict
14
+ from pyqrcode import QRCode
14
15
from PIL import Image
15
16
16
17
import config
@@ -41,7 +42,8 @@ def wrap_func(self, msg, *args, **kwargs):
41
42
logger .debug ("Group chat" )
42
43
if me :
43
44
msg ['ActualUserName' ] = msg ['ToUserName' ]
44
- member = {"NickName" : self .itchat .loginInfo ['User' ]['NickName' ], "DisplayName" : "You" ,
45
+ member = {"NickName" : self ._wechat_html_unescape (self .itchat .loginInfo ['User' ]['NickName' ]),
46
+ "DisplayName" : "You" ,
45
47
"Uin" : self .itchat .loginInfo ['User' ]['Uin' ]}
46
48
else :
47
49
logger .debug ("search_user" )
@@ -53,16 +55,16 @@ def wrap_func(self, msg, *args, **kwargs):
53
55
'name' : html .unescape (FromUser ['NickName' ]),
54
56
'alias' : html .unescape (FromUser ['RemarkName' ] or FromUser ['NickName' ]),
55
57
'uid' : self .get_uid (UserName = msg .get ('FromUserName' , None ),
56
- NickName = html . unescape (FromUser .get ('NickName' , "s" )),
57
- alias = html . unescape (FromUser .get ('RemarkName' , "s" )),
58
+ NickName = self . _wechat_html_unescape (FromUser .get ('NickName' , "s" )),
59
+ alias = self . _wechat_html_unescape (FromUser .get ('RemarkName' , "s" )),
58
60
Uin = FromUser .get ('Uin' , None ))
59
61
}
60
62
mobj .member = {
61
- 'name' : html . unescape (member ['NickName' ]),
62
- 'alias' : html . unescape (member ['DisplayName' ]),
63
+ 'name' : self . _wechat_html_unescape (member ['NickName' ]),
64
+ 'alias' : self . _wechat_html_unescape (member ['DisplayName' ]),
63
65
'uid' : self .get_uid (UserName = msg .get ('ActualUserName' , None ),
64
- NickName = html . unescape (member .get ('NickName' , "" )),
65
- alias = html . unescape (member .get ('DisplayName' , "" )),
66
+ NickName = self . _wechat_html_unescape (member .get ('NickName' , "" )),
67
+ alias = self . _wechat_html_unescape (member .get ('DisplayName' , "" )),
66
68
Uin = member .get ('Uin' , None ))
67
69
}
68
70
logger .debug ("origin: %s\n member: %s\n " , mobj .origin , mobj .member )
@@ -72,16 +74,16 @@ def wrap_func(self, msg, *args, **kwargs):
72
74
mobj .text = "You: " + mobj .text
73
75
mobj .source = MsgSource .User
74
76
mobj .origin = {
75
- 'name' : html . unescape (FromUser ['NickName' ]),
76
- 'alias' : html . unescape (FromUser ['RemarkName' ] or FromUser ['NickName' ]),
77
+ 'name' : self . _wechat_html_unescape (FromUser ['NickName' ]),
78
+ 'alias' : self . _wechat_html_unescape (FromUser ['RemarkName' ] or FromUser ['NickName' ]),
77
79
'uid' : self .get_uid (UserName = msg .get ('FromUserName' , None ),
78
- NickName = html . unescape (FromUser .get ('NickName' , "" )),
79
- alias = html . unescape (FromUser .get ('RemarkName' , "" )),
80
+ NickName = self . _wechat_html_unescape (FromUser .get ('NickName' , "" )),
81
+ alias = self . _wechat_html_unescape (FromUser .get ('RemarkName' , "" )),
80
82
Uin = FromUser .get ('Uin' , None ))
81
83
}
82
84
mobj .destination = {
83
- 'name' : self .itchat .loginInfo ['User' ]['NickName' ],
84
- 'alias' : self .itchat .loginInfo ['User' ]['NickName' ],
85
+ 'name' : self ._wechat_html_unescape ( self . itchat .loginInfo ['User' ]['NickName' ]) ,
86
+ 'alias' : self ._wechat_html_unescape ( self . itchat .loginInfo ['User' ]['NickName' ]) ,
85
87
'uid' : self .get_uid (UserName = msg ['ToUserName' ])
86
88
}
87
89
logger .debug ("dest: %s" , mobj .destination )
@@ -144,16 +146,8 @@ def console_qr_code(self, uuid, status, qrcode):
144
146
if status == 408 :
145
147
QR += "Previous code expired. Please scan the new one.\n "
146
148
QR += "\n "
147
- time .sleep (0.5 )
148
- img = Image .open (io .BytesIO (qrcode )).convert ("1" )
149
- img = img .resize ((img .size [0 ] // 10 , img .size [1 ] // 10 ))
150
- for i in range (img .size [0 ]):
151
- for j in range (img .size [1 ]):
152
- if img .getpixel ((i , j )) > 0 :
153
- QR += "\x1b [7m \x1b [0m"
154
- else :
155
- QR += "\x1b [49m \x1b [0m"
156
- QR += "\n "
149
+ qr_url = "https://login.weixin.qq.com/l/" + uuid
150
+ QR += QRCode (qr_url ).terminal ()
157
151
QR += "\n If you cannot read the QR code above, " \
158
152
"please visit the following URL:\n " \
159
153
"https://login.weixin.qq.com/qrcode/" + uuid
@@ -183,8 +177,8 @@ def master_qr_code(self, uuid, status, qrcode):
183
177
os .makedirs (path )
184
178
path = os .path .join (path , 'QR-%s.jpg' % int (time .time ()))
185
179
self .logger .debug ("master_qr_code file path: %s" , path )
186
- with open ( path , 'wb' ) as f :
187
- f . write ( qrcode )
180
+ qr_url = "https://login.weixin.qq.com/l/" + uuid
181
+ QRCode ( qr_url ). png ( path , scale = 10 )
188
182
msg .text = 'Scan this QR Code with WeChat to continue.'
189
183
msg .path = path
190
184
msg .file = open (path , 'rb' )
@@ -329,34 +323,40 @@ def search_user(self, UserName=None, uid=None, uin=None, name=None, ActualUserNa
329
323
"Uin" : sys_chat_id }]
330
324
331
325
for i in self .itchat .get_friends (refresh ) + self .itchat .get_mps (refresh ):
332
- data = {"nickname" : i .get ('NickName' , None ),
333
- "alias" : i .get ("RemarkName" , None ),
326
+ data = {"nickname" : self . _wechat_html_unescape ( i .get ('NickName' , None ) ),
327
+ "alias" : self . _wechat_html_unescape ( i .get ("RemarkName" , None ) ),
334
328
"uin" : i .get ("Uin" , None )}
335
329
if self .encode_uid (data ) == uid or \
336
330
str (i .get ('UserName' , '' )) == UserName or \
337
331
str (i .get ('AttrStatus' , '' )) == uid or \
338
332
str (i .get ('Uin' , '' )) == uin or \
339
333
str (i .get ('NickName' , '' )) == name or \
340
334
str (i .get ('DisplayName' , '' )) == name :
335
+ i ['NickName' ] = self ._wechat_html_unescape (i .get ('NickName' , '' ))
336
+ i ['DisplayName' ] = self ._wechat_html_unescape (i .get ('DisplayName' , '' ))
341
337
result .append (i .copy ())
342
338
for i in self .itchat .get_chatrooms (refresh ):
343
339
if not i ['UserName' ].startswith ('@@' ):
344
340
continue
345
341
if not i .get ('MemberList' , '' ):
346
342
i = self .itchat .update_chatroom (i .get ('UserName' , '' ))
347
- data = {"nickname" : i .get ('NickName' , None ),
348
- "alias" : i .get ("RemarkName" , None ),
343
+ data = {"nickname" : self . _wechat_html_unescape ( i .get ('NickName' , None ) ),
344
+ "alias" : self . _wechat_html_unescape ( i .get ("RemarkName" , None ) ),
349
345
"uin" : i .get ("Uin" , None )}
350
346
if self .encode_uid (data ) == uid or \
351
347
str (i .get ('Uin' , '' )) == uin or \
352
348
str (i .get ('NickName' , '' )) == name or \
353
349
str (i .get ('DisplayName' , '' )) == name or \
354
350
str (i .get ('UserName' , '' )) == UserName :
351
+ i ['NickName' ] = self ._wechat_html_unescape (i .get ('NickName' , '' ))
352
+ i ['DisplayName' ] = self ._wechat_html_unescape (i .get ('DisplayName' , '' ))
355
353
result .append (i .copy ())
356
354
result [- 1 ]['MemberList' ] = []
357
355
if ActualUserName :
358
356
for j in i ['MemberList' ]:
359
357
if str (j ['UserName' ]) == ActualUserName :
358
+ j ['NickName' ] = self ._wechat_html_unescape (j .get ('NickName' , '' ))
359
+ j ['DisplayName' ] = self ._wechat_html_unescape (j .get ('DisplayName' , '' ))
360
360
result [- 1 ]['MemberList' ].append (j )
361
361
if not result and not refresh :
362
362
return self .search_user (UserName , uid , uin , name , ActualUserName , refresh = True )
@@ -726,8 +726,8 @@ def get_chat_list(self, param=""):
726
726
727
727
msg = "List of chats:\n "
728
728
for n , i in enumerate (l ):
729
- alias = i .get ('RemarkName' , '' ) or i .get ('DisplayName' , '' )
730
- name = i .get ('NickName' , '' )
729
+ alias = self . _wechat_html_unescape ( i .get ('RemarkName' , '' ) or i .get ('DisplayName' , '' ) )
730
+ name = self . _wechat_html_unescape ( i .get ('NickName' , '' ) )
731
731
x = "%s (%s)" % (alias , name ) if alias else name
732
732
msg += "\n %s: [%s] %s" % (n , x , i ['Type' ])
733
733
@@ -857,9 +857,11 @@ def get_chats(self, group=True, user=True):
857
857
r .append ({
858
858
'channel_name' : self .channel_name ,
859
859
'channel_id' : self .channel_id ,
860
- 'name' : i ['NickName' ],
861
- 'alias' : i ['RemarkName' ] or i ['NickName' ],
862
- 'uid' : self .get_uid (UserName = i ['UserName' ], NickName = i ['NickName' ], alias = i .get ("RemarkName" , None ),
860
+ 'name' : self ._wechat_html_unescape (i ['NickName' ]),
861
+ 'alias' : self ._wechat_html_unescape (i ['RemarkName' ] or i ['NickName' ]),
862
+ 'uid' : self .get_uid (UserName = i ['UserName' ],
863
+ NickName = self ._wechat_html_unescape (i ['NickName' ]),
864
+ alias = self ._wechat_html_unescape (i .get ("RemarkName" , None )),
863
865
Uin = i .get ("Uin" , None )),
864
866
'type' : MsgSource .User
865
867
})
@@ -871,9 +873,11 @@ def get_chats(self, group=True, user=True):
871
873
r .append ({
872
874
'channel_name' : self .channel_name ,
873
875
'channel_id' : self .channel_id ,
874
- 'name' : i ['NickName' ],
875
- 'alias' : i ['RemarkName' ] or i ['NickName' ] or None ,
876
- 'uid' : self .get_uid (NickName = i ['NickName' ], alias = i .get ("RemarkName" , None ),
876
+ 'name' : self ._wechat_html_unescape (i ['NickName' ]),
877
+ 'alias' : self ._wechat_html_unescape (i ['RemarkName' ] or i ['NickName' ]),
878
+ 'uid' : self .get_uid (UserName = i ['UserName' ],
879
+ NickName = self ._wechat_html_unescape (i ['NickName' ]),
880
+ alias = self ._wechat_html_unescape (i .get ("RemarkName" , None )),
877
881
Uin = i .get ("Uin" , None )),
878
882
'type' : MsgSource .Group
879
883
})
@@ -968,3 +972,18 @@ def _itchat_send_video(self, *args, **kwargs):
968
972
return self .itchat .send_video (* args , ** kwargs )
969
973
except Exception as e :
970
974
raise EFBMessageError (repr (e ))
975
+
976
+ @staticmethod
977
+ def _wechat_html_unescape (content ):
978
+ """
979
+ Unescape a WeChat HTML string.
980
+
981
+ Args:
982
+ content (str): String to be formatted
983
+
984
+ Returns:
985
+ str: Unescaped string.
986
+ """
987
+ d = {"Content" : content }
988
+ itchat .utils .msg_formatter (d , "Content" )
989
+ return d ['Content' ]
0 commit comments