當(dāng) Python 遇到微信,會(huì)碰撞出什么?
↑?關(guān)注 + 星標(biāo)?,每天學(xué)Python新技能
后臺(tái)回復(fù)【大禮包】送你Python自學(xué)大禮包
自從微信禁止網(wǎng)頁版登陸之后,itchat 庫實(shí)現(xiàn)的功能也就都不能用了,那現(xiàn)在 Python 還能操作微信嗎?答案是還可以。
目前有一個(gè)項(xiàng)目?WechatPCAPI 可以對微信進(jìn)行操作,簡單來說它是直接操作 PC 版微信客戶端的,當(dāng)然它有一定不足之處就是:PC 版微信客戶端和 Python 都需要使用指定版本的,本文我們使用的 Python 版本為 3.7.6,微信客戶端使用版本為?2.6.8.52,WechatPCAPI?的 GitHub 地址為:https://github.com/Mocha-L/WechatPCAPI。
獲取好友列表
WechatPCAPI 提供了方法 get_friends(),該方法返回信息包括:好友、群和公眾號的列表信息,信息內(nèi)容主要包括:微信號、昵稱和自己設(shè)置的備注。
我們使用獲取的昵稱做個(gè)簡單的詞云展示,代碼實(shí)現(xiàn)如下所示:
logging.basicConfig(level=logging.INFO)
def?on_message(message):
?pass
def?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
?#?用逗號隔開詞語
?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')
看一下效果:

消息防撤回
我們在使用微信和好友聊天時(shí),對方有時(shí)會(huì)有撤回消息的情況,正常情況下,我們是不知道好友撤回的消息是什么的,通過 WechatPCAPI 就可以實(shí)現(xiàn)消息防撤回的功能。
我們知道通常撤回的消息是點(diǎn)擊撤回操作前一步發(fā)送的內(nèi)容,當(dāng)然也可能撤回的是前兩步、三步 ... 的消息,這里我們只對撤回前一步的消息做處理,基本思路是:我們將撤回前一步發(fā)送的消息存一下,當(dāng)對方點(diǎn)擊撤回操作時(shí),我們再將前一步的消息再次返回給自己。
下面看一下實(shí)現(xiàn)代碼:
logging.basicConfig(level=logging.INFO)
queue_recved_event?=?Queue()
def?on_message(msg):
????queue_recved_event.put(msg)
def?login():
????pre_msg?=?''
????#?初始化微信實(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('登陸成功')
????while?True:
????????msg?=?queue_recved_event.get()
????????data?=?msg.get('data')
????????sendinfo?=?data.get('sendinfo')
????????data_type?=?str(data.get('data_type'))
????????msgcontent?=?str(data.get('msgcontent'))
????????is_recv?=?data.get('is_recv')
????????print(msg)
????????if?data_type?==?'1'?and?'revokemsg'?not?in?msgcontent:
????????????pre_msg?=?msgcontent
????????if?sendinfo?is?not?None?and?'revokemsg'?in?msgcontent:
????????????user?=?str(sendinfo.get('wx_id_search'))
????????????recall?=?'撤回的消息:'?+?pre_msg
????????????wx_inst.send_text(to_user=user,?msg=recall)
看一下操作效果:

源碼和微信安裝包獲取
鏈接:https://pan.baidu.com/s/19VGuEqByiK0V0tuE-jQPZQ
提取碼:lad2
見面禮
掃碼加我微信備注「三劍客」送你上圖三本Python入門電子書
推薦閱讀
點(diǎn)分享 點(diǎn)收藏 點(diǎn)點(diǎn)贊 點(diǎn)在看





