微信(WeChat)是騰訊公司於2011年1月21日推出的一款社交軟件,8年時間微信作到日活10億,日消息量450億。在此期間微信也推出了很多的功能如:「搖一搖」、「漂流瓶」、「朋友圈」、「附近的人」、「公衆平臺」、「小程序」等等,涵蓋了咱們生活的方方面面,微信正在慢慢踐行着他們的口號:微信,是一個生活方式python
產品的更新迭代必然會伴隨着功能的推出和下線,今天咱們要講的即是微信在2014年推出的一個小小的新功能:撤回消息
,使用此功能者提神醒腦、神清氣爽,但被施用者卻可能會抓耳撓腮、咬牙切齒的想知道你到底撤回了啥,這就是所謂的好奇害死貓(Curiosity kills the cat),今天咱們就來用Python實現防微信消息撤回,知足一下你們的好奇心!
ios
咱們但願當有好友或者羣中有人撤回消息的時候,第一時間能把原消息、發送者信息轉發到文件助手中(固然你也能夠把消息發回給他,哈哈),這樣方便咱們查看。git
給你們來演示一下實現的功能。
github
咱們先來了解一下微信撤回消息的原理:小程序
其實微信撤回消息原理就是操做者在點擊撤回的時候,客戶端會自動發一條系統消息:「xxx撤回了一條消息」,而後對方app端收到消息後解析,替換原消息,改個顯示的樣式便可緩存
豬哥給你們演示一下正常消息
和撤回消息
的內容到底有什麼區別:
正常消息: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>
這個標籤也驗證了個人猜測,確實是用新消息替換原消息。微信
根據抓取正常消息
和撤回消息
的內容咱們發現規則:撤回消息中會包含以前被撤回的那條消息的msgid
,那咱們只要找到以前那條消息就能夠了,而wxpy
模塊默認爲咱們緩存了最近的200條消息,因此咱們只要遍歷這些歷史消息而後比較msgid
就能夠找到被撤回的那條消息啦!
若是你微信消息太過頻繁,2分鐘以內消息數量超過200,則能夠將max_history
設置大些。session
原理也搞懂了,被撤回的消息也找到了,就差最後一步轉發消息了,若是你以前玩過wxpy
確定會了吧,只要一行代碼就能夠將消息轉發:app
msg.forward(bot.file_helper)
原理和過程講完了,代碼貼出來給你們看看,註釋仍是比較詳細,有不懂得話能夠在學習羣中問我。
微信消息防撤回功能實現簡單,但實用性很好,目前項目的惟一缺點就是易用性差,簡單說就是咱們尚未將項目部署服務器,每次使用都得打開電腦而後運行還得一直開着,豬哥考慮後面將項目部署在雲服務器上或者打包成apk,這樣就使用起來就很是方便了,並且還能夠把apk發給朋友,讓朋友也體驗此功能!
學會這招,不再用好奇對方到底撤回了啥消息,快下載項目試試吧!下載項目後可直接運行不須要修改代碼!
Github項目地址:https://github.com/pig6/wxrobot
wxpy官方文檔:https://wxpy.readthedocs.io/zh/latest
喜歡就關注豬哥吧~