撤回的微信消息真的看不到?78行Python代码帮你看穿一切!
導讀:Python曾經對我說:"時日不多,趕緊用Python"。于是看到了一個基于python的微信開源庫:itchat,玩了一天,做了一個程序,把私聊撤回的信息可以收集起來并發送到個人微信的文件傳輸助手,包括:
(1) who :誰發送的
(2) when :什么時候發送的消息
(3) what:什么信息
(4) which:哪一類信息,包括:文本、圖片、語音、視頻、分享、位置、附件
...
01 代碼實現
#?-*-encoding:utf-8-*-
import?os
import?re
import?shutil
import?time
import?itchat
from?itchat.content?import?*
#?說明:可以撤回的有文本文字、語音、視頻、圖片、位置、名片、分享、附件
#?{msg_id:(msg_from,msg_to,msg_time,msg_time_rec,msg_type,msg_content,msg_share_url)}
msg_dict?=?{}
#?文件存儲臨時目錄
rev_tmp_dir?=?"/home/alic/RevDir/"
if?not?os.path.exists(rev_tmp_dir):?os.mkdir(rev_tmp_dir)
#?表情有一個問題?|?接受信息和接受note的msg_id不一致?巧合解決方案
face_bug?=?None
#?將接收到的消息存放在字典中,當接收到新消息時對字典中超時的消息進行清理?|?不接受不具有撤回功能的信息
#?[TEXT,?PICTURE,?MAP,?CARD,?SHARING,?RECORDING,?ATTACHMENT,?VIDEO,?FRIENDS,?NOTE]
@itchat.msg_register([TEXT,?PICTURE,?MAP,?CARD,?SHARING,?RECORDING,?ATTACHMENT,?VIDEO])
def?handler_receive_msg(msg):
????global?face_bug
????#?獲取的是本地時間戳并格式化本地時間戳?e:?2017-04-21?21:30:08
????msg_time_rec?=?time.strftime("%Y-%m-%d?%H:%M:%S",?time.localtime())
????#?消息ID
????msg_id?=?msg['MsgId']
????#?消息時間
????msg_time?=?msg['CreateTime']
????#?消息發送人昵稱?|?這里也可以使用RemarkName備注 但是自己或者沒有備注的人為None
????msg_from?=?(itchat.search_friends(userName=msg['FromUserName']))["NickName"]
????#?消息內容
????msg_content?=?None
????#?分享的鏈接
????msg_share_url?=?None
????if?msg['Type']?==?'Text'?\
????????????or?msg['Type']?==?'Friends':
????????msg_content?=?msg['Text']
????elif?msg['Type']?==?'Recording'?\
????????????or?msg['Type']?==?'Attachment'?\
????????????or?msg['Type']?==?'Video'?\
????????????or?msg['Type']?==?'Picture':
????????msg_content?=?r""?+?msg['FileName']
????????#?保存文件
????????msg['Text'](rev_tmp_dir?+?msg['FileName'])
????elif?msg['Type']?==?'Card':
????????msg_content?=?msg['RecommendInfo']['NickName']?+?r"?的名片"
????elif?msg['Type']?==?'Map':
????????x,?y,?location?=?re.search(
????????????"<location?x=\"(.*?)\"?y=\"(.*?)\".*label=\"(.*?)\".*",?msg['OriContent']).group(1,?2,?3)
????????if?location?is?None:
????????????msg_content?=?r"緯度->"?+?x.__str__()?+?"?經度->"?+?y.__str__()
????????else:
????????????msg_content?=?r""?+?location
????elif?msg['Type']?==?'Sharing':
????????msg_content?=?msg['Text']
????????msg_share_url?=?msg['Url']
????face_bug?=?msg_content
????#?更新字典
????msg_dict.update(
????????{
????????????msg_id:?{
????????????????"msg_from":?msg_from,?"msg_time":?msg_time,?"msg_time_rec":?msg_time_rec,
????????????????"msg_type":?msg["Type"],
????????????????"msg_content":?msg_content,?"msg_share_url":?msg_share_url
????????????}
????????}
????)
#?收到note通知類消息,判斷是不是撤回并進行相應操作
@itchat.msg_register([NOTE])
def?send_msg_helper(msg):
????global?face_bug
????if?re.search(r"\<\!\[CDATA\[.*撤回了一條消息\]\]\>",?msg['Content'])?is?not?None:
????????#?獲取消息的id
????????old_msg_id?=?re.search("\<msgid\>(.*?)\<\/msgid\>",?msg['Content']).group(1)
????????old_msg?=?msg_dict.get(old_msg_id,?{})
????????if?len(old_msg_id)?<?11:
????????????itchat.send_file(rev_tmp_dir?+?face_bug,?toUserName='filehelper')
????????????os.remove(rev_tmp_dir?+?face_bug)
????????else:
????????????msg_body?=?"告訴你一個秘密~"?+?"\n"?\
???????????????????????+?old_msg.get('msg_from')?+?"?撤回了?"?+?old_msg.get("msg_type")?+?"?消息"?+?"\n"?\
???????????????????????+?old_msg.get('msg_time_rec')?+?"\n"?\
???????????????????????+?"撤回了什么??"?+?"\n"?\
???????????????????????+?r""?+?old_msg.get('msg_content')
????????????#?如果是分享存在鏈接
????????????if?old_msg['msg_type']?==?"Sharing":?msg_body?+=?"\n就是這個鏈接??"?+?old_msg.get('msg_share_url')
????????????#?將撤回消息發送到文件助手
????????????itchat.send(msg_body,?toUserName='filehelper')
????????????#?有文件的話也要將文件發送回去
????????????if?old_msg["msg_type"]?==?"Picture"?\
????????????????????or?old_msg["msg_type"]?==?"Recording"?\
????????????????????or?old_msg["msg_type"]?==?"Video"?\
????????????????????or?old_msg["msg_type"]?==?"Attachment":
????????????????file?=?'@fil@%s'?%?(rev_tmp_dir?+?old_msg['msg_content'])
????????????????itchat.send(msg=file,?toUserName='filehelper')
????????????????os.remove(rev_tmp_dir?+?old_msg['msg_content'])
????????????#?刪除字典舊消息
????????????msg_dict.pop(old_msg_id)
if?__name__?==?'__main__':
????itchat.auto_login(hotReload=True,enableCmdQR=2)
????itchat.run()
? ??
該程序可以直接在終端運行,在終端掃碼成功夠即可登錄成功,同時也可以打包在window系統運行(注意修改一下路徑,推薦使用相對路徑)。
?? ~ python wx.py
Getting uuid of QR code.
Downloading QR code.
Please scan the QR code to log in.
Please press confirm on your phone.
Loading the contact, this may take a little while.
�[3;J
Login successfully as AlicFeng
Start auto replying.
02 效果圖
03 itchat
上面都是編程邏輯的小事,我還是記錄一下itchat微信這個開源庫。
1. 簡介
itchat是一個開源的微信個人號接口,使用python調用微信變得非常簡單。簡單是用itchat代碼即可構建一個基于微信的即時通訊,更不錯的體現在于方便擴展個人微信的在其他平臺的更多通訊功能。
2. 安裝
pip3 install itchat
3. itchat - Helloworld
僅僅三行代碼發送一條信息給文件傳輸助手。
import itchat
itchat.auto_login(hotReload=True)
itchat.send('Hello AlicFeng', toUserName='filehelper')
4. 查看客戶端
學習最重要的還是API說明手冊:
Github for itchat:
https://github.com/liduanwei/ItChat
中文API:
http://itchat.readthedocs.io/zh/latest/
來源:
https://www.jianshu.com/p/712d19374b2e
文章版權歸原作者所有,轉載僅供學習使用,不用于任何商業用途,如有侵權請留言聯系刪除,感謝合作。
總結
以上是生活随笔為你收集整理的撤回的微信消息真的看不到?78行Python代码帮你看穿一切!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: K-Means算法的10个有趣用例
- 下一篇: 最多金的编程语言Top10:Python