來自:裸睡的豬(微訊號:IT–Pig)
一、背景介紹
產品的更新迭代必然會伴隨著功能的推出和下線,今天我們要講的便是微信在2014年推出的一個小小的新功能:撤回訊息
,使用此功能者提神醒腦、神清氣爽,但被施用者卻可能會抓耳撓腮、咬牙切齒的想知道你到底撤回了啥,這就是所謂的好奇害死貓(Curiosity kills the cat),今天我們就來用Python實現防微信訊息撤回,滿足一下大家的好奇心!
二、功能設計
我們希望當有好友或者群中有人撤回訊息的時候,第一時間能把原訊息、傳送者資訊轉發到檔案助手中(當然你也可以把訊息發回給他,哈哈),這樣方便我們檢視。
給大家來演示一下實現的功能。
三、功能實現
1.微信撤回訊息實現原理
我們先來瞭解一下微信撤回訊息的原理:
其實微信撤回訊息原理就是操作者在點選撤回的時候,客戶端會自動發一條系統訊息:“xxx撤回了一條訊息”,然後對方app端收到訊息後解析,替換原訊息,改個顯示的樣式即可
豬哥給大家演示一下正常訊息
和撤回訊息
的內容到底有什麼區別:
正常訊息:Content='你好騷啊'
,大家留意一下MsgId='8784390488772995470'
撤回訊息:Content是一串xml格式的內容
我們在下麵把它格式化看看
<sysmsg type="revokemsg">
<revokemsg>
<session>xxxsession>
<oldmsgid>1090336364oldmsgid>
<msgid>8784390488772995470msgid>
<replacemsg>replacemsg>
revokemsg>sysmsg>
分析上面撤回的Content
欄位我們發現8784390488772995470
的id與我們之前傳送訊息的id是一致的,而這個標簽也驗證了我們的猜想,確實是用新訊息替換原訊息。
2.找到被撤回訊息
根據抓取正常訊息
和撤回訊息
的內容我們發現規則:撤回訊息中會包含之前被撤回的那條訊息的msgid
,那我們只要找到之前那條訊息就可以了,而wxpy
模組預設為我們快取了最近的200條訊息,所以我們只要遍歷這些歷史訊息然後比較msgid
就可以找到被撤回的那條訊息啦!
如果你微信訊息太過頻繁,2分鐘之內訊息數量超過200,則可以將max_history
設定大些。
3.轉發被撤回訊息
原理也搞懂了,被撤回的訊息也找到了,就差最後一步轉發訊息了,如果你之前玩過wxpy
肯定會了吧,只要一行程式碼就可以將訊息轉發:
msg.forward(bot.file_helper)
4.程式碼
原理和過程講完了,程式碼貼出來給大家看看,註釋還是比較詳細。
四、功能驗證
五、總結
微信訊息防撤回功能實現簡單,但實用性很好,目前專案的唯一缺點就是易用性差,簡單說就是我們還沒有將專案部署伺服器,每次使用都得開啟電腦然後執行還得一直開著,豬哥考慮後面將專案部署在雲伺服器上或者打包成apk,這樣就使用起來就非常方便了,而且還可以把apk發給朋友,讓朋友也體驗此功能!
學會這招,再也不用好奇對方到底撤回了啥訊息,快下載專案試試吧!下載專案後可直接執行不需要修改程式碼!
Github專案地址:https://github.com/pig6/wxrobot
wxpy官方檔案:https://wxpy.readthedocs.io/zh/latest
朋友會在“發現-看一看”看到你“在看”的內容