原文链接一起来用python玩一波微信呀 | 防撤回, 好友分析, 聊天机器人~mp.weixin.qq.com
导语
众所周知,前段时间微信彻底关闭了网页版微信登录入口。于是一大波基于itchat和wxpy的割韭菜项目都失效了。算了,说割韭菜太得罪人了,还是说烂大街的项目吧,然后那些文章标题基本上都是"女朋友xxx了,神级程序猿写了个xxx"之类的。感觉还挺逗的。
跑题了,调侃归调侃,其实这些项目还是挺有意思的,而且也可以激发一下新手的学习热情。所以我决定分享一下最近在网上看到的一个名为WechatPCAPI的半开源包,它的原理是直接hook了微信PC端,从而得到了一些微信PC端的接口,所以不需要依赖于微信网页版。
不过因为这个包是半开源的,所以缺点很明显,它只支持固定版本的微信和固定版本的python。不过这并不妨碍我们拿来玩一玩。今天的内容包括利用这个半开源包制作:微信消息防撤回小程序;
微信好友分析小程序;
微信聊天机器人小程序。
废话不多说,让我们愉快地开始吧~
开发工具
Python版本:3.7.x(注意,必须是3.7版本的)
相关模块:
WechatPCAPI模块;
jieba模块;
wordcloud模块;
requests模块;
pycryptodomex模块;
以及一些python自带的模块。
微信PC端版本:
2.6.8.52
环境搭建
安装python3.7并添加到环境变量,pip安装需要的相关模块即可。 同时,电脑上必须安装2.6.8.52版本的微信。
原理简介
0.微信登录
安装下图所示的微信版本:
然后调用WechatPCAPI这个半开源包就可以实现微信的登录操作啦:
import logging
from queue import Queue
from WechatPCAPI import WechatPCAPI
listen_queue = Queue()
def listen(msg):
listen_queue.put(msg)
logging.basicConfig(level=logging.INFO)
pc_api = WechatPCAPI(on_message=listen, log=logging)
pc_api.start_wechat(block=True)
登录过程和你平时登录微信PC版一样,所以你需要扫码或者点击那个登录确认按钮进行微信登录。
1.微信消息防撤回
原理很简单,就是不断调用:
all_messages = {}
while True:
msg = listen_queue.get()
从而获得微信好友发给自己的所有信息,并用一个字典对象保存下来:
data = msg.get('data', {})
nickname = data['msgfrominfo']['remark_name']
wx_id_search = data['msgfrominfo']['wx_id_search']
info = [int(time.time()), nickname, data['msgcontent']]
if wx_id_search in all_messages:
all_messages[wx_id_search].append(info)
else:
all_messages[wx_id_search] = [info]
当对方撤回消息时,就把对方发过的消息通过文件传输助手重新发一遍给自己,以实现微信消息防撤回的功能:
if u'撤回了一条消息' in info[-1] and 'revokemsg' in info[-1]:
pc_api.send_text(to_user='filehelper', msg=all_messages[wx_id_search])
因为微信用户只能撤回三分钟以内的消息,所以我们写个函数清理一下微信好友三分钟之前发给自己的消息,换句话说,我们只保留最近三分钟的微信消息数据:
'''缓存清理'''
def cleancache():
time_thresh = 180
time_now = int(time.time())
all_messages_new = {}
for key, value in all_messages.items():
value_new = []
for item in value:
if time_now - item[0] < time_thresh:
value_new.append(item)
all_messages_new[key] = value_new
del all_messages
all_messages = all_messages_new
大功告成,完整源代码详见相关文件antiwithdrawal.py。
2.微信聊天机器人
原理和前面的微信消息防撤回类似,主要是添加个图灵机器人:
'''图灵机器人'''
def tuling(msg):
key = random.choice(['fb8fcc789ef4473bb96e790b45a07832', 'a65aa00b424047d88554b744eaf07597', '87490f6fe8f640d89b9f97c476a5dac4', '7b84344e82ba4409a9e99b1abf0386c2'])
api_url = 'http://www.tuling123.com/openapi/api?key=%s&info=%s' % (key, msg)
res = requests.get(api_url)
res.encoding = 'utf-8'
res_json = res.json()
return res_json['text']
然后回复对应的微信好友就行啦:
wx_id = data['msgfrominfo']['wx_id']
reply_msg = tuling(data['msgcontent'])
pc_api.send_text(to_user=wx_id, msg=reply_msg)
大功告成,完整源代码详见相关文件chatbot.py。
3.微信好友分析
刚开始看文档的时候以为可以获得微信好友的详细数据的,结果测试的时候才发现只能获取微信好友的微信号和昵称这些基本数据。性别,所在地这些数据是无法获取的,真是尴尬。所以只能画个好友词云呗:
nicknames = []
for key, value in pc_api.get_friends().items():
if key in ['fmessage', 'floatbottle', 'filehelper'] or 'chatroom' in key:
continue
nicknames.append(value['wx_nickname'])
stopwords = open('./stopwords.txt', 'r', encoding='utf-8').read().split('\n')[:-1]
words = statisticsWF(nicknames, stopwords=stopwords)
wc = WordCloud(font_path='simkai.ttf', background_color='white', max_words=2000, width=1920, height=1080, margin=5)
wc.generate_from_frequencies(words)
wc.to_file('微信好友昵称词云.png')
大功告成,完整源代码详见相关文件analysisfriends.py。
效果展示
录视频太麻烦了,随便截几个效果图吧。
0.微信登录
微信登录成功时终端打印的数据如下:
1.微信消息防撤回
比如你们在聊天,对方撤回了一条消息:
然后你可以查看一下文件传输助手:
显然,你的好友欺骗了你。
2.微信聊天机器人
随便截个和机器人聊天的效果图吧(讲道理图灵机器人有点蠢T_T):
3.微信好友分析
T_T不是我的微信号,借的别人不用了的微信号跑的,所以就不打码了: