python查看微信撤回消息_想查看微信好友撤回的消息?Python帮你搞定
要說(shuō)微信最讓人惡心的發(fā)明,消息撤回絕對(duì)能上榜。
比如你現(xiàn)在正和女朋友用微信聊著天,或者跟自己喜歡的女孩子聊著天,一個(gè)不留神,你沒(méi)注意到對(duì)方發(fā)的消息就被她及時(shí)撤回了,這時(shí)你很好奇,好奇她到底發(fā)了什么?于是你打算問(wèn)問(wèn)她發(fā)了什么,結(jié)果她回一句"沒(méi)什么"。這一回復(fù),讓你的好奇心更加強(qiáng)烈了,頓時(shí)就感覺(jué)消息撤回這一功能就是用來(lái)折磨人的。
那么有沒(méi)有什么辦法能夠知道你心愛的她(他)到底撤回了什么呢?不要著急,Python幫你搞定。
模塊介紹
本篇文章將用Python實(shí)現(xiàn)微信的防撤回功能,針對(duì)微信操作,Python有一個(gè)十分強(qiáng)大的庫(kù):itchat。相信沒(méi)有使用過(guò)也有所耳聞吧。官方是這樣描述它的:
Project description
itchat is a open souce wechat api project for personal account.
It enables you to access your personal wechat account through command line.
翻譯過(guò)來(lái)就是:itchat是一個(gè)針對(duì)個(gè)人帳戶的開放式微信api項(xiàng)目,它使您可以通過(guò)命令行訪問(wèn)您的個(gè)人微信帳戶。
既然是針對(duì)微信的開發(fā),我們就離不開這個(gè)模塊的協(xié)助,所以,首先下載該模塊:
pip install itchat
也可以在開發(fā)工具Pycharm中直接導(dǎo)入該模塊,Pycharm會(huì)提示你下載。
模塊初體驗(yàn)
考慮到應(yīng)該有些人從來(lái)沒(méi)有使用過(guò)該模塊,這里對(duì)該模塊進(jìn)行一個(gè)簡(jiǎn)單的入門。
1、如何登陸微信
既然要操作微信,那么擺在我們面前的問(wèn)題就是如何登錄微信,登錄微信非常簡(jiǎn)單,直接看代碼:
import itchat
itchat.login()
沒(méi)錯(cuò),一句代碼即可完成登錄,運(yùn)行之后就會(huì)彈出一個(gè)二維碼,掃描之后在手機(jī)上授權(quán)登錄,控制臺(tái)就會(huì)提示是否登錄成功。
Login successfully as Y
這樣就說(shuō)明登錄成功了。
這里需要注意一個(gè)問(wèn)題,就是你會(huì)發(fā)現(xiàn)每次運(yùn)行程序都要掃描二維碼登錄,這樣未免太麻煩,有沒(méi)有辦法只掃描一次,以后就自動(dòng)登錄了呢?這當(dāng)然是可以的。
import itchat
itchat.auto_login(hotReload=True)
通過(guò)函數(shù)名也能知道該方法可以實(shí)現(xiàn)自動(dòng)登錄,運(yùn)行程序,掃碼登錄之后會(huì)在項(xiàng)目路徑下創(chuàng)建一個(gè)itchat.pkl文件,該文件用于存儲(chǔ)登錄的狀態(tài),所以千萬(wàn)不要?jiǎng)铀?#xff0c;如果你想換一個(gè)微信賬號(hào)登錄,就要先把這個(gè)文件刪除,因?yàn)樵撐募涗浀氖巧弦粋€(gè)微信的狀態(tài),刪除之后即可登錄。
需要注意:這種方式只能保證你在短時(shí)間內(nèi)無(wú)需重復(fù)登錄,時(shí)間長(zhǎng)了,還是需要重新掃碼登錄的。
進(jìn)行到這里,有些人可能會(huì)發(fā)現(xiàn)自己的微信登錄不上的情況,據(jù)我所知,有些新注冊(cè)的微信和長(zhǎng)期不使用的微信是無(wú)法登錄網(wǎng)頁(yè)版微信的,所以這里也會(huì)導(dǎo)致登錄不上。如果登錄不上,那也是沒(méi)有辦法的,下面的內(nèi)容也就沒(méi)有意義了。
2、獲取好友列表
登錄上微信之后,我們來(lái)用一用itchat模塊提供的一些api,比如獲取好友列表。
import itchat
itchat.auto_login(hotReload=True)
friends = itchat.get_friends() # 好友列表
print(friends)
使用get_friends()函數(shù)即可獲取到好友列表的所有好友信息,包括昵稱、備注名、地址、個(gè)性簽名、性別等等。
這里我隨意地復(fù)制了一個(gè)好友的個(gè)人信息,當(dāng)然由于隱私問(wèn)題,這里的部分信息我用"*"號(hào)代替了,我們重點(diǎn)是分析一下這些信息的內(nèi)容。比如最開始的UserName,這是用戶的唯一標(biāo)識(shí),相當(dāng)于身份證號(hào)碼,你的每個(gè)好友都會(huì)有這樣一個(gè)標(biāo)識(shí),每個(gè)好友之間肯定都是不一樣的;然后是NickName,這是好友的昵稱;HeadImgUrl是好友的頭像地址;RemarkName是你對(duì)好友的備注名;Province是省份等等,這里就不一一介紹了,感興趣的話可以自己去了解一下。
3、如何發(fā)送消息給好友
如何發(fā)送一條消息給指定的好友呢?也非常簡(jiǎn)單:
import itchat
itchat.auto_login(hotReload=True)
itchat.send('Hello World', toUserName='@f9e42aafa1175b38b60a0be4d651a34c77f2528d9b7784e7aaf415090eca8fa6')
此時(shí)的UserName就派上用場(chǎng)了,也就是好友的唯一標(biāo)識(shí),這樣,我們就給該標(biāo)識(shí)對(duì)應(yīng)的好友發(fā)送了一條消息,所以,我們可以這樣改進(jìn)程序:
import itchat
itchat.auto_login(hotReload=True)
friends = itchat.get_friends()
nickName = '誠(chéng)信通授權(quán)渠道商-老曾'
for i in friends:
if '誠(chéng)信通授權(quán)渠道商-老曾' == i['NickName']:
itchat.send('Hello World', toUserName=i['UserName'])
break
這樣,就可以指定發(fā)送給任意好友,通過(guò)好友的昵稱在好友列表中進(jìn)行檢索,找到的話,就獲取該好友的UserName,然后發(fā)送消息,也可以通過(guò)對(duì)好友的備注名(RemarkName)查找,大家可以自己嘗試。
4、裝飾器
關(guān)于itchat模塊還有很多功能,這里就不作過(guò)多講解了,我們只講關(guān)于這次程序的知識(shí)點(diǎn),這里是最后一個(gè)內(nèi)容,裝飾器。
關(guān)于裝飾器,一時(shí)半會(huì)還講不清楚,這里只是簡(jiǎn)單介紹一下,裝飾器的作用就是用于拓展原來(lái)函數(shù)功能的一種函數(shù),目的是在不改變?cè)瘮?shù)名(或類名)的情況下,給函數(shù)增加新的功能。
例如現(xiàn)在有一個(gè)函數(shù)fun(),你并不知曉函數(shù)的實(shí)現(xiàn)原理,你肯定也不能去修改這個(gè)函數(shù)的代碼,而你需要給該函數(shù)添加一個(gè)輸出開始運(yùn)行時(shí)間和結(jié)束運(yùn)行時(shí)間的功能,該如何實(shí)現(xiàn)呢?這個(gè)時(shí)候就可以使用裝飾器。
import time
def show_time(fun):
def inner():
print(time.time())
fun()
print(time.time())
return inner
@show_time
def fun():
pass
fun()
該如何理解這段程序呢?首先@show_time即是使用一個(gè)裝飾器show_time,此時(shí)會(huì)將裝飾的函數(shù),也就是fun()作為參數(shù)傳遞給裝飾器show_time(),我們知道函數(shù)作為返回值的話,執(zhí)行的其實(shí)是該函數(shù),所以程序會(huì)執(zhí)行內(nèi)部函數(shù)inner(),此時(shí)輸出開始運(yùn)行時(shí)間,然后調(diào)用fun()函數(shù)(原有的功能不能丟),最后輸出結(jié)束運(yùn)行時(shí)間。這樣就通過(guò)裝飾器實(shí)現(xiàn)了一個(gè)函數(shù)的功能擴(kuò)展,這也是典型的面向切面編程思想。
如何獲取好友發(fā)送的消息
準(zhǔn)備工作做完了,接下來(lái)就進(jìn)入正題了,對(duì)于上面的知識(shí)點(diǎn),大家一定要掌握,如果不懂的話,接下來(lái)的代碼你可能會(huì)很懵。
首先,我們看看該如何獲取到好友發(fā)送的消息。
import itchat
itchat.auto_login(hotReload=True)
@itchat.msg_register(itchat.content.TEXT)
def resever_info(msg):
print(msg)
itchat.run() #保持運(yùn)行
itchat模塊提供了@itchat.msg_register裝飾器來(lái)監(jiān)聽消息,比如這里我們自定義了一個(gè)resever_info()函數(shù),并用裝飾器對(duì)消息進(jìn)行監(jiān)聽,裝飾器中傳入了itchat.content.TEXT類型,這樣監(jiān)聽的就是文本消息,監(jiān)聽到輸入之后,裝飾器就會(huì)將文本消息傳入resever_info()的參數(shù)中。所以,msg就是監(jiān)聽到的消息內(nèi)容。
對(duì)于@itchat.msg_register裝飾器,它不僅可以監(jiān)聽文本,還可以監(jiān)聽語(yǔ)音、圖片、地圖、名片、視頻等等,為了方便,這里我們導(dǎo)入itchat模塊下的content模塊中的全部?jī)?nèi)容,因?yàn)檫@些消息類型都是在該模塊下聲明的。
TEXT = 'Text'
MAP = 'Map'
CARD = 'Card'
NOTE = 'Note'
SHARING = 'Sharing'
PICTURE = 'Picture'
RECORDING = VOICE = 'Recording'
ATTACHMENT = 'Attachment'
VIDEO = 'Video'
FRIENDS = 'Friends'
SYSTEM = 'System'
INCOME_MSG = [TEXT, MAP, CARD, NOTE, SHARING, PICTURE,
RECORDING, VOICE, ATTACHMENT, VIDEO, FRIENDS, SYSTEM]
還有要注意的地方,最后記得調(diào)用itchat的run()函數(shù),保持程序運(yùn)行,否則程序就直接結(jié)束了。
接下來(lái)我們就可以測(cè)試一下了,我讓我的好友發(fā)了一條消息給我,控制臺(tái)就輸出了如下內(nèi)容:
內(nèi)容很多,我們只挑重要的看。例如FromUserName,這是發(fā)送者的標(biāo)識(shí);ToUserName,這是接收者的標(biāo)識(shí);Content,這當(dāng)然就是文本內(nèi)容了;CreateTime,這是發(fā)送時(shí)間;注意最后的兩個(gè)值:Type,這是消息類型,這里是文本類型Text,然后Text也是文本內(nèi)容,所以如果想取出好友發(fā)送的消息內(nèi)容的話,用Content和Text都可以。分析過(guò)后,取出內(nèi)容就很簡(jiǎn)單了:
import itchat
import time
from itchat.content import * # 導(dǎo)入itchat下的content模塊
itchat.auto_login(hotReload=True)
@itchat.msg_register(TEXT)
def resever_info(msg):
info = msg['Text'] # 取出文本消息
info_type = msg['Type'] # 取出消息類型
fromUser = itchat.search_friends(userName=msg['FromUserName'])['NickName']
ticks = msg['CreateTime'] # 獲取信息發(fā)送的時(shí)間
time_local = time.localtime(ticks)
dt = time.strftime("%Y-%m-%d %H:%M:%S", time_local) # 格式化日期
print("發(fā)送人:" + fromUser + '\n消息類型:' + info_type + '\n發(fā)送時(shí)間:' + dt + '\n消息內(nèi)容:' + info)
itchat.run()
這里用到了time模塊,用于格式化日期。
為了測(cè)試方便,我就自己發(fā)了一條消息給別人,自己發(fā)的消息也是會(huì)被監(jiān)聽的,看運(yùn)行結(jié)果:
發(fā)送人:Y
消息類型:Text
發(fā)送時(shí)間:2019-11-28 16:19:13
消息內(nèi)容:土鱉
再來(lái)試試語(yǔ)音和圖片能獲取到嗎?我們回到剛才的代碼:
import itchat
from itchat.content import * # 導(dǎo)入itchat下的content模塊
itchat.auto_login(hotReload=True)
@itchat.msg_register(TEXT)
def resever_info(msg):
print(msg)
itchat.run()
運(yùn)行之后,發(fā)送語(yǔ)音和圖片試試,不管怎么發(fā),控制臺(tái)就是沒(méi)反應(yīng),這是當(dāng)然的了,我們還沒(méi)對(duì)語(yǔ)音和圖片進(jìn)行監(jiān)聽呢,修改代碼:
import itchat
from itchat.content import * # 導(dǎo)入itchat下的content模塊
itchat.auto_login(hotReload=True)
@itchat.msg_register([TEXT, PICTURE, RECORDING]) #添加了對(duì)圖片和語(yǔ)音的監(jiān)聽
def resever_info(msg):
print(msg)
itchat.run()
再運(yùn)行試試,先發(fā)送一張圖片,再發(fā)送一段語(yǔ)音,控制臺(tái)輸出了兩段內(nèi)容,由于篇幅過(guò)長(zhǎng),就不貼出來(lái)了,無(wú)非還是那些信息,發(fā)送者,接收者,日期,消息內(nèi)容等等,這里只需注意圖片和語(yǔ)音的內(nèi)容:
'Type': 'Picture', 'Text': .download_fn at 0x0000000003574158>
'Type': 'Recording', 'Text': .download_fn at 0x0000000002CFED08>
這是一段地址,通過(guò)它我們就能夠?qū)D片和語(yǔ)音保存起來(lái)。
如何保存好友發(fā)送的圖片和語(yǔ)音
下面我們對(duì)好友發(fā)送的圖片和語(yǔ)音進(jìn)行保存。
import itchat
import os
from itchat.content import * # 導(dǎo)入itchat下的content模塊
itchat.auto_login(hotReload=True)
temp = 'C:/Users/Administrator/Desktop/CrawlerDemo' + '/' + '撤回的消息'
# 如果不存在該文件夾,就創(chuàng)建
if not os.path.exists(temp):
os.mkdir(temp)
@itchat.msg_register([TEXT, PICTURE, RECORDING])
def resever_info(msg):
info = msg['Text'] # 取出文本消息
info_type = msg['Type'] # 取出消息類型
name = msg['FileName'] # 取出語(yǔ)音(圖片)文件名
if info_type == 'Recording':
# 保存語(yǔ)音
info(temp + '/' + name)
elif info_type == 'Picture':
# 保存圖片
info(temp + '/' + name)
itchat.run()
運(yùn)行起來(lái),然后發(fā)送一張圖片和一條語(yǔ)音,就會(huì)在指定目錄下生成兩個(gè)文件:
如何監(jiān)聽好友撤回了消息
到這里,我們其實(shí)已經(jīng)完成了消息監(jiān)聽,只需要稍加修改即可,但是這個(gè)程序是有缺陷的,因?yàn)椴皇撬邢⑽覀兌夹枰ケ4娴?#xff0c;好友正常發(fā)送過(guò)來(lái)的消息我們直接就能看到,保存下來(lái)不是多此一舉嗎?我們的目的是想知道好友撤回了什么內(nèi)容,這就涉及到如何監(jiān)聽好友是否撤回了消息這一問(wèn)題了。其實(shí)也非常簡(jiǎn)單,Content模塊為我們提供了NOTE類型,該類型指的是系統(tǒng)消息。
所以我們可以自定義一個(gè)函數(shù)用來(lái)監(jiān)聽系統(tǒng)消息:
import itchat
from itchat.content import * # 導(dǎo)入itchat下的content模塊
itchat.auto_login(hotReload=True)
@itchat.msg_register(NOTE)
def note_info(msg): # 監(jiān)聽系統(tǒng)消息
print(msg)
itchat.run()
運(yùn)行程序,我們撤回一條消息測(cè)試一下,輸出結(jié)果如下:
......
'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': '', 'EncryChatRoomId': '', 'IsOwner': 0}>, 'Type': 'Note', 'Text': '你撤回了一條消息'}
......
這里截取了部分內(nèi)容,會(huì)發(fā)現(xiàn),撤回消息的文本內(nèi)容為"你撤回了一條消息",所以要想知道好友是否撤回了消息就非常簡(jiǎn)單了,判斷msg['Text'] == '你撤回了一條消息'即可。
實(shí)現(xiàn)微信防撤回程序
關(guān)于程序每個(gè)步驟的代碼到這里就分析完了,接下來(lái)是對(duì)所有代碼的匯總,也是整個(gè)程序的完整代碼:
import itchat
from itchat.content import *
import os
import time
import xml.dom.minidom # 解析xml模塊
# 這是保存撤回消息的文件目錄(如:圖片、語(yǔ)音等),這里已經(jīng)寫死了,大家可以自行修改
temp = 'C:/Users/Administrator/Desktop/CrawlerDemo' + '/' + '撤回的消息'
if not os.path.exists(temp):
os.mkdir(temp)
itchat.auto_login(True) # 自動(dòng)登錄
dict = {} # 定義一個(gè)字典
# 這是一個(gè)裝飾器,給下面的函數(shù)添加新功能
# 能夠捕獲好友發(fā)送的消息,并傳遞給函數(shù)參數(shù)msg
@itchat.msg_register([TEXT, PICTURE, FRIENDS, CARD, MAP, SHARING, RECORDING, ATTACHMENT, VIDEO]) # 文本,語(yǔ)音,圖片
def resever_info(msg):
global dict # 聲明全局變量
info = msg['Text'] # 取出消息內(nèi)容
msgId = msg['MsgId'] # 取出消息標(biāo)識(shí)
info_type = msg['Type'] # 取出消息類型
name = msg['FileName'] # 取出消息文件名
# 取出消息發(fā)送者標(biāo)識(shí)并從好友列表中檢索
fromUser = itchat.search_friends(userName=msg['FromUserName'])['NickName']
ticks = msg['CreateTime'] # 獲取信息發(fā)送的時(shí)間
time_local = time.localtime(ticks)
dt = time.strftime("%Y-%m-%d %H:%M:%S", time_local) # 格式化日期
# 將消息標(biāo)識(shí)和消息內(nèi)容添加到字典
# 每一條消息的唯一標(biāo)識(shí)作為鍵,消息的具體信息作為值,也是一個(gè)字典
dict[msgId] = {"info": info, "info_type": info_type, "name": name, "fromUser": fromUser, "dt": dt}
@itchat.msg_register(NOTE) # 監(jiān)聽系統(tǒng)提示
def note_info(msg):
# 監(jiān)聽到好友撤回了一條消息
if '撤回了一條消息' in msg['Text']:
# 獲取系統(tǒng)消息中的Content結(jié)點(diǎn)值
content = msg['Content']
# Content值為xml,解析xml
doc = xml.dom.minidom.parseString(content)
# 取出msgid標(biāo)簽的值
result = doc.getElementsByTagName("msgid")
# 該msgId就是撤回的消息標(biāo)識(shí),通過(guò)它可以在字典中找到撤回的消息信息
msgId = result[0].childNodes[0].nodeValue
# 從字典中取出對(duì)應(yīng)消息標(biāo)識(shí)的消息類型
msg_type = dict[msgId]['info_type']
if msg_type == 'Recording': # 撤回的消息為語(yǔ)音
recording_info = dict[msgId]['info'] # 取出消息標(biāo)識(shí)對(duì)應(yīng)的消息內(nèi)容
info_name = dict[msgId]['name'] # 取出消息文件名
fromUser = dict[msgId]['fromUser'] # 取出發(fā)送者
dt = dict[msgId]['dt'] # 取出發(fā)送時(shí)間
recording_info(temp + '/' + info_name) # 保存語(yǔ)音
# 拼接提示消息
send_msg = '【發(fā)送人:】' + fromUser + '\n' + '發(fā)送時(shí)間:' + dt + '\n' + '撤回了一條語(yǔ)音'
itchat.send(send_msg, 'filehelper') # 將提示消息發(fā)送給文件助手
# 發(fā)送保存的語(yǔ)音
itchat.send_file(temp + '/' + info_name, 'filehelper')
del dict[msgId] # 刪除字典中對(duì)應(yīng)的消息
print("保存語(yǔ)音")
elif msg_type == 'Text':
text_info = dict[msgId]['info'] # 取出消息標(biāo)識(shí)對(duì)應(yīng)的消息內(nèi)容
fromUser = dict[msgId]['fromUser'] # 取出發(fā)送者
dt = dict[msgId]['dt'] # 取出發(fā)送時(shí)間
# 拼接提示消息
send_msg = '【發(fā)送人:】' + fromUser + '\n' + '發(fā)送時(shí)間:' + dt + '\n' + '撤回內(nèi)容:' + text_info
# 將提示消息發(fā)送給文件助手
itchat.send(send_msg, 'filehelper')
del dict[msgId] # 刪除字典中對(duì)應(yīng)的消息
print("保存文本")
elif msg_type == 'Picture':
picture_info = dict[msgId]['info'] # 取出消息標(biāo)識(shí)對(duì)應(yīng)的消息內(nèi)容
fromUser = dict[msgId]['fromUser'] # 取出發(fā)送者
dt = dict[msgId]['dt'] # 取出發(fā)送時(shí)間
info_name = dict[msgId]['name'] # 取出文件名
picture_info(temp + '/' + info_name) # 保存圖片
# 拼接提示消息
send_msg = '【發(fā)送人:】' + fromUser + '\n' + '發(fā)送時(shí)間:' + dt + '\n' + '撤回了一張圖片'
itchat.send(send_msg, 'filehelper') # 將圖片發(fā)送給文件助手
# 發(fā)送保存的語(yǔ)音
itchat.send_file(temp + '/' + info_name, 'filehelper')
del dict[msgId] # 刪除字典中對(duì)應(yīng)的消息
print("保存圖片")
itchat.run()
這樣,一個(gè)完整的防撤回程序就完成了,如果你對(duì)于前面的鋪墊能夠掌握得很好的話,這個(gè)程序?qū)δ銇?lái)說(shuō)就是小菜一碟,每一句代碼的注釋我都有寫,應(yīng)該很容易看懂。
測(cè)試程序
到了激動(dòng)人心的測(cè)試環(huán)節(jié),我們來(lái)測(cè)試一下這個(gè)程序是否編寫成功了。
我向我的好友發(fā)送了三條消息,分別是文本、圖片和語(yǔ)音,接著我一一撤回,然后,微信程序就自動(dòng)向文件傳輸助手發(fā)送了三條消息:
到這里,這個(gè)程序就基本完成了。你們?cè)跍y(cè)試的時(shí)候也可以叫自己的好友、同學(xué)發(fā)給你幾條消息,然后撤回看看是否能夠成功獲取到撤回的消息。
撤回的消息發(fā)給別人肯定不行,這樣不僅泄露了隱私,也會(huì)騷擾到別人,所以這里我選擇將撤回的消息發(fā)送給文件傳輸助手,如何將消息發(fā)送給文件傳輸助手也很簡(jiǎn)單:
itchat.send(send_msg, toUserName='filehelper')
toUserName傳入filehelper即可,這樣,如果對(duì)方撤回了消息,你就可以前往文件傳輸助手查看對(duì)方究竟撤回了什么。
說(shuō)說(shuō)我遇到的一些坑
這個(gè)程序說(shuō)它難,其實(shí)并不難,但我也在編寫的過(guò)程中遇到了一些坑,一開始我是一條消息一條消息地進(jìn)行測(cè)試,發(fā)現(xiàn)程序是正常的,但我連續(xù)撤回幾條消息,卻發(fā)現(xiàn)程序出現(xiàn)了Bug。比如我一開始發(fā)送了一張圖片和一段文字,結(jié)果我撤回這兩條消息后,得到的卻是兩段文字。后面我才醒悟過(guò)來(lái),是后面的消息覆蓋了前面的消息,導(dǎo)致了這個(gè)結(jié)果,所以在程序中,我定義了一個(gè)字典,用于存放好友輸入的消息,當(dāng)監(jiān)聽到消息被撤回時(shí),就通過(guò)撤回消息產(chǎn)生的內(nèi)容中的msgId去和字典中的匹配,匹配到的就是被撤回的消息,然后進(jìn)行操作即可。
使用教程
想使用該程序非常簡(jiǎn)單,實(shí)現(xiàn)微信防撤回程序節(jié)點(diǎn)下有程序的完整代碼,直接復(fù)制粘貼到你自己的python文件,然后運(yùn)行該文件即可,運(yùn)行后會(huì)產(chǎn)生一個(gè)二維碼,用手機(jī)驗(yàn)證登錄即可。
當(dāng)然,你也可以選擇將該程序打包成可執(zhí)行的exe文件,這樣運(yùn)行更加方便,打包方式:
首先打開cmd窗口,下載pyinstaller模塊,有的話就不用下載了,下載指令:pip insall pyinstaller,此時(shí)我們通過(guò)cmd窗口進(jìn)入到python文件目錄,比如我這里
那就進(jìn)入到該目錄下:
然后執(zhí)行下面這條指令:
pyinstaller -F wechat.py
后面是需要打包的文件名,執(zhí)行命令后,就會(huì)在文件同級(jí)目錄下生成一個(gè)dist文件夾。
進(jìn)入該文件夾,就看到我們的.exe文件了,然后雙擊執(zhí)行即可。
最后
這個(gè)程序目前只實(shí)現(xiàn)了監(jiān)聽好友的文本、圖片、語(yǔ)音類型的消息,對(duì)于其它類型的消息,還有群聊的消息都是無(wú)法監(jiān)聽到的,感興趣的話大家可以自己試著實(shí)現(xiàn)一下。
————————————————
本文為CSDN博主「~wangweijun」的原創(chuàng)文章。
原文鏈接:https://blog.csdn.net/qq_42453117/article/details/103334456
總結(jié)
以上是生活随笔為你收集整理的python查看微信撤回消息_想查看微信好友撤回的消息?Python帮你搞定的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 《戒药》第五句是什么
- 下一篇: 车位多少钱一个啊?