案例一 微信聊天机器人

阅读目录

一 简介

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

总而言之,可用来实现各种微信个人号的自动化操作。

安装:wxpy 支持 Python 3.4-3.6,以及 2.7 版本

pip3 install -U wxpy

二 登录微信

1、扫码登录微信

from wxpy import *

bot = Bot()

2、cache_path=True

运行上面的程序,会弹出二维码,用手机微信扫一扫即可实现登录。

但上面的程序有一个缺点,每次运行都要扫二维码。不过wxpy非常贴心地提供了缓存的选项,用于将登录信息保存下来,就不用每次都扫二维码,如下

bot = Bot(cache_path=True) # 必须先登录过一次以后才可以使用缓存

三 微信好友男女比例

案例一 微信聊天机器人
from wxpy import *
from pyecharts import Pie

bot=Bot(cache_path=True) #注意手机确认登录

friends=bot.friends()

attr=['男朋友','女朋友']
value=[0,0]
for friend in friends:
if friend.sex == 1: # 等于1代表男性
value[0]+=1
elif friend.sex == 2: #等于2代表女性
value[1]+=1

pie = Pie("Egon老师的好朋友们")
pie.add("", attr, value, is_label_show=True)
pie.render('sex.html')

案例一 微信聊天机器人

案例一 微信聊天机器人

四 微信好友地域分布

案例一 微信聊天机器人
from wxpy import *
from pyecharts import Map

bot=Bot(cache_path=True)

friends=bot.friends()

area_dic={}
for friend in friends:
if friend.province not in area_dic:
area_dic[friend.province]=1
else:
area_dic[friend.province]+=1

attr = area_dic.keys()
value = area_dic.values()

map = Map("Egon老师好朋友们的地域分布", width=1200, height=600)
map.add(
"好友地域分布",
attr,
value,
maptype='china',
is_visualmap=True, #结合体VisualMap
visual_text_color='#000'
)
map.render('area.html')

案例一 微信聊天机器人

案例一 微信聊天机器人

 

五 微信好友数据分析之词云

bg.jpg

案例一 微信聊天机器人

案例一 微信聊天机器人
#安装软件
pip3 install jieba

pip3 install pandas

pip3 install numpy

pip3 install scipy

pip3 install wordcloud

案例一 微信聊天机器人 案例一 微信聊天机器人
from wxpy import *
import re
import jieba
import pandas as pd
import numpy

bot=Bot(cache_path=True)
friends=bot.friends()

# 统计签名
with open('signatures.txt','w',encoding='utf-8') as f:
for friend in friends:
# 对数据进行清洗,将标点符号等对词频统计造成影响的因素剔除
pattern=re.compile(r'[一-龥]+')
filterdata=re.findall(pattern,friend.signature)
f.write(''.join(filterdata))

#过滤停止词
with open('signatures.txt','r',encoding='utf-8') as f:
data=f.read()
segment=jieba.lcut(data)

words_df</span>=pd.DataFrame({<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">segment</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:segment})
stopwords </span>= pd.read_csv(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">stopwords.txt</span><span style="color: rgba(128, 0, 0, 1)">"</span>, index_col=False, quoting=3, sep=<span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(128, 0, 0, 1)">"</span>, names=[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">stopword</span><span style="color: rgba(128, 0, 0, 1)">'</span>], encoding=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">utf-8</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
words_df </span>= words_df[~<span style="color: rgba(0, 0, 0, 1)">words_df.segment.isin(stopwords.stopword)]

#使用numpy进行词频统计
words_stat = words_df.groupby(by=['segment'])['segment'].agg({"计数":numpy.size})
words_stat = words_stat.reset_index().sort_values(by=["计数"],ascending=False)
# print(words_stat)

#词频可视化:词云,基于wordcloud库,当然pyecharts也可以实现
from scipy.misc import imread
from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as plt

# 设置词云属性

color_mask = imread('background.jfif')

color_mask = imread('bg.jpg')

color_mask = imread('bg1.jpeg')

wordcloud = WordCloud(
# font_path="simhei.ttf", # mac上没有该字体
font_path="/System/Library/Assets/com_apple_MobileAsset_Font3/6d903871680879cf5606a3d2bcbef058e56b20d4.asset/AssetData/华文仿宋.ttf", # 设置字体可以显示中文
background_color="white", # 背景颜色
max_words=100, # 词云显示的最大词数
mask=color_mask, # 设置背景图片
max_font_size=100, # 字体最大值
random_state=42,
width=1000, height=860, margin=2,# 设置图片默认的大小,但是如果使用背景图片的话, # 那么保存的图片大小将会按照其大小保存,margin为词语边缘距离
)

# 生成词云, 可以用generate输入全部文本,也可以我们计算好词频后使用generate_from_frequencies函数
word_frequence = {x[0]:x[1]for x in words_stat.head(100).values}
print(word_frequence)
word_frequence_dict = {}
for key in word_frequence:
word_frequence_dict[key] = word_frequence[key]

print(word_frequence_dict)
wordcloud.generate_from_frequencies(word_frequence_dict)
# 从背景图片生成颜色值
image_colors = ImageColorGenerator(color_mask)
# 重新上色
wordcloud.recolor(color_func=image_colors)
# 保存图片
wordcloud.to_file('output.png')
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

词云 案例一 微信聊天机器人
from wxpy import *
import re
import jieba
import pandas as pd
import numpy

bot=Bot(cache_path=True)
friends=bot.friends()

# 统计签名
with open('signatures.txt','w',encoding='utf-8') as f:
for friend in friends:
# 对数据进行清洗,将标点符号等对词频统计造成影响的因素剔除
pattern=re.compile(r'[一-龥]+')
filterdata=re.findall(pattern,friend.signature)
f.write(''.join(filterdata))

#过滤停止词
with open('signatures.txt','r',encoding='utf-8') as f:
data=f.read()
segment=jieba.lcut(data)

words_df</span>=pd.DataFrame({<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">segment</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:segment})
stopwords </span>= pd.read_csv(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">stopwords.txt</span><span style="color: rgba(128, 0, 0, 1)">"</span>, index_col=False, quoting=3, sep=<span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(128, 0, 0, 1)">"</span>, names=[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">stopword</span><span style="color: rgba(128, 0, 0, 1)">'</span>], encoding=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">utf-8</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
words_df </span>= words_df[~<span style="color: rgba(0, 0, 0, 1)">words_df.segment.isin(stopwords.stopword)]

#使用numpy进行词频统计
words_stat = words_df.groupby(by=['segment'])['segment'].agg({"计数":numpy.size})
words_stat = words_stat.reset_index().sort_values(by=["计数"],ascending=False)
print(words_stat)

#可是化词云
from pyecharts import WordCloud
word_frequence = {x[0]:x[1]for x in words_stat.head(100).values}

name = word_frequence.keys()
value = word_frequence.values()
wordcloud = WordCloud(width=1300, height=620)
wordcloud.add("", name, value, word_size_range=[20, 100])
wordcloud.render('cy.html')

基于pyecharts绘制词云图

案例一 微信聊天机器人

案例一 微信聊天机器人
停止词,是由英文单词:stopword翻译过来的,原来在英语里面会遇到很多a,the,or等使用频率很多的字或词,常为冠词、介词、副词或连词等。如果搜索引擎要将这些词都索引的话,那么几乎每个网站都会被索引,也就是说工作量巨大。可以毫不夸张的说句,只要是个英文网站都会用到a或者是the。那么这些英文的词跟我们中文有什么关系呢? 在中文网站里面其实也存在大量的stopword,我们称它为停止词。比如,我们前面这句话,“在”、“里面”、“也”、“的”、“它”、“为”这些词都是停止词。这些词因为使用频率过高,几乎每个网页上都存在,所以搜索引擎开发人员都将这一类词语全部忽略掉。如果我们的网站上存在大量这样的词语,那么相当于浪费了很多资源。原本可以添加一个关键词,排名就可以上升一名的,为什么不留着添加为关键词呢?停止词对SEO的意义不是越多越好,而是尽量的减少为宜。

中英文停止词表:

able
about
above
according
accordingly
across
actually
after
afterwards
again
against
ain't
all
allow
allows
almost
alone
along
already
also
although
always
am
among
amongst
an
and
another
any
anybody
anyhow
anyone
anything
anyway
anyways
anywhere
apart
appear
appreciate
appropriate
are
aren't
around
as
a's
aside
ask
asking
associated
at
available
away
awfully
be
became
because
become
becomes
becoming
been
before
beforehand
behind
being
believe
below
beside
besides
best
better
between
beyond
both
brief
but
by
came
can
cannot
cant
can't
cause
causes
certain
certainly
changes
clearly
c'mon
co
com
come
comes
concerning
consequently
consider
considering
contain
containing
contains
corresponding
could
couldn't
course
c's
currently
definitely
described
despite
did
didn't
different
do
does
doesn't
doing
done
don't
down
downwards
during
each
edu
eg
eight
either
else
elsewhere
enough
entirely
especially
et
etc
even
ever
every
everybody
everyone
everything
everywhere
ex
exactly
example
except
far
few
fifth
first
five
followed
following
follows
for
former
formerly
forth
four
from
further
furthermore
get
gets
getting
given
gives
go
goes
going
gone
got
gotten
greetings
had
hadn't
happens
hardly
has
hasn't
have
haven't
having
he
hello
help
hence
her
here
hereafter
hereby
herein
here's
hereupon
hers
herself
he's
hi
him
himself
his
hither
hopefully
how
howbeit
however
i'd
ie
if
ignored
i'll
i'm
immediate
in
inasmuch
inc
indeed
indicate
indicated
indicates
inner
insofar
instead
into
inward
is
isn't
it
it'd
it'll
its
it's
itself
i've
just
keep
keeps
kept
know
known
knows
last
lately
later
latter
latterly
least
less
lest
let
let's
like
liked
likely
little
look
looking
looks
ltd
mainly
many
may
maybe
me
mean
meanwhile
merely
might
more
moreover
most
mostly
much
must
my
myself
name
namely
nd
near
nearly
necessary
need
needs
neither
never
nevertheless
new
next
nine
no
nobody
non
none
noone
nor
normally
not
nothing
novel
now
nowhere
obviously
of
off
often
oh
ok
okay
old
on
once
one
ones
only
onto
or
other
others
otherwise
ought
our
ours
ourselves
out
outside
over
overall
own
particular
particularly
per
perhaps
placed
please
plus
possible
presumably
probably
provides
que
quite
qv
rather
rd
re
really
reasonably
regarding
regardless
regards
relatively
respectively
right
said
same
saw
say
saying
says
second
secondly
see
seeing
seem
seemed
seeming
seems
seen
self
selves
sensible
sent
serious
seriously
seven
several
shall
she
should
shouldn't
since
six
so
some
somebody
somehow
someone
something
sometime
sometimes
somewhat
somewhere
soon
sorry
specified
specify
specifying
still
sub
such
sup
sure
take
taken
tell
tends
th
than
thank
thanks
thanx
that
thats
that's
the
their
theirs
them
themselves
then
thence
there
thereafter
thereby
therefore
therein
theres
there's
thereupon
these
they
they'd
they'll
they're
they've
think
third
this
thorough
thoroughly
those
though
three
through
throughout
thru
thus
to
together
too
took
toward
towards
tried
tries
truly
try
trying
t's
twice
two
un
under
unfortunately
unless
unlikely
until
unto
up
upon
us
use
used
useful
uses
using
usually
value
various
very
via
viz
vs
want
wants
was
wasn't
way
we
we'd
welcome
well
we'll
went
were
we're
weren't
we've
what
whatever
what's
when
whence
whenever
where
whereafter
whereas
whereby
wherein
where's
whereupon
wherever
whether
which
while
whither
who
whoever
whole
whom
who's
whose
why
will
willing
wish
with
within
without
wonder
won't
would
wouldn't
yes
yet
you
you'd
you'll
your
you're
yours
yourself
yourselves
you've
zero
zt
ZT
zz
ZZ

一下
一些
一切
一则
一天
一定
一方面
一旦
一时
一来
一样
一次
一片
一直
一致
一般
一起
一边
一面
万一
上下
上升
上去
上来
上述
上面
下列
下去
下来
下面
不一
不久
不仅
不会
不但
不光
不单
不变
不只
不可
不同
不够
不如
不得
不怕
不惟
不成
不拘
不敢
不断
不是
不比
不然
不特
不独
不管
不能
不要
不论
不足
不过
不问

与其
与否
与此同时
专门

两者
严格
严重

个人
个别
中小
中间
丰富


为主
为了
为什么
为什麽
为何
为着
主张
主要
举行

乃至


之一
之前
之后
之後
之所以
之类
乌乎



也好
也是
也罢

了解
争取

于是
于是乎
云云
互相
产生
人们
人家
什么
什么样
什麽
今后
今天
今年
今後
仍然

从事
从而

他人
他们
他的
代替

以上
以下
以为
以便
以免
以前
以及
以后
以外
以後
以来
以至
以至于
以致


任何
任凭
任务
企图
伟大
似乎
似的

但是

何况
何处
何时
作为

你们
你的
使得
使用
例如

依照
依靠
促进
保持

俺们

倘使
倘或
倘然
倘若
假使
假如
假若
做到

允许
充分
先后
先後
先生
全部
全面

共同
关于

其一
其中
其二
其他
其余
其它
其实
其次
具体
具体地说
具体说来
具有
再者
再说


决定
况且
准备

几乎
几时

凭借
出去
出来
出现
分别


别的
别说

前后
前者
前进
前面
加之
加以
加入
加强
十分

即令
即使
即便
即或
即若
却不
原来


及其
及时
及至
双方
反之
反应
反映
反过来
反过来说
取得
受到
变成

另一方面
另外
只是
只有
只要
只限

叫做
召开
叮咚

可以
可是
可能
可见

各个
各人
各位
各地
各种
各级
各自
合理

同一
同时
同样
后来
后面

向着


否则

吧哒






呜呼

周围


呼哧





咱们



哈哈


哎呀
哎哟





哪个
哪些
哪儿
哪天
哪年
哪怕
哪样
哪边
哪里

哼唷





啪达


喔唷
嗡嗡




嘎登





因为
因此
因而
固然

在下

坚决
坚持
基本
处理
复杂

多少
多数
多次
大力
大多数
大大
大家
大批
大约
大量
失去

她们
她的
好的
好象

如上所述
如下
如何
如其
如果
如此
如若
存在

宁可
宁愿
宁肯

它们
它们的
它的
安全
完全
完成
实现
实际
宣布
容易
密切

对于
对应

少数
尔后
尚且
尤其

就是
就是说

尽管
属于
岂但
左右
巨大
巩固

已经
帮助
常常

并不
并不是
并且
并没有
广大
广泛
应当
应用
应该
开外
开始
开展
引起
强烈
强调


当前
当时
当然
当着
形成
彻底

彼此

往往

後来
後面

得出
得到
心里
必然
必要
必须

怎么
怎么办
怎么样
怎样
怎麽
总之
总是
总的来看
总的来说
总的说来
总结
总而言之
恰恰相反

意思
愿意
慢说
成为

我们
我的

或是
或者
战斗

所以
所有
所谓

扩大

抑或


按照
换句话说
换言之

掌握
接着
接著

故此
整个
方便
方面
旁人
无宁
无法
无论

既是
既然
时候
明显
明确

是否
是的
显然
显著
普通
普遍
更加
曾经

最后
最大
最好
最後
最近
最高

有些
有关
有利
有力
有所
有效
有时
有点
有的
有着
有著


朝着

本着

来着
极了
构成
果然
果真

某个
某些
根据
根本
欢迎
正在
正如
正常

此外
此时
此间
毋宁

每个
每天
每年
每当

比如
比方
比较
毫不
没有
沿
沿着
注意
深入
清楚
满足
漫说

然则
然后
然後
然而

照着
特别是
特殊
特点
现代
现在
甚么
甚而
甚至


由于
由此可见

的话
目前
直到
直接
相似
相信
相反
相同
相对
相对而言
相应
相当
相等
省得
看出
看到
看来
看看
看见
真是
真正

着呢

知道
确定

积极
移动
突出
突然
立即


等等

紧接着

纵令
纵使
纵然
练习
组成

经常
经过
结合
结果

绝对
继续
继而
维持
综上所述
罢了
考虑


而且
而况
而外
而已
而是
而言
联系

能否
能够


自个儿
自从
自各儿
自家
自己
自身

至于
良好

若是
若非
范围
莫若
获得

虽则
虽然
虽说
行为
行动
表明
表示


要不
要不是
要不然
要么
要是
要求
规定
觉得
认为
认真
认识

许多

设使
设若

说明
诸位

谁知


起来
起见

趁着
越是

转动
转变
转贴

较之

达到
迅速

过去
过来
运用
还是
还有

这个
这么
这么些
这么样
这么点儿
这些
这会儿
这儿
这就是说
这时
这样
这点
这种
这边
这里
这麽
进入
进步
进而
进行

连同
适应
适当
适用
逐步
逐渐
通常
通过
造成
遇到
遭到
避免

那个
那么
那么些
那么样
那些
那会儿
那儿
那时
那样
那边
那里
那麽
部分
鄙人
采取
里面
重大
重新
重要
鉴于
问题
防止

附近
限制

除了
除此之外
除非

随着
随著
集中
需要
非但
非常
非徒


顺着
首先
高兴
是不是
说说

补充:stopword

六 聊天机器人

1、为微信传输助手传送消息

这里的file_helper就是微信的文件传输助手,我们给文件传输助手发送一条消息,可以在手机端的文件传输助手中收到括号内的消息

bot.file_helper.send('egon say hello')

2、收发消息@bot.register()

案例一 微信聊天机器人
from wxpy import *
bot=Bot(cache_path=True)

@bot.register()
def recv_send_msg(recv_msg):
print('收到的消息:',recv_msg.text) # recv_msg.text取得文本
return 'EGON自动回复:%s' %recv_msg.text

# 进入Python命令行,让程序保持运行
embed()

案例一 微信聊天机器人

3、自动给老婆回复信息

当你在网吧吃着鸡,操作骚出天际时,你老婆打电话让你回家吃饭,此时你怎么办。。。

案例一 微信聊天机器人
from wxpy import *
bot=Bot(cache_path=True)

girl_friend=bot.search('Quincy.Coder')[0]
print(girl_friend)

@bot.register(chats=girl_friend) # 接收从指定好友发来的消息,发送者即recv_msg.sender为指定好友girl_friend
def recv_send_msg(recv_msg):
print('收到的消息:',recv_msg.text) # recv_msg.text取得文本
if recv_msg.sender == girl_friend:
recv_msg.forward(bot.file_helper,prefix='老婆留言: ') #在文件传输助手里留一份,方便自己忙完了回头查看
return '老婆最美丽,我对老婆的爱如滔滔江水,连绵不绝' #给老婆回一份

embed()

案例一 微信聊天机器人

4、从微信群中定位好友

老板的信息一定要及时回复

案例一 微信聊天机器人
bot=Bot(cache_path=True)

company_group=bot.groups().search('群名称')[0]

boss=company_group.search('老板的微信名称')[0]

@bot.register(chats=company_group) #接收从指定群发来的消息,发送者即recv_msg.sender为组
def recv_send_msg(recv_msg):
print('收到的消息:',recv_msg.text)
if recv_msg.member == boss:
recv_msg.forward(bot.file_helper,prefix='老板发言: ')
return '老板说的好有道理,深受启发'

embed()

案例一 微信聊天机器人

5、聊天机器人

给所有人自动回复

案例一 微信聊天机器人
import json
import requests
from wxpy import *
bot = Bot(console_qr=True, cache_path=True)

# 调用图灵机器人API,发送消息并获得机器人的回复
def auto_reply(text):
url = "http://www.tuling123.com/openapi/api"
api_key = "申请图灵机器人获取key值放到这里"
payload = {
"key": api_key,
"info": text,
}
r = requests.post(url, data=json.dumps(payload))
result = json.loads(r.content)
return "[EGON微信测试,请忽略] " + result["text"]

@bot.register()
def forward_message(msg):
return auto_reply(msg.text)

embed()

案例一 微信聊天机器人

给指定的群回复

案例一 微信聊天机器人
import json
import requests
from wxpy import *
bot = Bot(console_qr=True, cache_path=True)

group=bot.groups().search('教学部三人组')[0]
print(group)

# 调用图灵机器人API,发送消息并获得机器人的回复
def auto_reply(text):
url = "http://www.tuling123.com/openapi/api"
api_key = "申请图灵机器人获取key值放到这里"
payload = {
"key": api_key,
"info": text,
}
r = requests.post(url, data=json.dumps(payload))
result = json.loads(r.content)
return "[EGON微信测试,请忽略] " + result["text"]

@bot.register(group)
def forward_message(msg):
return auto_reply(msg.text)

embed() 

案例一 微信聊天机器人

给指定的人回复

案例一 微信聊天机器人
import json
import requests
from wxpy import *
bot = Bot(console_qr=True, cache_path=True)

girl_friend=bot.search('Quincy.Coder')[0]

# 调用图灵机器人API,发送消息并获得机器人的回复
def auto_reply(text):
url = "http://www.tuling123.com/openapi/api"
api_key = "申请图灵机器人获取key值放到这里"
payload = {
"key": api_key,
"info": text,
}
r = requests.post(url, data=json.dumps(payload))
result = json.loads(r.content)
return "[EGON微信测试,请忽略] " + result["text"]

@bot.register()
def forward_message(msg):
if msg.sender == girl_friend:
return auto_reply(msg.text)

embed()

案例一 微信聊天机器人

 

上一篇:AI时代Chatbots对话式交互系统的技术与挑战


下一篇:关于对话机器人,你需要了解这些技术