今天我們就帶你用Python玩轉(zhuǎn)其中的一些功能。 01 撤回消息 如果有人撤回消息的時(shí)候,我們會(huì)很好奇,他又撤回了什么見不得人的消息,今天我們就用Python來實(shí)現(xiàn)一下第一時(shí)間把原消息轉(zhuǎn)發(fā)到文件助手,當(dāng)然也可以發(fā)回給發(fā)送者,哈哈,滿足一下你們的好奇心! 我們先來了解一下微信撤回消息的原理:
豬哥給大家演示一下正常消息和撤回消息的內(nèi)容到底有什么區(qū)別:
<sysmsg type='revokemsg'> <revokemsg> <session>xxx</session> <oldmsgid>1090336364</oldmsgid> <msgid>8784390488772995470</msgid> <replacemsg><![CDATA['豬哥' 撤回了一條消息]]></replacemsg> </revokemsg></sysmsg> 分析上面撤回的Content字段我們發(fā)現(xiàn)<msgid>8784390488772995470</msgid>的id與我們之前發(fā)送消息的id是一致的,而<replacemsg>這個(gè)標(biāo)簽也驗(yàn)證了我們的猜想,確實(shí)是用新消息替換原消息。 2.找到被撤回消息根據(jù)抓取正常消息和撤回消息的內(nèi)容我們發(fā)現(xiàn)規(guī)則:撤回消息中會(huì)包含之前被撤回的那條消息的msgid,那我們只要找到之前那條消息就可以了,而wxpy模塊默認(rèn)為我們緩存了最近的200條消息,所以我們只要遍歷這些歷史消息然后比較msgid就可以找到被撤回的那條消息啦! 如果你微信消息太過頻繁,2分鐘之內(nèi)消息數(shù)量超過200,則可以將max_history設(shè)置大些。 3.轉(zhuǎn)發(fā)被撤回消息原理也搞懂了,被撤回的消息也找到了,就差最后一步轉(zhuǎn)發(fā)消息了,如果你之前玩過wxpy肯定會(huì)了吧,只要一行代碼就可以將消息轉(zhuǎn)發(fā):
4.代碼原理和過程講完了,代碼貼出來給大家看看,注釋還是比較詳細(xì),有不懂得話可以在學(xué)習(xí)群中問我。 四、功能驗(yàn)證五、總結(jié)微信消息防撤回功能實(shí)現(xiàn)簡單,但實(shí)用性很好,目前項(xiàng)目的唯一缺點(diǎn)就是易用性差,簡單說就是我們還沒有將項(xiàng)目部署服務(wù)器,每次使用都得打開電腦然后運(yùn)行還得一直開著,豬哥考慮后面將項(xiàng)目部署在云服務(wù)器上或者打包成apk,這樣就使用起來就非常方便了,而且還可以把a(bǔ)pk發(fā)給朋友,讓朋友也體驗(yàn)此功能! 學(xué)會(huì)這招,再也不用好奇對(duì)方到底撤回了啥消息,快下載項(xiàng)目試試吧!下載項(xiàng)目后可直接運(yùn)行不需要修改代碼! Github項(xiàng)目地址:https://github.com/pig6/wxrobot 02 獲取好友列表 WechatPCAPI 提供了方法 get_friends(),該方法返回信息包括:好友、群和公眾號(hào)的列表信息,信息內(nèi)容主要包括:微信號(hào)、昵稱和自己設(shè)置的備注。 我們使用獲取的昵稱做個(gè)簡單的詞云展示,代碼實(shí)現(xiàn)如下所示: logging.basicConfig(level=logging.INFO)def on_message(message): passdef get_friends(): # 初始化微信實(shí)例 wx_inst = WechatPCAPI(on_message=on_message, log=logging) # 啟動(dòng)微信 wx_inst.start_wechat(block=True) # 等待登陸成功,此時(shí)需要人為掃碼登錄微信 while not wx_inst.get_myself(): time.sleep(5) print('登陸成功') nicknames = [] # 排除的詞 remove = ['還是', '不會(huì)', '一些', '所以', '果然', '起來', '東西', '為什么', '真的', '這么', '但是', '怎么', '還是', '時(shí)候', '一個(gè)', '什么', '自己', '一切', '樣子', '一樣', '沒有', '不是', '一種', '這個(gè)', '為了' ] for key, value in wx_inst.get_friends().items(): if key in ['fmessage', 'floatbottle', 'filehelper'] or 'chatroom' in key: continue nicknames.append(value['wx_nickname']) words = [] for text in nicknames: if not text: continue for t in jieba.cut(text): if t in remove: continue words.append(t) global word_cloud # 用逗號(hào)隔開詞語 word_cloud = ','.join(words)def nk_cloud(): # 打開詞云背景圖 cloud_mask = np.array(Image.open('bg.png')) # 定義詞云的一些屬性 wc = WordCloud( # 背景圖分割顏色為白色 background_color='white', # 背景圖樣 mask=cloud_mask, # 顯示最大詞數(shù) max_words=300, # 顯示中文 font_path='./fonts/simkai.ttf', # 最大尺寸 max_font_size=70 ) global word_cloud # 詞云函數(shù) x = wc.generate(word_cloud) # 生成詞云圖片 image = x.to_image() # 展示詞云圖片 image.show() # 保存詞云圖片 wc.to_file('nk.png') 看一下效果: 03 查看共同好友 思路 首先通過itchat這個(gè)微信個(gè)人號(hào)接口掃碼登錄個(gè)人微信網(wǎng)頁版,獲取可以識(shí)別好友身份的數(shù)據(jù)。這里是需要分別登錄兩人微信的,拿到兩人各自的好友信息存到列表中。 這樣一來,查共同好友就轉(zhuǎn)化成了查兩個(gè)列表中相同元素的問題。獲取到共同好友信息后,可以通過命令行窗口print出來,也可以寫入txt文件。 itchat itchat是一個(gè)開源的微信個(gè)人號(hào)接口,使用python調(diào)用微信從未如此簡單——其開發(fā)文檔 https://itchat./zh/latest/#itchat 首先是安裝itchat模塊,例如:pip install itchat 安裝完成在代碼中通過 import itchat 導(dǎo)入,之后直接調(diào)用
通過以上兩行,就可以拿到好友數(shù)據(jù)信息了,之后再從中篩選有用的信息進(jìn)行處理即可。這里有一處感覺特別酷,就是通過enableCmdQR參數(shù)在命令行中展示二維碼: #在命令行生成登錄二維碼itchat.auto_login(enableCmdQR=True) 好友信息處理 拿到的好友信息是什么樣的呢?其實(shí)特別有用的并不多,你的微信號(hào)和聯(lián)系方式是拿不到的。 而這里的UserName,同一個(gè)你在不同的微信號(hào)中UserName并不相同。所以,在并沒有一個(gè)可以特定區(qū)分好友的情況下,我們選擇獲取多組信息來組合拼湊成一個(gè)整體,這里我選擇了以下數(shù)據(jù)組成一個(gè)字典dict:
通過以上一個(gè)字典八組數(shù)據(jù)來代表每一位獨(dú)立好友信息。接下來在要比較的兩組好友信息列表中,進(jìn)行查重,這里我采用了最笨的遍歷方法: for i in contactlist: if i in contactlist2: if i not in[contactlist[0],contactlist2[0],empty,emptyM,emptyF]: common_list.append(i) count += 1 記錄信息 由于一些特殊字符因?yàn)榫幋a問題無法寫入txt文檔,我選擇既寫入txt又同時(shí)print出來相結(jié)合的方式:
回顧 整個(gè)流程下來,涉及到的就是itchat接口的使用、將信息賦值給list、獲取兩個(gè)list公共元素、將信息寫入txt文件這四部分。 除了itchat接口獲取好友數(shù)據(jù)看著復(fù)雜外,別的都是基礎(chǔ)語法。而itchat相關(guān)的代碼就幾行,所以你說,python是不是賊好用? 代碼下載 除了代碼外,這里我也將py文件封裝成了exe文件來直接下載,這樣即使電腦沒裝python或者你不用python也可以拿來玩了。 04 消息轟炸 準(zhǔn)備
核心代碼import itchatimport timeprint('掃一下彈出來的二維碼')itchat.auto_login(hotReload=True)boom_remark_name = input('輸入你要轟炸的人的微信備注,按回車建繼續(xù)')message = input('輸入你要轟炸的內(nèi)容,按回車鍵開始轟炸')boom_obj = itchat.search_friends(remarkName=boom_remark_name)[0]['UserName']while True: time.sleep(0.5) print('正在轟炸。。。') itchat.send_msg(msg=message, toUserName=boom_obj)在學(xué)習(xí)過程中有什么不懂得可以加我的python學(xué)習(xí)交流扣扣qun,784758214群里有不錯(cuò)的學(xué)習(xí)視頻教程、開發(fā)工具與電子書籍。與你分享python企業(yè)當(dāng)下人才需求及怎么從零基礎(chǔ)學(xué)習(xí)好python,和學(xué)習(xí)什么內(nèi)容 代碼講解import itchat 導(dǎo)入itchat模塊 import time 導(dǎo)入time模塊 itchat.auto_login(hotReload=True) 登錄微信,采用熱加載的方式登錄網(wǎng)頁版的微信,會(huì)生成一個(gè)itchat.pkl的文件,用于保持登錄狀態(tài),有點(diǎn)類似于cookie boom_remark_name = input('輸入你要轟炸的人的微信備注,按回車建繼續(xù)') 這里一定要輸入你給微信好友的備注名,否者無法定位到好友 message = input('輸入你要轟炸的內(nèi)容,按回車鍵開始轟炸') 這里輸入要轟炸的內(nèi)容 boom_obj = itchat.search_friends(remarkName=boom_remarkname)[0]['UserName'] 這里通過微信好友的備注名找到微信好友的信息,再通過UserName定位到好友 while True: 死循環(huán)轟炸 time.sleep(0.5)設(shè)置睡眠,以免出現(xiàn)消息發(fā)送頻繁導(dǎo)致不能發(fā)送微信消息,此處可自行設(shè)置,睡眠時(shí)間不能太短 print('正在轟炸。。。') itchat.send_msg(msg=message, toUserName=boom_obj) 如何使用
如何退出按Ctrl + C 退出轟炸 04 拍一拍 用appium模擬操控手機(jī)并截圖,通過圖像識(shí)別定位好友頭像坐標(biāo),最后用appium模擬雙擊頭像坐標(biāo),以此實(shí)現(xiàn)“拍一拍”功能。 效果展示: 具體步驟: 一、用appium操控手機(jī) 關(guān)于appium的安裝及使用方法,這里就不再贅述了,直接進(jìn)入操作步驟 1.用python打開微信,代碼如下:
難點(diǎn)在于desired_cap參數(shù)的配置,這里再給大家介紹一下:
將手機(jī)連接電腦,打開開發(fā)者模式,運(yùn)行此程序,就會(huì)發(fā)現(xiàn)手機(jī)自動(dòng)打開了微信。 二、模擬雙擊頭像 1.原理介紹 我們都知道,微信“拍一拍”是通過雙擊好友頭像實(shí)現(xiàn)的,如下圖所示: ![]() 想要雙擊頭像,就要先獲得頭像在屏幕中的坐標(biāo) 這里給大家介紹1個(gè)函數(shù): 基于Python-opencv2的目標(biāo)定位模塊:Aircv使用其find_template函數(shù),可以查找目標(biāo)圖像在原始圖像中的坐標(biāo)范圍,用法如下: def matchImg(imgsrc, imgobj, confidencevalue=0.7): imsrc = ac.imread(imgsrc) imgobj = ac.imread(imgobj) match_result = ac.find_template(imsrc, imgobj,confidencevalue) return match_result 其中imgsrc=原始圖片路徑,imgobj=待查找的目標(biāo)圖片路徑。
其中:
2.那么該如何在程序中自動(dòng)獲取獲取好友頭像坐標(biāo)呢? 在客戶端appium中,可以確定頭像在屏幕中的像素為140×140 然后在程序中創(chuàng)建1個(gè)while循環(huán),在第一步完成的基礎(chǔ)上,手動(dòng)進(jìn)入好友聊天框(其實(shí)也可以通過識(shí)別好友頭像自動(dòng)進(jìn)入) 通過appium對(duì)手機(jī)屏幕截圖并命名為src.png,將其和頭像路徑(obj.png)導(dǎo)入1中的檢測(cè)函數(shù): driver.save_screenshot('src.png')imgsrc='src.png'imgobj='obj.png'match_result=matchImg(imgsrc, imgobj) 若返回None,則說明聊天窗口沒檢測(cè)到好友頭像,繼續(xù)循環(huán); 若檢測(cè)到頭像坐標(biāo),則解析返回的坐標(biāo)數(shù)據(jù),用for循環(huán)模擬雙擊坐標(biāo)位置:
這樣就大功告成了 ![]() 是不是很簡單? 05 自動(dòng)告警 說到告警,相信每個(gè)運(yùn)維人員都不會(huì)陌生。以往我們用來發(fā)送告警的方式往往是短信或者郵件,但是這兩種方式要么不夠靈活要么實(shí)時(shí)性不夠。隨著微信的普及,現(xiàn)在越來越多的互聯(lián)網(wǎng)應(yīng)用選擇用微信作為平臺(tái)發(fā)送告警信息,今天就跟大家分享一個(gè)利用Python實(shí)現(xiàn)微信告警的方法。 目前集成微信告警主要有兩種方式:
個(gè)人微信號(hào)發(fā)送告警使用個(gè)人號(hào)發(fā)送信息,其實(shí)就是通過調(diào)用API實(shí)現(xiàn)模擬網(wǎng)頁登錄與發(fā)信,這種方式需要使用個(gè)人賬號(hào)掃描二維碼登錄以后,腳本才能運(yùn)行,實(shí)現(xiàn)的效果與收到朋友的微信無異,還可以發(fā)送至指定群聊。聽著都挺好,就是可惜當(dāng)前微信已不支持網(wǎng)頁登錄了。。。(太坑爹,debug半天才發(fā)現(xiàn)…) ![]() 企業(yè)微信發(fā)送告警微信的公眾號(hào)拆分成了訂閱號(hào)與服務(wù)號(hào),如果通過訂閱號(hào)與服務(wù)號(hào)發(fā)送告警,即顯得專業(yè),又無需掃碼登錄,更適用于服務(wù)器上長期運(yùn)行。但可惜訂閱號(hào)與服務(wù)號(hào)群發(fā)信息的數(shù)量有限制(少得可憐,TX太摳了),我們今天就以企業(yè)微信的方式實(shí)現(xiàn)微信告警推送。 ![]() 注冊(cè)企業(yè)微信如果自己非當(dāng)前所屬的企業(yè)微信管理員,或者暫無企業(yè)微信,可以先申請(qǐng)一個(gè),現(xiàn)在申請(qǐng)過程非常簡單,申請(qǐng)入口:https://work.weixin.qq.com/ 完成后可通過首頁進(jìn)行人員添加 ![]() 創(chuàng)建應(yīng)用 在開始調(diào)用公眾號(hào)的API之前,我們要先創(chuàng)建一個(gè)應(yīng)用,告警可以發(fā)送到指定的應(yīng)用中,同時(shí)我們還可以對(duì)應(yīng)用授權(quán),以限制可以看到告警的人員范圍。 ![]() 創(chuàng)建完成后,點(diǎn)擊應(yīng)用圖標(biāo)可以看到如下內(nèi)容,記錄下AgentId、Secret的值,后續(xù)會(huì)使用到。 ![]() 點(diǎn)擊企業(yè)信息,查看并記錄企業(yè)ID,后續(xù)會(huì)用上。 ![]() 調(diào)用微信API實(shí)現(xiàn)企業(yè)微信自動(dòng)推送,需要調(diào)用如下兩個(gè)微信的API,詳細(xì)參數(shù)可查看官方文檔。
代碼實(shí)現(xiàn)如下代碼實(shí)現(xiàn)調(diào)用企業(yè)微信進(jìn)行推送的功能,可結(jié)合實(shí)際業(yè)務(wù)環(huán)境進(jìn)行調(diào)用和修改。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
結(jié)果測(cè)試![]() |
|