zs820553471 发表于 2018-12-2 16:21

带你使用wxpy创建自己的聊天机器人(外加微信接口基本数据可视化)

本帖最后由 zs820553471 于 2018-12-2 17:03 编辑

转载注明作者:简说Python,并注明来源~

##### 文章目录

一、wxpy基本介绍与安装

1.wxpy基本介绍

2.wxpy安装

二、实践出真知

1.给自己的文件传输助手发消息

2.给指定朋友发送消息

3.群发消息(今早醒来突发奇想,给每人发个早安!)

4.获取自己的微信好友数、活跃微信群数、关注微信公众号数

5.个人聊天机器人搭建(基于自己的)

6.个人聊天机器人搭建(基于图灵机器人的)

7.来点有趣的

(1)获取微信好友性别、位置分布数据

(2)利用Matplotlib进行数据可视化

1)性别占比饼图

2)城市分布条形图

3)好友省份分布图

4)获取好友微信昵称和个性签名,词云分析
5)获取关注微信公众号名称和基本简介,词云分析

三、后言

>**前言**
本文是X先生这几天简单看了一下Python里的`wxpy`模块后,搭配`matplotlib`模块撰写的一个`wxpy`基本使用方法,主要利用了`wxpy`对微信进行一系列的自动化操作,比如利用`wxpy`登录微信、给微信文件助手发送消息、给单个微信好友发送消息、微信消息群发(谨慎使用[/邪笑])以及微信聊天机器的搭建使用过程,你以为`wxpy`只能这样?No,最后X先生利用`wxpy`获取了我的微信好友的数量、性别、昵称及个性签名,和关注的微信公众号昵称、公众号简介信息,搭配`matplotlib`进行了一系列数据的可视化,中间参杂着X先生的一些东倒西歪的文字分析,从这些,,,我解读出了一个真实的我(文末正解)。

### 一、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')
# 发送消息
my_friend.send('hello 极简XksA!')
'''
除此之外还有可以发送一下内容,自己动手尝试吧
发送图片
my_friend.send_image('hello.png')
发送视频
my_friend.send_video('hello.mp4')
发送文件
my_friend.send_file('hello.rar')
'''
```
运行结果:

#### 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
      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')
my_friend.send('hello 极简XksA!')

# 自动回复
# 如果想对所有好友实现机器人回复把参数 my_friend 改成 chats =
@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')
# 如果想对所有好友实现机器人回复把参数my_friend改成chats =
# 使用图灵机器人自动与指定好友聊天
@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')
# 如果想对所有好友实现机器人回复把参数my_friend改成chats =
@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 =
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 =
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/20180828142013447?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)
>基本可以看出我关注的都是积极向上的嘿,真优秀,搞技术的人应该有的公众号(简说Python [偷笑]),嘿嘿,Java,Python,英语,数据,爬虫...

### 三、后言
>**总结**
从上面的数据可视化结果,我推测出这样的我:X先生,微信昵称老表,性别男,坐标地址湖北荆州,好友中男性居多,说明事业心重,女性也不少,说明女人缘也不错,微信好友个性签名基本积极向上,有`生活`,有`奋斗`,有`喜欢`,所关注微信公众号大多数技术相关的,专注于`Python`,也有时候三心二意玩`Java`,应该是一名大学生,还关注有大学官方公众号。。。哈哈哈(以上纯属X先生自卖自夸,好像还蛮有道理的嘿!)


撰写本文纯是笔者兴趣,嘿嘿,欢迎交流学习!
简说Python 主要研究Python爬虫,数据分析及可视化,长期分享学习笔记和学习资源,欢迎留言交流。
本文参考文档:
1.(https://wxpy.readthedocs.io/zh/latest/messages.html)
2.(https://matplotlib.org/)
本文所有源代码已经上传到码云上:(https://gitee.com/ShaErHu/wxpy_matplotlib_learning)

zs820553471 发表于 2018-12-4 10:05

吾爱支持 发表于 2018-12-2 23:16
楼主博客可否有地址,贴子有些图片看不到了……

这是博客地址:https://blog.csdn.net/qq_39241986/article/details/82050472
由于吾爱上传图片,图片插入文中有点复杂,所以没有上传图片,望谅解
ps:如果管理员觉得不可以发布博客地址请留言说明,我马上删除,谢谢。

吾爱支持 发表于 2018-12-2 23:16

zs820553471 发表于 2018-12-2 16:24
本文转自我自己的博客,欢迎留言交流~

楼主博客可否有地址,贴子有些图片看不到了……

zs820553471 发表于 2018-12-2 16:24

本文转自我自己的博客,欢迎留言交流~

kuysoft 发表于 2018-12-2 16:33

能用这个做个淘宝客机器人吗

zs820553471 发表于 2018-12-2 16:35

kuysoft 发表于 2018-12-2 16:33
能用这个做个淘宝客机器人吗

接口不一样,这个是wxpy,专门用做微信的

ttxs69 发表于 2018-12-2 17:33

感谢大神分享

qq6227575 发表于 2018-12-2 18:03

现在拍森还是真厉害,准备学习中。

lanail 发表于 2018-12-2 20:10

Pythonh正解

吾爱支持 发表于 2018-12-2 23:15

感谢楼主分享的……。

我也在学python,这个模块实例值得学习……感谢……

Lami52 发表于 2018-12-3 13:19

有点意思,先氺一下,慢慢学习
页: [1] 2 3
查看完整版本: 带你使用wxpy创建自己的聊天机器人(外加微信接口基本数据可视化)