当前位置: 首页 > 后端技术 > Python

【Python写微信防撤回脚本】结束并继续锁定撤回的消息

时间:2023-03-26 01:50:18 Python

本系列文章曾经说过,如果朋友在短时间内发送多条消息,然后撤回,将很难确定是哪条消息被撤回。猜测。后来觉得“猜”不是很Pythonic。研究了一段时间,找到了解决办法,不得不惊叹ItChat的强大。前面的解决方案之前的未定情况大概是这样的:同一个朋友在短时间内发送了多条消息。当他随机撤回一条消息时,我们无法确定他撤回了哪条消息。只能猜测他可能已经撤回了最近的一条消息并将其他消息作为备份发布。代码如下:target_msg_pattern='"{}"Amessagewaswithdrawn'.format(sender_name)ifcontent==target_msg_pattern:return_msg='[{}]Amessagewaswithdrawn:\n'.format(sender_name)iflen(log[sender_name].items())==0:return_msg='缓存信息列表为空!'else:return_msg+=log[sender_name].items()[-1][-1]+'\n'iflen(log[sender_name].items())>1:msgs=[msgfortimestamp,msginlog[sender_name].items()[:-1]]return_msg+='也可能是以下信息之一:\n'+'\n'.join(msgs)实际效果是这样的:我的强制我就是受不了这种不确定的说法。msg信息分析要判断哪条信息被撤回,首先要熟悉正常msg和撤回msg中包含的信息,以及它们的异同。让我们看看这两种情况下的msg是什么样子的。不用仔细看每一行,后面我们会具体分析。首先使用机器人“小帮帮”发送的msg信息:{'MsgId':'2018511155698964390','FromUserName':'@************f511363f8200853d724137bb31236a7ea81e5183cc06cb4ec978e3','ToUserName':@**********c2e61fdb47b5c241553a2f','MsgType':1,'Content':'msg里有什么?','Status':3,'ImgStatus':1,'CreateTime':1578069291,'VoiceLength':0,'PlayLength':0,'FileName':'','FileSize':'','MediaId':'','Url':'','AppMsgType':0,'StatusNotifyCode':0,'StatusNotifyUserName':'','RecommendInfo':{'UserName':'','NickName':'','QQNum':0,'省份':'','城市':'','内容':'','签名':'','别名':'','场景':0,'VerifyFlag':0,'AttrStatus':0,'Sex':0,'Ticket':'','OpCode':0},'ForwardFlag':0,'AppInfo':{'AppID':'','Type':0},'HasProductId':0,'Ticket':'','ImgHeight':0,'ImgWidth':0,'SubMsgType':0,'NewMsgId':2018511155698964390,'OriContent':'','EncryFileName':'','User':<用户:{'MemberList':,'Uin':0,'UserName':'@************f511363f8200853d724137bb31236a7ea81e5183cc06cb4ec978e3','NickName':'小帮手','HeadImgUrl':'/cgi-bin/mmwebwx-bin/webwxgeticon?seq=699837854&username=@**********f511363f8200853d724137bb31236a7ea81e5183cc06cb4ec978e3&skey=@crypt_****c00c_92668c8ba7d285c221a85e',t*********f4,t'conact******'4MemberCount':0,'RemarkName':'小帮手','HideInputBarFlag':0,'Sex':2,'Signature':'','VerifyFlag':0,'OwnerUin':0,'PYInitial':'XBB','PYQuanPin':'xiaobangbang','RemarkPYInitial':'XBB','RemarkPYQuanPin':'xiaobangbang','StarFriend':0,'AppAccountFlag':0,'Statues':0,'AttrStatus':33658937,'Province':'浙江','City':'台州','Alias':'','SnsFlag':17,'UniFriend':0,'DisplayName':'','ChatRoomId':0,'KeyWord':'','EncryChatRoomId':'','IsOwner':0}>,'Type':'Text','Text':'msg中有什么?'}下面是机器人提取刚才信息的msg信息:{'MsgId':'4056955577161654067','FromUserName':'@************f511363f8200853d724137bb31236a7ea81e5183cc06cb4ec978e3','ToUserName':'@**UserName':'@***********c2e61fdb47b5c241553a2f','MsgType':10002,'Content':'wxid_4gngrr04aqjn2111237219562018511155698964390','Status':4,'ImgStatus':1,'CreateTime':1578069381,'VoiceLength':0,'PlayLength':0,'FileName':'','FileSize':'','MediaId':'','Url':'','AppMsgType':0,'StatusNotifyCode':0,'StatusNotifyUserName':'','RecommendInfo':{'UserName':'','昵称':'','QQ号码':0,'省份':'','城市':'','内容':'','签名':'','别名':'','Scene':0,'VerifyFlag':0,'AttrStatus':0,'Sex':0,'Ticket':'','OpCode':0},'ForwardFlag':0,'AppInfo':{'AppID':'','Type':0},'HasProductId':0,'Ticket':'','ImgHeight':0,'ImgWidth':0,'SubMsgType':0,'NewMsgId':4056955577161654067,'OriContent':'','EncryFileName':'','User':,'Uin':0,'UserName':'@**********f511363f8200853d724137bb31236a7ea81e5183cc06cb4ec978e3','NickName':'小帮帮','HeadImgUrl':'/cgi-bin/mmwebwx-bin/webwxgeticon?seq=699837854&username=@**********f511363f8200853d724137bb31236a7ea81e5183cc06cb4ec978e3&skey=@crypt_****c00c_92668c8ba7d285c221a85e**********','Contact2049','MemberFlag':0,'RemarkName':'Xiaobangbang','HideInputBarFlag':0,'Sex':2,'Signature':'','VerifyFlag':0,'OwnerUin':0,'PYInitial':'XBB','PYQuanPin':'xiaobangbang','RemarkPYInitial':'XBB','RemarkPYQuanPin':'xiaobangbang','StarFriend':0,'AppAccountFlag':0,'Statues':0,'AttrStatus':33658937,'Province':'浙江','城市':'台州','别名':'','SnsFlag':17,'UniFriend':0,'DisplayName':'','ChatRoomId':0,'KeyWord':'','EncryChatRoomId':'','IsOwner':0}>,'Type':'Note','Text':'"小帮帮"撤回了一条消息'}得到了两种类型的msg,如下是对比(高亮部分为区别,部分相同内容省略可以点击放大查看大图):下面我们来分析一些关键信息:MsgId(同下NewMsgId)消息编号。这很容易理解。每条消息都通过一个唯一的编号与其他消息区分开来,因此两条消息具有不同的编号是正常的。如果我们能拿到好友撤回消息的号码,我们也可以锁定这条消息。MsgType(与下面的Type相同)消息类型。如下图,左边是普通的对话信息,右边类似系统提示信息。是否可以根据这条消息判断好友是否撤回了消息?Content消息内容,注意与下方正文区分开来。两种消息类型在内容上最大的区别可能就在这里。我们看一下召回消息的内容(为了便于查看,格式化了):wxid_4gngrr04aqjn2111237219562018511155698964390一眼就能找到重点:被撤回的那条消息属于系统消息(sysmsg),类型为撤销消息(revokemsg),对应的消息编号为2018511155698964390。细心的读者发现,这个消息编号正是左边消息的编号。通过这个推理,推测Content字段是系统内部传输的内容,而Text字段是用户看到的内容。判断消息类型根据上面的分析,有3个地方可以帮助判断收到的消息是否是撤回消息:如果MsgType为1,则为普通消息,如果为10002,则可能为撤回消息.如果Content中包含type="revokemsg",则可能是撤销消息,否则不是撤销消息。如果Type为Text,则为普通消息,如果为Note,则可能为撤回消息。准确地说,一条消息必须同时满足以上三个条件,才能被视为撤回消息。锁定和撤回消息由于需要MsgId来确定锁定和撤回消息,所以存储临时消息时需要添加该字段。log[sender_name][cur_timestamp]=msg['MsgId']+'|||'+content为了简化数据复杂度,我直接通过分隔符|||在前面加上MsgId。所以,锁定和发送撤销消息的代码是这样的:content=str(msg['Text'])revoke_info=msg['Content']print('{},{}sentmessage:{}'.format(formatted_timestamp,sender_name,content))target_msg_pattern='"{}"收回消息'.format(sender_name)iftarget_msg_pattern==contentandmsg['Type']=='Note'andstr(msg['MsgType'])=='10002'and'type="revokemsg"'inrevoke_info:return_msg=''return_msg_head='{},[{}]撤回消息:\n'.format(formatted_timestamp,sender_name)revoke_msg_id=revoke_info.split('')[-1].split('')[0]for_,valueinlog[sender_name].items():ifvalue.split('|||')[0]==revoke_msg_id:return_msg=value.split('|||')[1]ifreturn_msg=='':return_msg='缓存信息列表为空!'return_msg=return_msg_head+return_msgprint(return_msg)itchat.send_msg(return_msg,'filehelper')测试一下,为了方便查看,直接给机器人“小棒棒”发送退出提醒(传送图在掘金上不会上传,需要的可以去这里看动画版):一个完美的微信防提现脚本就完成了!结语Python有很多好用好玩的库,可以慢慢发现。本期我们使用ItChat库编写一个微信防提现脚本。其实ItChat的功能远不止这些。它还可以处理微信群消息和其他各种类型的消息。我们所谈的只是九牛一毛,更多的还需要你自己去探索。这是本系列的结尾。如果你想了解更多通讯方面的知识,可以在公众号主页联系我。本系列的代码在这里:https://github.com/TitusWongCN/AntiInfoWithdrawal如果你想知道什么,或者你想做什么,可以在文末留言,说不定你会做待会~不管你在后记写什么,都希望能和更多的人交流。如果您有任何问题或需求,欢迎随时交流。我所有的项目源码都会放在下面的github仓库,有需要的可以参考,有问题请指正,谢谢!https://github.com/TitusWongCN/【Python写微信防退脚本】往期推荐:第一阶段:【Python写微信防退脚本】01熟悉ItChat库第二阶段:【Python写微信防撤回脚本]02接收聊天记录Phase3:【Python编写微信防撤回脚本】03获取撤回信息并整理Phase4:【Python编写微信防撤回脚本】04完成发送撤回消息以下是我的公众号,有兴趣的可以扫一扫: