# Wxpy_matplotlib学习 **Repository Path**: kang2018/wxpy_matplotlib_learning ## Basic Information - **Project Name**: Wxpy_matplotlib学习 - **Description**: 本代码简单介绍了Python的Wxpy模块的基本使用(文件发送,聊天机器人,微信好友、公众号、群聊基本信息获取)和matplotlib画图(饼状图、条形图、词云图) - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 6 - **Created**: 2018-08-31 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 欢迎微信关注:极简XksA! ### 一、wxpy基本介绍与安装 #### 1.wxpy基本介绍 wxpy基于itchat,使用了 Web 微信的通讯协议,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展。实现了微信登录、收发消息、搜索好友、数据统计、微信公众号、微信好友、微信群基本信息获取等功能。 可用来实现各种微信个人号的自动化操作。 #### 2.wxpy安装 方法一:直接安装 ```python pip install wxpy ``` 方法二:豆瓣源安装(推荐) ``` pip install -i https://pypi.douban.com/simple/ wxpy ``` ### 二、实践出真知 #### 1.给自己的文件传输助手发消息 ```python 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 – 在终端中显示登陆二维码 ``` 运行后弹出一个二维码图片,用微信扫码登录即可,再回来看手机消息。 ![微信文件传输助手](https://img-blog.csdn.net/20180825205008540?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) *特别提醒:*使用的微信账号不能为新注册的账号,不然会报错`KeyError: 'pass_ticket'`。 #### 2.给指定朋友发送消息 ```python # 初始化一个机器人对象 # cache_path缓存路径,给定值为第一次登录生成的缓存文件路径 bot = Bot(cache_path="H:\PyCoding\Wxpy_test\wxpy.pkl") # 查找朋友"极简XksA" 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') ''' ``` 运行结果: ![好友](https://img-blog.csdn.net/20180825214520129?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) #### 3.群发消息(今早醒来突发奇想,给每人发个早安!) ```python import time # 初始化一个机器人对象 # cache_path为登录状态缓存路径,给定值为第一次登录生成的缓存文件路径 bot = Bot(cache_path="H:\PyCoding\Wxpy_test\wxpy.pkl") # 群发消息(谨慎使用,哈哈哈) my_friends = bot.friends(update=False) my_friends.pop(0) # 去除列表第一个元素(自己) for i in range(120): friend = my_friends[i] friend.send('Good morning,the early bird catches the worm!(早上好,早起的鸟儿有虫吃!)') time.sleep(2) friend.send('不用回复,生活中一起加油!') ``` 运行效果: ![群发消息效果图](https://img-blog.csdn.net/2018082807563684?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) #### 4.获取自己的微信好友数、活跃微信群数、关注微信公众号数 ```python # 获取所有好友[返回列表包含Chats对象(你的所有好友,包括自己)] t0 = bot.friends(update=False) # 查看自己好友数(除开自己) print("我的好友数:"+str(len(t0)-1)) # 获取所有微信群[返回列表包含Groups对象] t1 = bot.groups(update=False) # 查看微信群数(活跃的) print("我的微信群聊数:"+str(len(t1))) # 获取所有关注的微信公众号[返回列表包含Chats对象] t2 = bot.mps(update=False) # 查看关注的微信公众号数 print("我关注的微信公众号数:"+str(len(t2))) ``` 运行结果: ```python # 注:如果直接把t0、t1、t2打印出就是对应得名称(不同类型,自己可以试一下) 我的好友数:242 我的微信群聊数:6 我关注的微信公众号数:125 ``` #### 5.个人聊天机器人搭建(基于自己的) #####(1)自己的聊天机器人 ```python # 查找聊天对象 my_friend = bot.friends().search('极简XksA')[0] my_friend.send('hello 极简XksA!') # 自动回复 # 如果想对所有好友实现机器人回复把参数 my_friend 改成 chats = [Friend] @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 # 进入交互式的 Python 命令行界面,并堵塞当前线程 embed() ``` #####(2)聊天效果图 ![基于自己的聊天机器人](https://img-blog.csdn.net/20180827220529783?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) #### 6.个人聊天机器人搭建(基于图灵机器人的) #####(1)事前准备 点击这里[注册图灵机器人账号](http://www.tuling123.com/),然后创建一个机器人,即可获得属于你的图灵机器人api。 ![图灵机器人api](https://img-blog.csdn.net/2018082615522173?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) #####(2) 创建属于自己的聊天机器人 - 方法一:使用`Tuling`类,简单实现 ```python # 登录缓存路径,第一次设置为True # 生成缓存文件wxpy.pkl后,为该文件路径 bot = Bot(cache_path="H:\PyCoding\Wxpy_test\wxpy.pkl") tuling = Tuling(api_key='你的图灵接口api') print('极简机器人已经启动') # 我的小号,测试需谨慎 my_friednd = bot.friends().search('极简XksA')[0] # 如果想对所有好友实现机器人回复把参数my_friend改成chats = [Friend] # 使用图灵机器人自动与指定好友聊天 @bot.register(my_friend) def reply_my_friend(msg): tuling.do_reply(msg) # 进入交互式的 Python 命令行界面,并堵塞当前线程 embed() ``` - 方法二:自己手动发送`post`请求,有点麻烦哈哈哈~ ```python 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:\PyCoding\Wxpy_test\wxpy.pkl") print('极简机器人已经启动') # 我的小号,测试需谨慎 my_friednd = bot.friends().search('极简XksA')[0] # 如果想对所有好友实现机器人回复把参数my_friend改成chats = [Friend] @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 # 进入交互式的 Python 命令行界面,并堵塞当前线程 embed() ``` #####(3)聊天效果图 基本测试,图灵机器人可以实现查询天气、车票、翻译、基本聊天等功能,比我们自己写的,强,,,哈哈哈。 ![个人聊天效果图](https://img-blog.csdn.net/20180826160823200?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) #### 7.来点有趣的 ##### (1)获取微信好友性别、位置分布数据 ```python ''' author : 极简XksA data : 2018.8.26 goal : 获取微信好友性别、分布、微信昵称,可视化分析 ''' from wxpy import * # 初始化一个机器人对象 # cache_path缓存路径,给定值为第一次登录生成的缓存文件路径 bot = Bot(cache_path="H:\PyCoding\Wxpy_test\wxpy.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()) ``` 运行结果: ```python 老表 共有 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)性别占比饼图 ```python from pylab import * mpl.rcParams['font.sans-serif'] = ['SimHei'] # 上面两行代码解决matplotlib绘图不能显示中文问题 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() ``` 效果图: ![性别占比饼图](https://img-blog.csdn.net/20180827131340729?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) >我的天啊(自绘),我的微信好友居然是男性居多,嘿嘿,也正常,笔者从不沾花惹草,当然女生也不是特别少嘿,包含了家人朋友还有一些社会人嘿。 ###### 2)城市分布条形图 ```python import numpy as np import 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() ``` 效果图: ![城市发布图](https://img-blog.csdn.net/20180827131305115?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) >从图中容易看出X先生好友多在荆州,那猜猜X先生是哪里的人?没错,就是荆州人嘿。 ###### 3)好友省份分布图 ```python from pyecharts import Map # matplotlib的方法比较麻烦,显示起来还没pyecharts 好,就用了pyecharts 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() ``` 效果图: ![好友省份分布图](https://img-blog.csdn.net/20180827131556448?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) >是不是很直接明了,我的好友基本在我国中南部,你知道你的好友分布吗? ###### 4)获取好友微信昵称和个性签名,词云分析 ```python bot = Bot(cache_path="H:\PyCoding\Wxpy_test\wxpy.pkl") #获取好友列表(包括自己) my_friends = bot.friends(update=False) # 微信昵称 nick_name = '' # 微信个性签名 wx_signature = '' for friend in my_friends: # 微信昵称:NickName nick_name = nick_name + friend.raw['NickName'] # 个性签名:Signature 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) ``` 效果图: ![微信昵称](https://img-blog.csdn.net/2018082714353397?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) >我的微信好友昵称,有点复杂,搞淘宝的,浩浩,石头,还有创业,当然最醒目的是老师,都说老师是园丁,谢谢您养育了我们(突发其感)。 ![个性签名](https://img-blog.csdn.net/20180827143653555?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) >我发现他们可以练成一段话:我们所有的人生,就是平凡的自己最伟大,遇见一个美好的自己,一生不止生活,加油。。。 ###### 5)获取关注微信公众号名称和基本简介,词云分析 ```python # 获取微信公众号名称 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) ``` 效果图: ![关注微信公众号昵称词云图](https://img-blog.csdn.net/2018082715440379?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) >看出什么蹊跷没?你问我爱你有多深,你看看Python就知道了哈哈! ![公众号简介词云图](https://img-blog.csdn.net/20180827154432989?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) >基本可以看出我关注的都是积极向上的嘿,真优秀,搞技术的人应该有的公众号(极简XksA[偷笑]),嘿嘿,Java,Python,英语,数据,爬虫... ### 三、后言 撰写本文纯是笔者兴趣,嘿嘿,欢迎交流学习! X先生主要研究Python数据分析及可视化,个人公众号:极简XksA,长期分享学习笔记和学习资源,先在新建了一个学习交流群,欢迎进群学习交流。 本文参考文档: 1.[wxpy官方介绍文档](https://wxpy.readthedocs.io/zh/latest/messages.html) 2.[matplotlib官方介绍文档](https://matplotlib.org/) 本文所有源代码已经上传到码云上:[wxpy_matplotlib_learning](https://gitee.com/ShaErHu/wxpy_matplotlib_learning) ![极简学Python](https://img-blog.csdn.net/20180827155338880?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MjQxOTg2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)