微信(WeChat)是騰訊公司于2011年1月21日推出的一款社交軟體,8年時間微信做到榷訓10億,日訊息量450億,在此期間微信也推出了不少的功能如:“搖一搖”、“漂流瓶”、“朋友圈”、“附近的人”、“公眾平臺”、“小程式”等等,涵蓋了我們生活的方方面面,微信正在慢慢踐行著他們的口號:微信,是一種生活方式,
1.前情提要
產品的更新迭代必然會伴隨著功能的推出和下線,今天我們要講的便是微信在2014年推出的一個小小的新功能:撤回訊息,使用此功能者提神醒腦、神清氣爽,但被施用者卻可能會抓耳撓腮、咬牙切齒的想知道你到底撤回了啥,這就是所謂的好奇害死貓(Curiosity kills the cat),今天我們就來用Python實作防微信訊息撤回,滿足一下大家的好奇心!


2.功能設計
我們希望當有好友或者群中有人撤回訊息的時候,第一時間能把原訊息、發送者資訊轉發到檔案助手中(當然你也可以把訊息發回給他,哈哈),這樣方便我們查看,
給大家演示一下實作的功能:

3.實作功能
3.1 微信撤回訊息實作原理
我們先來了解一下微信撤回訊息的原理:
微信撤回訊息原理就是操作者在點擊撤回的時候,客戶端會自動發一條系統訊息:“xxx撤回了一條訊息”,然后對方微信應用端收到訊息后決議,替換原訊息,改個顯示的樣式即可,
在這里給大家演示一下正常訊息和撤回訊息的內容到底有什么區別: 正常訊息:Content='你好騷啊',大家留意一下MsgId='8784390488772995470'

撤回訊息:Content是一串xml格式的內容

我們在下面把它格式化看看
<sysmsg type="revokemsg">
<revokemsg>
<session>xxx</session>
<oldmsgid>1090336364</oldmsgid>
<msgid>8784390488772995470</msgid>
<replacemsg><![CDATA["豬哥" 撤回了一條訊息]]></replacemsg>
</revokemsg></sysmsg>
分析上面撤回的Content欄位我們發現<msgid>8784390488772995470</msgid>的id與我們之前發送訊息的id是一致的,而<replacemsg>這個標簽也驗證了我們的猜想,確實是用新訊息替換原訊息,
3.2 找到被撤回訊息
根據抓取正常訊息和撤回訊息的內容我們發現規則:撤回訊息中會包含之前被撤回的那條訊息的msgid,那我們只要找到之前那條訊息就可以了,而wxpy模塊默認為我們快取了最近的200條訊息,所以我們只要遍歷這些歷史訊息然后比較msgid就可以找到被撤回的那條訊息啦!

如果你微信訊息太過頻繁,2分鐘之內訊息數量超過200(這手速不得把手機螢屏整冒煙),則可以將max_history設定大些,
3.3 轉發被撤回訊息
原理也搞懂了,被撤回的訊息也找到了,就差最后一步轉發訊息了,如果你之前玩過wxpy肯定會了吧,只要一行代碼就可以將訊息轉發:
msg.forward(bot.file_helper)
4.代碼
原理和程序講完了,代碼貼出來給大家看看,注釋還是比較詳細:

5.功能驗證

6.總結
微信訊息防撤回功能實作簡單,但實用性很好,目前專案的唯一缺點就是易用性差,簡單說就是我們還沒有將專案部署服務器,每次使用都得打開電腦然后運行還得一直開著,可以考慮后面將專案部署在云服務器上或者打包成apk,這樣就使用起來就非常方便了,而且還可以把apk發給朋友,讓朋友也體驗此功能!
感謝您的閱讀,如覺得有用請您點贊,您的鼓勵是對我的最大動力!
END
2022/11/28
本文來自博客園,作者:彭_Yu,轉載請注明原文鏈接:https://www.cnblogs.com/pyublog/p/16967478.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/539506.html
標籤:其他
上一篇:<七>lambda運算式實作原理
