20
20
21
21
22
22
def incomeMsgMeta (func ):
23
- def wcFunc (self , msg , isGroupChat = False ):
23
+ def wcFunc (self , * args , ** kwargs ):
24
+ msg = args [0 ]
25
+ isGroupChat = kwargs .get ("isGroupChat" , False )
24
26
logger = logging .getLogger ("plugins.%s.incomeMsgMeta" % self .channel_id )
25
- mobj = func (self , msg , isGroupChat )
27
+ logger .debug ("Raw message: %s" % repr (msg ))
28
+ mobj = func (self , * args , ** kwargs )
29
+ if mobj is None :
30
+ return
26
31
mobj .uid = msg .get ("MsgId" , time .time ())
27
32
me = msg ['FromUserName' ] == self .itchat .loginInfo ['User' ]['UserName' ]
28
33
logger .debug ("me, %s" , me )
29
34
if me :
30
35
msg ['FromUserName' ], msg ['ToUserName' ] = msg ['ToUserName' ], msg ['FromUserName' ]
31
36
FromUser = self .search_user (UserName = msg ['FromUserName' ]) or \
32
- self .search_user (UserName = msg ['FromUserName' ], refresh = True ) or \
33
- [{"NickName" : "Chat not found. (UE01)" , "RemarkName" : "Chat not found. (UE01)" , "Uin" : 0 }]
37
+ self .search_user (UserName = msg ['FromUserName' ], refresh = True ) or \
38
+ [{"NickName" : "Chat not found. (UE01)" , "RemarkName" : "Chat not found. (UE01)" , "Uin" : 0 }]
34
39
FromUser = FromUser [0 ]
35
40
logger .debug ("From user, %s" , FromUser )
36
41
if isGroupChat :
37
- logger .debug ("groupchat " )
42
+ logger .debug ("Group chat " )
38
43
if me :
39
44
msg ['ActualUserName' ] = msg ['ToUserName' ]
40
45
member = {"NickName" : self .itchat .loginInfo ['User' ]['NickName' ], "DisplayName" : "You" , "Uin" : self .itchat .loginInfo ['User' ]['Uin' ]}
@@ -464,9 +469,12 @@ def wcSysLog(msg):
464
469
465
470
@incomeMsgMeta
466
471
def textMsg (self , msg , isGroupChat = False ):
467
- self .logger .info ("TextMsg!!!\n ---" )
472
+ if msg ['FromUserName' ] == "newsapp" and msg ['Content' ].startswith ("<mmreader>" ):
473
+ self .newsapp_msg (msg )
474
+ return
468
475
if msg ['Text' ].startswith ("http://weixin.qq.com/cgi-bin/redirectforward?args=" ):
469
- return self .locationMsg (msg , isGroupChat )
476
+ self .locationMsg (msg , isGroupChat )
477
+ return
470
478
mobj = EFBMsg (self )
471
479
mobj .text = msg ['Text' ]
472
480
mobj .type = MsgType .Text
@@ -495,8 +503,8 @@ def linkMsg(self, msg, isGroupChat=False):
495
503
mobj = EFBMsg (self )
496
504
# parse XML
497
505
itchat .utils .emoji_formatter (msg , 'Content' )
498
- xmldata = msg ['Content' ]
499
- data = xmltodict .parse (xmldata )
506
+ xml_data = msg ['Content' ]
507
+ data = xmltodict .parse (xml_data )
500
508
# set attributes
501
509
mobj .attributes = {
502
510
"title" : data ['msg' ]['appmsg' ]['title' ],
@@ -515,10 +523,34 @@ def linkMsg(self, msg, isGroupChat=False):
515
523
extra_link = data .get ('msg' , {}).get ('appmsg' , {}).get ('mmreader' , {}).get ('category' , {}).get ('item' , [])
516
524
if type (extra_link ) is list and len (extra_link ):
517
525
for i in extra_link :
518
- mobj .text += "🔗 %s\n %s\n %s\n 🖼 %s\n \n " % (i ['title' ], i ['digest' ], i ['url' ], i ['cover' ])
526
+ # mobj.text += "🔗 %s\n%s\n%s\n🖼 %s\n\n" % (i['title'], i['digest'], i['url'], i['cover'])
527
+ self .raw_linkMsg (msg , i ['title' ], i ['digest' ], i ['cover' ], i ['url' ])
528
+ return
519
529
mobj .type = MsgType .Link
520
530
return mobj
521
531
532
+ @incomeMsgMeta
533
+ def raw_linkMsg (self , msg , title , description , image , url ):
534
+ mobj = EFBMsg (self )
535
+ mobj .type = MsgType .Link
536
+ mobj .attributes = {
537
+ "title" : title ,
538
+ "description" : description ,
539
+ "image" : image ,
540
+ "url" : url
541
+ }
542
+
543
+ return mobj
544
+
545
+ def newsapp_msg (self , msg ):
546
+ data = xmltodict .parse (msg ['Content' ])
547
+ news = data .get ('mmreader' , {}).get ('category' , {}).get ('newitem' , [])
548
+ if news :
549
+ self .raw_linkMsg (msg , news [0 ]['title' ], news [0 ]['digest' ], news [0 ]['cover' ], news [0 ]['shorturl' ])
550
+ if self ._flag ("extra_links_on_message" , False ):
551
+ for i in news [1 :]:
552
+ self .raw_linkMsg (msg , i ['title' ], i ['digest' ], i ['cover' ], i ['shorturl' ])
553
+
522
554
@incomeMsgMeta
523
555
def pictureMsg (self , msg , isGroupChat = False ):
524
556
mobj = EFBMsg (self )
@@ -630,7 +662,7 @@ def save_file(self, msg, msg_type):
630
662
self .logger .warning ("File %s with mime %s has no matching extensions." , fullpath , mime )
631
663
ext = ".jpeg" if mime == "image/jpeg" else guess_ext
632
664
os .rename (fullpath , "%s%s" % (fullpath , ext ))
633
- fullpath = "%s. %s" % (fullpath , ext )
665
+ fullpath = "%s%s" % (fullpath , ext )
634
666
self .logger .info ("File saved from WeChat\n Full path: %s\n MIME: %s" , fullpath , mime )
635
667
return fullpath , mime
636
668
@@ -716,9 +748,9 @@ def send_message(self, msg):
716
748
pass
717
749
elif msg .type in (MsgType .File , MsgType .Audio ):
718
750
self .logger .info ("Sending %s to WeChat\n FileName: %s\n Path: %s\n Filename: %s" , msg .type , msg .text , msg .path , msg .filename )
719
- r = self ._itchat_send_file (msg .path , UserName , filename = msg .filename )
751
+ r = self ._itchat_send_file (msg .path , toUserName = UserName , filename = msg .filename )
720
752
if msg .text :
721
- self ._itchat_send_msg (msg .text , UserName )
753
+ self ._itchat_send_msg (msg .text , toUserName = UserName )
722
754
os .remove (msg .path )
723
755
elif msg .type == MsgType .Video :
724
756
self .logger .info ("Sending video to WeChat\n FileName: %s\n Path: %s" , msg .text , msg .path )
@@ -943,8 +975,46 @@ def _itchat_send_msg(self, *args, **kwargs):
943
975
raise EFBMessageError (repr (e ))
944
976
945
977
def _itchat_send_file (self , * args , ** kwargs ):
978
+ def _itchat_send_fn (self , fileDir , toUserName = None , mediaId = None , filename = None ):
979
+ from itchat .returnvalues import ReturnValue
980
+ from itchat import config
981
+ import os , time , json
982
+ if toUserName is None : toUserName = self .storageClass .userName
983
+ if mediaId is None :
984
+ r = self .upload_file (fileDir )
985
+ if r :
986
+ mediaId = r ['MediaId' ]
987
+ else :
988
+ return r
989
+ fn = filename or os .path .basename (fileDir )
990
+ url = '%s/webwxsendappmsg?fun=async&f=json' % self .loginInfo ['url' ]
991
+ data = {
992
+ 'BaseRequest' : self .loginInfo ['BaseRequest' ],
993
+ 'Msg' : {
994
+ 'Type' : 6 ,
995
+ 'Content' : ("<appmsg appid='wxeb7ec651dd0aefa9' sdkver=''><title>%s</title>" % fn +
996
+ "<des></des><action></action><type>6</type><content></content><url></url><lowurl></lowurl>" +
997
+ "<appattach><totallen>%s</totallen><attachid>%s</attachid>" % (
998
+ str (os .path .getsize (fileDir )), mediaId ) +
999
+ "<fileext>%s</fileext></appattach><extinfo></extinfo></appmsg>" % fn [1 ].replace ('.' , '' )),
1000
+ 'FromUserName' : self .storageClass .userName ,
1001
+ 'ToUserName' : toUserName ,
1002
+ 'LocalID' : int (time .time () * 1e4 ),
1003
+ 'ClientMsgId' : int (time .time () * 1e4 ), },
1004
+ 'Scene' : 0 , }
1005
+ headers = {
1006
+ 'User-Agent' : config .USER_AGENT ,
1007
+ 'Content-Type' : 'application/json;charset=UTF-8' , }
1008
+ r = self .s .post (url , headers = headers ,
1009
+ data = json .dumps (data , ensure_ascii = False ).encode ('utf8' ))
1010
+ return ReturnValue (rawResponse = r )
1011
+
946
1012
try :
947
- return self .itchat .send_file (* args , ** kwargs )
1013
+ fn = kwargs .get ("filename" , None )
1014
+ if fn is not None :
1015
+ return _itchat_send_fn (self .itchat , * args , ** kwargs )
1016
+ else :
1017
+ return self .itchat .send_file (* args , ** kwargs )
948
1018
except Exception as e :
949
1019
raise EFBMessageError (repr (e ))
950
1020
0 commit comments