小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

教你幾招用Python玩轉(zhuǎn)微信

 乙甲壬 2020-07-17

今天我們就帶你用Python玩轉(zhuǎn)其中的一些功能。

01

撤回消息

如果有人撤回消息的時(shí)候,我們會(huì)很好奇,他又撤回了什么見不得人的消息,今天我們就用Python來實(shí)現(xiàn)一下第一時(shí)間把原消息轉(zhuǎn)發(fā)到文件助手,當(dāng)然也可以發(fā)回給發(fā)送者,哈哈,滿足一下你們的好奇心!

我們先來了解一下微信撤回消息的原理:

其實(shí)微信撤回消息原理就是操作者在點(diǎn)擊撤回的時(shí)候,客戶端會(huì)自動(dòng)發(fā)一條系統(tǒng)消息:“xxx撤回了一條消息”,然后對(duì)方app端收到消息后解析,替換原消息,改個(gè)顯示的樣式即可

豬哥給大家演示一下正常消息和撤回消息的內(nèi)容到底有什么區(qū)別:
正常消息:Content='你好騷啊',大家留意一下MsgId='8784390488772995470'

教你幾招用Python玩轉(zhuǎn)微信


撤回消息:Content是一串xml格式的內(nèi)容

教你幾招用Python玩轉(zhuǎn)微信


我們?cè)谙旅姘阉袷交纯?/p>

<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就可以找到被撤回的那條消息啦!

教你幾招用Python玩轉(zhuǎn)微信

如果你微信消息太過頻繁,2分鐘之內(nèi)消息數(shù)量超過200,則可以將max_history設(shè)置大些。

3.轉(zhuǎn)發(fā)被撤回消息

原理也搞懂了,被撤回的消息也找到了,就差最后一步轉(zhuǎn)發(fā)消息了,如果你之前玩過wxpy肯定會(huì)了吧,只要一行代碼就可以將消息轉(zhuǎn)發(fā):

msg.forward(bot.file_helper)

4.代碼

原理和過程講完了,代碼貼出來給大家看看,注釋還是比較詳細(xì),有不懂得話可以在學(xué)習(xí)群中問我。

教你幾招用Python玩轉(zhuǎn)微信

四、功能驗(yàn)證

教你幾招用Python玩轉(zhuǎ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
wxpy官方文檔:https://wxpy./zh/latest

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')

看一下效果:

教你幾招用Python玩轉(zhuǎn)微信

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)用

#獲取登錄二維碼,掃碼登錄微信網(wǎng)頁版itchat.auto_login()#獲取好友信息列表friendList = itchat.get_friends(update=True)

通過以上兩行,就可以拿到好友數(shù)據(jù)信息了,之后再從中篩選有用的信息進(jìn)行處理即可。這里有一處感覺特別酷,就是通過enableCmdQR參數(shù)在命令行中展示二維碼:

#在命令行生成登錄二維碼itchat.auto_login(enableCmdQR=True)

好友信息處理

拿到的好友信息是什么樣的呢?其實(shí)特別有用的并不多,你的微信號(hào)和聯(lián)系方式是拿不到的。

教你幾招用Python玩轉(zhuǎn)微信

而這里的UserName,同一個(gè)你在不同的微信號(hào)中UserName并不相同。所以,在并沒有一個(gè)可以特定區(qū)分好友的情況下,我們選擇獲取多組信息來組合拼湊成一個(gè)整體,這里我選擇了以下數(shù)據(jù)組成一個(gè)字典dict:

{'City':'','PYQuanPin':'','Province':'','PYInitial':'','Sex':0,'Signature':'','Signature':'','NickName':''}

通過以上一個(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é)合的方式:

with open('record.txt','w') as f:    print(f'你們共有{count}位共同好友(若除性別外其它信息為空,不在此記錄),他們分別是:')    f.write(f'你們共有{count}位共同好友,他們分別是:')    for i in display:        print(i)        try:            f.write(i+'')        except:            f.write('該好友信息中含有字符無法識(shí)別,請(qǐng)?jiān)诖翱谥胁榭?#39;)

回顧

整個(gè)流程下來,涉及到的就是itchat接口的使用、將信息賦值給list、獲取兩個(gè)list公共元素、將信息寫入txt文件這四部分。

除了itchat接口獲取好友數(shù)據(jù)看著復(fù)雜外,別的都是基礎(chǔ)語法。而itchat相關(guān)的代碼就幾行,所以你說,python是不是賊好用?

代碼下載

除了代碼外,這里我也將py文件封裝成了exe文件來直接下載,這樣即使電腦沒裝python或者你不用python也可以拿來玩了。

04

消息轟炸

準(zhǔn)備

  • Python3.6 需要安裝python3.6并配置好環(huán)境路徑

  • 安裝好python后,打開電腦的CMD終端輸入pip install itchat安裝itchat模塊

  • 需要設(shè)置好默認(rè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

教你幾招用Python玩轉(zhuǎn)微信

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('正在轟炸。。。')

教你幾招用Python玩轉(zhuǎn)微信

itchat.send_msg(msg=message, toUserName=boom_obj)

教你幾招用Python玩轉(zhuǎn)微信

如何使用

  • 打開CMD終端

  • 輸入python

  • 將We.py文件拖入終端

  • 按回車

  • 掃一下彈出來的二維碼,確認(rèn)登錄微信

  • 輸入你要轟炸的人的微信備注(!!!一定要是微信好友的備注,沒有備注請(qǐng)?zhí)砑觽渥?

  • 輸入要轟炸的內(nèi)容

  • 按回車鍵開始轟炸

如何退出

按Ctrl + C 退出轟炸

04

拍一拍

用appium模擬操控手機(jī)并截圖,通過圖像識(shí)別定位好友頭像坐標(biāo),最后用appium模擬雙擊頭像坐標(biāo),以此實(shí)現(xiàn)“拍一拍”功能。

效果展示:

具體步驟:

一、用appium操控手機(jī)

關(guān)于appium的安裝及使用方法,這里就不再贅述了,直接進(jìn)入操作步驟

1.用python打開微信,代碼如下

desired_caps = {'platformName': 'Android',            'deviceName': 'VOG-AL00',            'appPackage': 'com.tencent.mm',            'appActivity': '.ui.LauncherUI',            'noReset': 'true',            'fullReset': 'false'}server = 'http://localhost:4723/wd/hub'driver = webdriver.Remote(server, desired_caps)

難點(diǎn)在于desired_cap參數(shù)的配置,這里再給大家介紹一下:

  • platformName:表示設(shè)備操作系統(tǒng)
    deviceName:表示設(shè)備名稱
    apppackage:表示app程序包名
    appActivity:表示app入口Activity名。

將手機(jī)連接電腦,打開開發(fā)者模式,運(yùn)行此程序,就會(huì)發(fā)現(xiàn)手機(jī)自動(dòng)打開了微信。

二、模擬雙擊頭像

1.原理介紹

我們都知道,微信“拍一拍”是通過雙擊好友頭像實(shí)現(xiàn)的,如下圖所示:

教你幾招用Python玩轉(zhuǎ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)圖片路徑。
如果未找到,則match_result=None;
若找到,則返回如下數(shù)據(jù):

{'result':(570.0, 2771.0), 'rectangle': ((30, 1601), (30, 3941), (1110, 1601), (1110,3941)), 'confidence': 0.999999463558197}

其中:

  • result為匹配圖片在原始圖片上的中心坐標(biāo)點(diǎn),也就是我們要找的點(diǎn)擊點(diǎn);

  • rectangle為匹配圖片在原始圖像上四邊形的坐標(biāo);

  • confidence為匹配相似率。

2.那么該如何在程序中自動(dòng)獲取獲取好友頭像坐標(biāo)呢?

在客戶端appium中,可以確定頭像在屏幕中的像素為140×140
我們可以先把好友頭像保存,再用ps把頭像改為此像素。

然后在程序中創(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中的檢測函數(shù):

driver.save_screenshot('src.png')imgsrc='src.png'imgobj='obj.png'match_result=matchImg(imgsrc, imgobj)

若返回None,則說明聊天窗口沒檢測到好友頭像,繼續(xù)循環(huán);

若檢測到頭像坐標(biāo),則解析返回的坐標(biāo)數(shù)據(jù),用for循環(huán)模擬雙擊坐標(biāo)位置:

if match_result is not None:    result = [match_result['rectangle'][0], match_result['rectangle'][3]]    for i in range(2):        driver.tap(result,100)    print('拍成功')else:    print('沒找到頭像')

這樣就大功告成了

教你幾招用Python玩轉(zhuǎn)微信

是不是很簡單?

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ā)送告警

  • 訂閱號(hào)/服務(wù)號(hào)/企業(yè)微信發(fā)送告警

個(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)…)

教你幾招用Python玩轉(zhuǎ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)微信告警推送。

教你幾招用Python玩轉(zhuǎn)微信
注冊(cè)企業(yè)微信

如果自己非當(dāng)前所屬的企業(yè)微信管理員,或者暫無企業(yè)微信,可以先申請(qǐng)一個(gè),現(xiàn)在申請(qǐng)過程非常簡單,申請(qǐng)入口:https://work.weixin.qq.com/

完成后可通過首頁進(jìn)行人員添加

教你幾招用Python玩轉(zhuǎn)微信

創(chuàng)建應(yīng)用

在開始調(diào)用公眾號(hào)的API之前,我們要先創(chuàng)建一個(gè)應(yīng)用,告警可以發(fā)送到指定的應(yīng)用中,同時(shí)我們還可以對(duì)應(yīng)用授權(quán),以限制可以看到告警的人員范圍。

教你幾招用Python玩轉(zhuǎn)微信

創(chuàng)建完成后,點(diǎn)擊應(yīng)用圖標(biāo)可以看到如下內(nèi)容,記錄下AgentId、Secret的值,后續(xù)會(huì)使用到。

教你幾招用Python玩轉(zhuǎn)微信

點(diǎn)擊企業(yè)信息,查看并記錄企業(yè)ID,后續(xù)會(huì)用上。

教你幾招用Python玩轉(zhuǎn)微信
調(diào)用微信API

實(shí)現(xiàn)企業(yè)微信自動(dòng)推送,需要調(diào)用如下兩個(gè)微信的API,詳細(xì)參數(shù)可查看官方文檔。

  • 獲取token:https://work.weixin.qq.com/api/doc#10013

  • 發(fā)送消息:https://work.weixin.qq.com/api/doc#10167

代碼實(shí)現(xiàn)

如下代碼實(shí)現(xiàn)調(diào)用企業(yè)微信進(jìn)行推送的功能,可結(jié)合實(shí)際業(yè)務(wù)環(huán)境進(jìn)行調(diào)用和修改。

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
#!/usr/bin/env python3# -*- coding: utf-8 -*-# @Time    : 2020/03/18 20:55# @Author  : Walton# @FileName: WeChatAlert.py# @Software: PyCharm# @Blog    :https://vonten.import timeimport jsonimport requestsDay = time.strftime('%Y{y}%m{m}%dopkdopnojk').format(y='年',m='月',d='日')def get_token():    '''    獲取access_token    :return: access_token or None    '''    url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'    values = {'corpid': 'Your corpid',  #輸入企業(yè)ID              'corpsecret': 'Your secret',  #輸入應(yīng)用secret值              }    req = requests.post(url, params=values)    if req.status_code == 200:        return json.loads(req.content)['access_token']    else:        print('access_token獲取失敗')        return Nonedef send_msg(agentid, content):    '''    調(diào)用微信API實(shí)現(xiàn)信息推送    :param agentid: 企業(yè)微信agentId    :param content: 推送內(nèi)容    :return:    '''    url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + get_token()    header = {        'Content-Type': 'application/json'    }    form_data = {        'touser': '@all',        'toparty': ' PartyID1 | PartyID2 ',        'totag': ' TagID1 | TagID2 ',        'msgtype': 'textcard',        'agentid': agentid,        'textcard': {            'title': '自動(dòng)告警',            'description': content,            'url': 'https://vonten.',            'btntxt': '更多'        },        'safe': 0    }    req = requests.post(url, data=json.dumps(form_data).encode('utf-8'), headers=header)    if req.status_code == 200:        return json.loads(req.content)    else:        print('告警推送失敗')        return Noneif __name__ == '__main__':    send_msg('1000002','<div class=\'gray\'>{date}</div> <div class=\'normal\'>以下設(shè)備出現(xiàn)異常,請(qǐng)及時(shí)檢查!</div><div class=\'highlight\'>XXX核心交換機(jī)</div>'.format(date=Day))
結(jié)果測試
教你幾招用Python玩轉(zhuǎn)微信

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多