不知道大家昨天是怎么过年的,反正我吃的很好。看着我懒洋洋的小肚子瘫软在那里,我想起了我在2019年初给自己定下的锻炼计划几乎没有执行。我在2020年的计划中写下了每周锻炼4次的宏伟目标,哈哈,去的不是劝的,来的还是追的。在新的一年里,祝大家工作生活顺利。这不是一篇总结性的文章,所以题外话我就不多说了。上一期我们知道了如何记录好友发来的消息。在这里我们将看到如何知道哪些消息已被撤消并将它们转发给“文件传输助手”。优化缓存机制之前我们将好友发送的所有信息都存储到一个名为log的字典对象中,以免错过好友的任何一条消息。但是里面存了那么多信息,没办法一一分析是不是被撤掉的信息,必须想办法挑选有用的信息。值得一提的是,微信的撤回机制有一个规定,用户只能在2分钟内撤回自己发送的消息。因此,相对于每次收到信息的时刻,2分钟前日志中的信息是不能撤回的。这些信息都是无用的信息,完全可以删除,也避免了由于信息占用内存过多而导致无法分析过多信息内容而降低程序运行效率的问题。删除的方法也很简单,因为朋友的每一条消息的key都是收到消息的时刻的时间戳,这也是为什么前面设计的原因:这个字典使用的是时刻的时间戳当接收到消息作为key时,将时间戳对应的信息内容作为value。这样的设计使得以后更容易找到撤回的消息。importcopydefdel_overdue_msg(cur_timestamp):log_copy=copy.deepcopy(log)forfriendinlog_copy:fortimestampinlog_copy[friend]:ifcur_timestamp-timestamp>2.01*60:log[friend].pop(timestamp)因为它不能looped改变字典时,先复制,再处理。注意一定要引入copy包。代码中设计的时间间隔为2.01分钟,预留一定的缓冲,避免因程序运行原因遗漏任何消息。为了简化代码,把这段代码拿出来单独写成一个方法,每次收到消息的时候调用。@itchat.msg_register([TEXT,MAP,CARD,NOTE,SHARING])deftext_reply(msg):cur_timestamp=time.time()del_overdue_msg(cur_timestamp)...生成召回消息就会进入我们的程序,就像之前控制台的截图一样:此时程序判断的消息发送者是撤回消息的好友的昵称,消息的格式是固定的:msg_pattern='"{}"一条消息被撤回了'.format(sender_name)如果收到的消息内容符合此格式,则可以确定好友已撤回消息(不管好友是否发送了相同的消息故意的,这真的无法处理)。但是可能朋友在短时间内发送了多条消息,如何判断是哪一条呢?据我所知,当有多个暂存消息时,无法唯一确定撤回哪条消息。不过,按道理来说,普遍被撤回的消息,最有可能是最新的消息。在不确定的情况下,可以先显示最新的,其余的消息以后作为备选。还有一点需要注意。一个朋友可能会连续撤回几条消息,所以程序中已经作为撤回消息返回的部分不能立即从内存中删除,以免找到真正撤回的消息。在整个处理过程中,临时存储的消息只会在前面提到的“2分钟”逻辑下被删除。有了策略,你就可以开始编码了: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)下面是实际效果:机器人“小帮”发了一条消息:控制台给出输出:机器人撤回消息:控制台给出撤回的消息内容:如果有多个连续的消息,是这样的:控制台显示撤回的第一条消息是received一个消息控制台显示可能的撤回retracted第二个消息控制台显示可能的撤回就是这样。下一期的预告本来打算今天就完结的,但是这一期太长了,估计要费一番功夫才能完结。因此,下一期我们会将撤回消息的排??序文本发送至“文件传输助手”,以便我们及时了解谁撤回了哪些可耻的消息。后记不管写什么,都希望能和更多的人交流。如果您有任何问题或需求,欢迎随时交流。我所有的项目源码都会放在下面的github仓库,有需要的可以参考,有问题请指正,谢谢!本文代码:https://github.com/TitusWongCN/AntiInfoWithdrawal所有代码:https://github.com/TitusWongCN/【Python写微信防提现脚本】往期推荐:第一期:【Python写微信防提现脚本】退出脚本】】01熟悉ItChat库第二期:【Python编写微信防退出脚本】02接收记录的聊天信息以下是我的公众号,有兴趣的可以扫一扫:
