如何用 Python 测出你和微信好友的亲密程度?

作者 | XksA

责编 | 胡巍巍

笔者这几天,简单看了一下Python里的wxpy模块后,搭配Matplotlib模块撰写的一个wxpy基本使用方法教程,也研究了一些比较好玩的东西,主要利用了wxpy对微信进行一系列的自动化操作。

比如利用wxpy登录微信、给微信文件助手发送消息、给单个微信好友发送消息、微信消息群发(谨慎使用)以及微信聊天机器的搭建使用过程。

你以为wxpy只能这样?No,最后笔者利用wxpy获取了我的微信好友的数量、性别、城市、省份、昵称及个性签名,和关注的微信公众号昵称、公众号简介信息。

搭配Matplotlib进行了一系列数据的可视化,中间参杂着笔者的一些东倒西歪的文字分析,从这些,我解读出了一个真实的我(文末正解)。

wxpy基本介绍与安装

1.wxpy基本介绍

wxpy基于itchat,使用了Web微信的通讯协议,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展。实现了微信登录、收发消息、搜索好友、数据统计、微信公众号、微信好友、微信群基本信息获取等功能。

可用来实现各种微信个人号的自动化操作。

方法一:直接安装

pipinstall wxpy

方法二:豆瓣源安装(推荐)

实践出真知

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

fromwxpyimport*

# 初始化一个机器人对象

bot = Bot(cache_path=True)

# 向文件传输助手发送消息

bot.file_helper.send("hello,I'm XksA!")

BOT类基本参数介绍:

cache_path –

设置当前会话的缓存路径,并开启缓存功能;为None(默认) 则不开启缓存功能。

开启缓存后可在短时间内避免重复扫码,缓存失效时会重新要求登陆。

设为True时,使用默认的缓存路径 ‘wxpy.pkl’。

qr_path – 保存二维码的路径

console_qr – 在终端中显示登陆二维码

运行后弹出一个二维码图片,用微信扫码登录即可,再回来看手机消息。

微信文件传输助手

2.给指定朋友发送消息

# 初始化一个机器人对象

# cache_path缓存路径,给定值为第一次登录生成的缓存文件路径

bot = Bot(cache_path="H:PyCodingWxpy_testwxpy.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.群发消息(今早醒来突发奇想,给每人发个早安!)

import time

# 初始化一个机器人对象

# cache_path为登录状态缓存路径,给定值为第一次登录生成的缓存文件路径

bot = Bot(cache_path="H:PyCodingWxpy_testwxpy.pkl")

# 群发消息(谨慎使用,哈哈哈)

my_friends = bot.friends(update=False)

my_friends.pop()# 去除列表第一个元素(自己)

foriinrange(120):

friend= my_friends[i]

friend.send('Good morning,the early bird catches the worm!(早上好,早起的鸟儿有虫吃!)')

time.sleep(2)

friend.send('不用回复,生活中一起加油!')

运行效果:

群发消息效果图

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

# 获取所有好友[返回列表包含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)))

运行结果:

# 注:如果直接把t0、t1、t2打印出就是对应得名称(不同类型,自己可以试一下)

我的好友数:242

我的微信群聊数:6

我关注的微信公众号数:125

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

# 查找聊天对象

my_friend = bot.friends().search('极简XksA')[]

my_friend.send('hello 极简XksA!')

# 自动回复

# 如果想对所有好友实现机器人回复把参数 my_friend 改成 chats = [Friend]

@bot.register(my_friend)

defmy_friednd_message(msg):

print('[接收]'+ str(msg))

ifmsg.type !='Text':# 除文字外其他消息回复内容

ret ='你给我看了什么![拜托]'

elif"你来自哪里"instr(msg):# 特定问题回答

ret ="我来自极简XksA"

else:# 文字消息自动回答

ret ='我爱你'

print('[发送]'+ str(ret))

returnret

# 进入交互式的 Python 命令行界面,并堵塞当前线程

embed()

(2)聊天效果图

基于自己的聊天机器人

6.个人聊天机器人搭建(基于图灵机器人的)(1)事前准备

点击这里注册图灵机器人账号,然后创建一个机器人,即可获得属于你的图灵机器人API。

图灵机器人API获取

(2) 创建属于自己的聊天机器人

方法一:使用Tuling类,简单实现

# 登录缓存路径,第一次设置为True

# 生成缓存文件wxpy.pkl后,为该文件路径

bot = Bot(cache_path="H:PyCodingWxpy_testwxpy.pkl")

tuling = Tuling(api_key='你的图灵接口api')

print('极简机器人已经启动')

# 我的小号,测试需谨慎

my_friednd = bot.friends().search('极简XksA')[]

# 如果想对所有好友实现机器人回复把参数my_friend改成chats = [Friend]

# 使用图灵机器人自动与指定好友聊天

@bot.register(my_friend)

defreply_my_friend(msg):

tuling.do_reply(msg)

# 进入交互式的 Python 命令行界面,并堵塞当前线程

embed()

方法二:自己手动发送POST请求,有点麻烦哈哈哈~

defauto_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')[]

# 如果想对所有好友实现机器人回复把参数my_friend改成chats = [Friend]

@bot.register(my_friednd)

defmy_friednd_message(msg):

print('[接收]'+ str(msg))

ifmsg.type !='Text':

ret ='你给我看了什么![拜托]'

else:

ret = auto_ai(msg.text)

print('[发送]'+ str(ret))

returnret

# 进入交互式的 Python 命令行界面,并堵塞当前线程

embed()

(3)聊天效果图

基本测试,图灵机器人可以实现查询天气、车票、翻译、基本聊天等功能,比我们自己写的强,哈哈哈。

个人聊天效果图

7.来点有趣的(1)获取微信好友性别、位置分布数据

运行结果:

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

1)性别占比饼图

frompylabimport*

mpl.rcParams['font.sans-serif'] = ['SimHei']

# 上面两行代码解决matplotlib绘图不能显示中文问题

importmatplotlib.pyplotasplt

labels = ['男性','女性','其他']

sizes = [57.1,32.2,10.7]

explode = (,0.1,)

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)城市分布条形图

importnumpyasnp

importmatplotlib.pyplotasplt

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

# 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()

效果图:

好友省份分布图

是不是很直接明了,我的好友基本在我国中南部,你知道你的好友分布吗?我在长江中下游,这里有水有山,有花有草,有乐园。

4)获取好友微信昵称和个性签名,词云分析

bot = Bot(cache_path="H:PyCodingWxpy_testwxpy.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://kuaibao.qq.com/s/20180830A1P2QP00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券