作者 | XksA
责编 | 胡巍巍
笔者这几天,简单看了一下Python里的wxpy模块后,搭配Matplotlib模块撰写的一个wxpy基本使用方法教程,也研究了一些比较好玩的东西,主要利用了wxpy对微信进行一系列的自动化操作。
比如利用wxpy登录微信、给微信文件助手发送消息、给单个微信好友发送消息、微信消息群发(谨慎使用 )以及微信聊天机器的搭建使用过程。
你以为wxpy只能这样?No,最后笔者 利用wxpy获取了我的微信好友的数量、性别、城市、省份、昵称及个性签名,和关注的微信公众号昵称、公众号简介信息。
搭配Matplotlib进行了一系列数据的可视化,中间参杂着笔者 的一些东倒西歪的文字分析,从这些,我解读出了一个真实的我(文末正解)。
wxpy基本介绍与安装
1.wxpy基本介绍 wxpy基于itchat,使用了Web微信的通讯协议,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展。实现了微信登录、收发消息、搜索好友、数据统计、微信公众号、微信好友、微信群基本信息获取等功能。
可用来实现各种微信个人号的自动化操作。
方法一:直接安装
方法二:豆瓣源安装(推荐)
pip install -i https://pypi.douban.com/simple/ wxpy
实践出真知
1.给自己的文件传输助手发消息 from wxpy import * bot = Bot(cache_path=True ) bot.file_helper.send("hello,I'm XksA!" )
BOT类基本参数介绍:
cache_path – 设置当前会话的缓存路径,并开启缓存功能;为 None (默认) 则不开启缓存功能。 开启缓存后可在短时间内避免重复扫码,缓存失效时会重新要求登陆。 设为 True 时,使用默认的缓存路径 ‘wxpy.pkl’。 qr_path – 保存二维码的路径 console_qr – 在终端中显示登陆二维码
运行后弹出一个二维码图片,用微信扫码登录即可,再回来看手机消息。
微信文件传输助手
特别提醒:使用的微信账号不能为新注册的账号,不然会报错Keyerror:'pass_ticket'。
2.给指定朋友发送消息 bot = Bot(cache_path="H:PyCodingWxpy_testwxpy.pkl" ) my_friend = bot.friends().search('极简XksA' )[0 ] my_friend.send('hello 极简XksA!' )''' 除此之外还有可以发送一下内容,自己动手尝试吧 发送图片 my_friend.send_image('hello.png') 发送视频 my_friend.send_video('hello.mp4') 发送文件 my_friend.send_file('hello.rar') '''
运行结果:
单独好友
3.群发消息(今早醒来突发奇想,给每人发个早安!) import time# 初始化一个机器人对象 # cache_path为登录状态缓存路径,给定值为第一次登录生成的缓存文件路径 bot = Bot(cache_path="H:PyCodingWxpy_testwxpy.pkl" )# 群发消息(谨慎使用,哈哈哈) my_friends = bot.friends(update=False ) my_friends.pop(0 ) # 去除列表第一个元素(自己) for i in range(120 ): friend = my_friends[i] friend .send( time.sleep(2 ) friend .send(
运行效果:
群发消息效果图
4.获取自己的微信好友数、活跃微信群数、关注微信公众号数 t0 = bot.friends(update =False ) print("我的好友数:" +str (len (t0)-1 )) t1 = bot.groups(update =False ) print("我的微信群聊数:" +str (len (t1))) t2 = bot.mps(update =False ) print("我关注的微信公众号数:" +str (len (t2)))
运行结果:
我的好友数:242 我的微信群聊数:6 我关注的微信公众号数:125
5.个人聊天机器人搭建(基于自己的) (1)自己的聊天机器人 my_friend = bot.friends().search('极简XksA' )[0 ] my_friend.send('hello 极简XksA!' )@bot.register(my_friend) def my_friednd_message (msg) : print('[接收]' + str(msg)) if msg.type != 'Text' :
ret = '你给我看了什么![拜托]' elif "你来自哪里" in str(msg): ret = "我来自极简XksA" else : ret = '我爱你' print('[发送]' + str(ret)) return ret embed()
(2)聊天效果图
基于自己的聊天机器人
6.个人聊天机器人搭建(基于图灵机器人的) (1)事前准备 点击这里注册图灵机器人账号,然后创建一个机器人,即可获得属于你的图灵机器人API。
图灵机器人API 获取
(2) 创建属于自己的聊天机器人
bot = Bot(cache_path="H:PyCodingWxpy_testwxpy.pkl" ) tuling = Tuling(api_key='你的图灵接口api' ) print('极简机器人已经启动' ) my_friednd = bot.friends().search('极简XksA' )[0 ]@bot.register(my_friend) def reply_my_friend (msg) : tuling.do_reply(msg) embed()
def auto_ai (text) :
url = "http://www.tuling123.com/openapi/api" api_key = "你的图灵接口api" payload = { "key" : api_key, "info" : text, "userid" : "老表" } r = requests.post(url, data=json.dumps(payload)) result = json.loads(r.content) return "[极简机器人] " + result["text" ] bot = Bot(cache_path="H:PyCodingWxpy_testwxpy.pkl" ) print('极简机器人已经启动' ) my_friednd = bot.friends().search('极简XksA' )[0 ]@bot.register(my_friednd) def my_friednd_message (msg) : print('[接收]' + str(msg)) if msg.type != 'Text' : ret = '你给我看了什么![拜托]' else : ret = auto_ai(msg.text) print('[发送]' + str(ret)) return ret embed()
(3)聊天效果图 基本测试,图灵机器人可以实现查询天气、车票、翻译、基本聊天等功能,比我们自己写的强,哈哈哈。
个人聊天效果图
7.来点有趣的 (1)获取微信好友性别、位置分布数据 ''' author : 极简XksA data : 2018.8.26 goal : 获取微信好友性别、分布、微信昵称,可视化分析 ''' from wxpy import * bot = Bot(cache_path="H:PyCodingWxpy_testwxpy.pkl" ) my_friends = bot.friends(update=False )''' stats_text 函数:帮助我们简单统计微信好友基本信息 简单的统计结果的文本 :param total: 总体数量 :param sex: 性别分布 :param top_provinces: 省份分布 :param top_cities: 城市分布 :return: 统计结果文本 ''' print(my_friends.stats_text())
运行结果:
老表 共有 245 位微信好友 男性: 140 (57.1 %) 女性: 79 (32.2 %)TOP 10 省份 湖北: 88 (35.92 %) 广东: 16 (6.53 %) 北京: 12 (4.90 %) 湖南: 5 (2.04 %) 上海: 5 (2.04 %) 浙江: 4 (1.63 %) 河南: 4 (1.63 %) 安徽: 3 (1.22 %) 山东: 3 (1.22 %) 福建: 3 (1.22 %)TOP 10 城市 荆州: 25 (10.20 %) 武汉: 22 (8.98 %) 黄石: 21 (8.57 %) 海淀: 5 (2.04 %) 广州: 5 (2.04 %) 深圳: 4 (1.63 %) 黄冈: 4 (1.63 %) 杭州: 3 (1.22 %) 长沙: 3 (1.22 %) 昌平: 3 (1.22 %)
(2)利用Matplotlib进行数据可视化
1)性别占比饼图 from pylab import * mpl.rcParams['font.sans-serif' ] = ['SimHei' ]import matplotlib.pyplot as plt labels = ['男性' , '女性' , '其他' ] sizes = [57.1 , 32.2 , 10.7 ] explode = (0 , 0.1 , 0 ) fig1, ax1 = plt.subplots() ax1.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%' , shadow=True , startangle=90 ) ax1.axis('equal' )
plt.legend() plt.show()
效果图:
性别占比饼图
我的天啊(自绘),我的微信好友居然是男性居多,嘿嘿,也正常,笔者从不沾花惹草,当然女生也不是特别少嘿,包含了家人朋友还有一些社会人嘿。
2)城市分布条形图 import numpy as npimport matplotlib.pyplot as plt n_groups = 10 city_weight = (10.2 ,8.98 ,8.57 ,2.04 ,2.04 ,1.63 ,1.63 ,1.22 ,1.22 ,1.22 ) fig, ax = plt.subplots() index = np.arange(n_groups) bar_width = 0.35 opacity = 0.4 error_config = {'ecolor' : '0.3' } rects1 = ax.bar(index, city_weight, bar_width,alpha=opacity, color='b' , error_kw=error_config,label='城市' ) ax.set_xlabel('城市名称' ) ax.set_ylabel('数据占比(%)' ) ax.set_title('好友城市Top10' ) ax.set_xticks(index + bar_width / 2 ) ax.set_xticklabels(('荆州' , '武汉' , '黄石' , '海淀' , '广州' ,'深圳' , '黄冈' , '杭州' , '长沙' , '昌平' )) ax.legend() fig.tight_layout() plt.show()
效果图:
城市发布图
从图中容易看出X先生好友多在荆州,那猜猜X先生是哪里的人?没错,就是荆州人嘿,你的好友里是不是也是家乡人最多呢?(突然地想家!)
3)好友省份分布图
from pyecharts import Map value = [359.2, 65.3, 49.0, 20.4, 20.4, 16.3, 16.3, 12.2, 12.2,12.2] attr = [ "湖北" , "广东" , "北京" , "湖南" , "上海" , "浙江" , "河南" , "安徽" , "山东" ,"福建" ] map = Map("好友分布省份Top10" , width=600, height=400) map.add( "" , attr, value, maptype="china" , is_visualmap=True, visual_text_color="#000" , ) map.render()
效果图:
好友省份分布图
是不是很直接明了,我的好友基本在我国中南部,你知道你的好友分布吗?我在长江中下游,这里有水有山,有花有草,有乐园。
4)获取好友微信昵称和个性签名,词云分析 bot = Bot(cache_path="H:PyCodingWxpy_testwxpy.pkl" ) my_friends = bot.friends(update=False) nick_name = '' wx_signature = '' for friend in my_friends: nick_name = nick_name + friend.raw['NickName'] wx_signature = wx_signature + friend.raw['Signature'] nick_name = jiebaclearText(nick_name) wx_signature = jiebaclearText(wx_signature) make_wordcloud(nick_name,1) make_wordcloud(wx_signature,2)
效果图:
微信好友昵称
我的微信好友昵称,有点复杂,搞淘宝的,浩浩,石头,还有创业的,当然最醒目的是老师,都说老师是园丁,谢谢您养育了我们(突发其感)。
微信好友个性签名
我发现他们可以练成一段话:我们所有的人生,就是平凡的自己最伟大,遇见一个美好的自己,一生不止生活,加油。。。
5)获取关注微信公众号名称和基本简介,词云分析 wx_public_name = ''
wx_pn_signature = '' my_wx_pn = bot.mps(update=False) for wx_pn in my_wx_pn: wx_public_name = wx_public_name + wx_pn.raw['NickName'] wx_pn_signature = wx_pn_signature + wx_pn.raw['Signature'] wx_public_name = jiebaclearText(wx_public_name) make_wordcloud(wx_public_name,3) wx_pn_signature = jiebaclearText(wx_pn_signature) make_wordcloud(wx_pn_signature,4)
效果图:
关注微信公众号昵称词云图
看出什么蹊跷没?你问我爱你有多深,你看看Python就知道了哈哈!
公众号简介词云图
基本可以看出我关注的都是积极向上的嘿,Java、Python、英语、数据、爬虫…...
后言
总结,从上面的数据可视化结果,我推测出这样的我:X先生,微信昵称老表,性别男,坐标地址湖北荆州,好友中男性居多,说明事业心重,女性也不少,说明女人缘也不错,微信好友个性签名基本积极向上。
有生活,有奋斗,有喜欢,所关注微信公众号,大多是技术相关的。专注于Python,也有时候三心二意玩Java,应该是一名大学生,还关注有大学官方公众号.....哈哈哈(以上纯属笔者自卖自夸,好像还蛮有道理的嘿!)
作者:XksA,大三在读的师范技术生,主要学习Python web、数据分析、可视化方面,个人公众号 极简XksA 长期分享学习笔记,学习资料,欢迎交流学习。
声明:本文为作者投稿,版权归对方所有。
CSDN 公众号秉持着「与千万技术人共成长」理念,不仅以「极客头条」、「畅言」栏目在第一时间以技术人的独特视角描述技术人关心的行业焦点事件,更有「技术头条」专栏,深度解读行业内的热门技术与场景应用,让所有的开发者紧跟技术潮流,保持警醒的技术嗅觉,对行业趋势、技术有更为全面的认知。
如果你有优质的文章,或是行业热点事件、技术趋势的真知灼见,或是深度的应用实践、场景方案等的新见解,欢迎联系 CSDN 投稿, 联系方式:微信(guorui_1118,请备注投稿+姓名+公司职位),邮箱(guorui@csdn.net)。
————— 推荐阅读 —————