初出茅庐-----微信好友分析与微信机器人
一、微信好友分析
1.简介
对微信的好友进行分析,统计好友的人数,省市的分布,并排序,并统计好友签名用词的特点。用pyechart图像显示,并存为网页文件。
2.函数描述
函数 | 描述 |
get_friends_info(self) | 获取好像信息,返回lis列表 |
friends_info_lis_to_excle(self) | 把lis信息写入到excle |
extract_data_as_two_lis(self, condition) | 参数为condition 词频,提取两个列表,condition 和 人数,降序列表 |
city_wordcloud(self, save_name, condition) | 参数为 save_name 自动添加jpg 创建X条件词云 |
pillar_picture(self, condition, render_name) | 参数为condition ,创建柱形html图片 |
map_picture(self, condition, picture_name, keylist, valueslist, Map_condition) | 参数为condition,picture_name, keylist, valueslist, Map_condition->china或者广东创建html地图图片,图片名字为picture_name |
map_visualmap() -> Map | 创建地图 |
find_friends_in_condition(self, condition) | 参数为condition,返回一个二维列表 |
注意:有些人的电脑无法安装wordcloud库,一下是安装的教程
方法1
在此网页课找到库的安装包https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud,然后下载你所需要的库的安装包(一定要找准适合自己电脑的)
找到安装包的路径
然后在上面输入cmd,进入命令行,输入pip install +你下载的库的文件名
等待他自动下载成功即可
方法2
如果不想这么麻烦,可以下载anaconda,在anaconda中直接下载wordcloud库,然后在Spyder里可以直接使用这个库
3.代码实现
1 from wxpy import *
2 from wordcloud import WordCloud
3 import numpy as np
4 from PIL import Image
5 import matplotlib.pyplot as plt
6 from pandas import read_excel
7 import pandas as pd
8
9 class wechat_test():
10
11 def __init__(self, filename, sheetname):
12 self.filename = filename
13 self.sheetname = sheetname
14
15 def get_friends_info(self): #获取好像信息,返回lis列表
16 bot = Bot()
17 lis = [['name', 'real_name', 'sex', 'city', 'province']] # 把信息存储为一个二维列表,添加头部信息
18 friend_all = bot.friends()
19
20 for a_friend in friend_all:
21 NickName = a_friend.raw.get('NickName', None) #获取所有好友信息 raw表示获取全部信息
22 RemarkName = a_friend.raw.get('RemarkName', None)
23 Sex = {1: "男", 2: "女", 0: "其他"}.get(a_friend.raw.get('Sex', None), None)
24 City = a_friend.raw.get('City', None)
25 Province = a_friend.raw.get('Province', None)
26 Signature = a_friend.raw.get('Signature', None)
27 #HeadImgUrl = a_friend.raw.get('HeadImgUrl', None)
28 #HeadImgFlag = a_friend.raw.get('HeadImgFlag', None)
29 list_0 = [NickName, RemarkName, Sex, City, Province, Signature]
30 lis.append(list_0)
31 return lis
32
33 # 把lis信息写入到excle
34 def friends_info_lis_to_excle(self):
35 import openpyxl
36 lis = self.get_friends_info()
37 wb = openpyxl.Workbook()
38 sheet = wb.active
39 sheet.title = self.sheetname
40 for i in range(0, len(lis)):
41 for j in range(0, len(lis[i])):
42 sheet.cell(row=i+1, column=j+1, value=str(lis[i][j]))
43 wb.save(self.filename)
44 print("excel保存成功")
45
46 #参数为condition 词频,提取两个列表,condition 和 人数,降序列表
47 def extract_data_as_two_lis(self, condition):
48 df = read_excel(self.filename, sheet_name=self.sheetname)
49 X_list = df[condition].fillna('0').tolist() # 把列转换为list,用0替换Nan?
50 counts = {} # 创建字典
51 for word in X_list:
52 counts[word] = counts.get(word, 0) + 1 # 统计词频
53 items = list(counts.items()) # 返回所有键值对
54 items.sort(key=lambda x: x[1], reverse=True) # 降序排序
55 keylist = list()
56 valueslist = list()
57 for item in items:
58 word, count = item
59 #if word == '0':
60 #word = "其他"
61 keylist.append(word) # 把词语降序word放进一个列表
62 valueslist.append(count)
63 return keylist, valueslist
64
65 #参数为 save_name 自动添加jpg 创建X条件词云,
66 def city_wordcloud(self, save_name, condition):
67 wordlist, giveup = self.extract_data_as_two_lis(condition)
68 new_wordlist = list()
69 for i in range(25):
70 new_wordlist.append(wordlist[i])
71 wl = ' '.join(wordlist) # 把列表转换成str wl为str类型,所以需要转换
72 cloud_mask = np.array(Image.open("love.jpg")) # 词云的背景图,需要颜色区分度高
73 wc = WordCloud(
74 background_color="black", # 背景颜色
75 mask=cloud_mask, # 背景图cloud_mask
76 max_words=100, # 最大词语数目
77 font_path='msyh.ttc', # 调用font里的simsun.tff字体,需要提前安装
78 height=500, # 设置高度
79 width=2600, # 设置宽度
80 max_font_size=1000, # 最大字体号
81 random_state=1000, # 设置随机生成状态,即有多少种配色方案
82 )
83 myword = wc.generate(wl) # 用 wl的词语 生成词云
84 # 展示词云图
85 plt.imshow(myword)
86 plt.axis("off")
87 #plt.show()
88 try:
89 wc.to_file(save_name + '.jpg') # 把词云保存下当前目录(与此py文件目录相同)
90 except:
91 print("词云保存失败")
92
93 #参数为condition ,创建柱形html图片,
94 def pillar_picture(self, condition, render_name):
95 from pyecharts.charts import Bar
96 from pyecharts.globals import ThemeType
97 from pyecharts import options as opts
98
99 keylist, valueslist = self.extract_data_as_two_lis(condition)
100 new_keylist = list()
101 new_valueslist = list()
102 for i in range(10):
103 new_keylist.append(keylist[i])
104 new_valueslist.append(valueslist[i])
105 bar = Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
106 # x轴 列表
107 bar.add_xaxis(new_keylist)
108 bar.add_yaxis("好友分布", new_valueslist)
109 # render 会生成本地 HTML 文件,默认会在当前目录生成 render.html 文件
110 # 也可以传入路径参数,如 bar.render("mycharts.html")
111 bar.render(render_name)
112 print("pillar_picture图片保存成功!")
113
114 #参数为condition,picture_name, keylist, valueslist, Map_condition->china或者广东创建html地图图片,图片名字为picture_name
115 def map_picture(self, condition, picture_name, keylist, valueslist, Map_condition):
116 from pyecharts import options as opts
117 from pyecharts.charts import Map
118
119 def map_visualmap() -> Map:
120 new_keylist = list()
121 new_valueslist = list()
122 if condition == 'city':
123 for i in range(len(keylist)):
124 # 列表处理,默认elsx里面的city没有'市'字,地图需要市字
125 new_keylist.append(keylist[i] + '市')
126 new_valueslist.append(valueslist[i])
127 else:
128 for i in range(len(keylist)):
129 new_keylist.append(keylist[i])
130 new_valueslist.append(valueslist[i])
131
132 c = (
133 Map()
134 .add("好友地图分布", [list(z) for z in zip(new_keylist, new_valueslist)], Map_condition)
135 .set_global_opts(
136 title_opts=opts.TitleOpts(title="Map-VisualMap"),
137 visualmap_opts=opts.VisualMapOpts(max_=100),
138 )
139 )
140 try:
141 c.render(picture_name)
142 except:
143 print("html地图图片创建失败")
144 print('html地图图片保存成功')
145 map_visualmap()#调用自己
146
147 #参数为condition,返回一个二维列表
148 def find_friends_in_condition(self, condition):
149 df = pd.read_excel(self.filename, usecols=[0, 1, 3], names=None) #不要列名
150 df_li = df.values.tolist()
151 name = list()
152 for data in df_li:
153 condition = condition
154 if condition in data:
155 name.append(data)
156 self.map_picture()
157 #print(len(name), name)
158 return name
159
160
161 if __name__ == "__main__":
162 wechat = wechat_test('wechat_info.xlsx', 'list')
163 wechat.friends_info_lis_to_excle()
164 wechat.city_wordcloud('city_wordclour', 'city')
165 wechat.pillar_picture('city', 'render.html')
166 keylist, valueslist = wechat.extract_data_as_two_lis('city')
167 wechat.map_picture('city', 'test.html', keylist, valueslist, "广东")
168 #wechat.find_friends_in_city()
4.结果如图所示
词云
地图
Excel表格
二、微信聊天机器人
简介:此代码可实现话痨机器人,微智能聊天机器人,自动回复,获取聊天记录
代码实现
1 from wxpy import *
2 import requests
3 import json
4 # 初始化机器人,扫码登陆
5 robot = Bot()
6 def talk_robot(info='你好啊'): #定义一个默认参数
7 api_url = 'http://www.tuling123.com/openapi/api' # 图灵接口url
8 apikey = '99652f74e6f54189a4d8b2d4df815ba4' # 注册图灵生成key
9 data = {'key': apikey, 'info': info}
10 r = requests.post(api_url, data=data).text
11 response=json.loads(r)['text']
12 return response
13
14 '''@robot.register()#微智能机器人
15 def reply_my_friend(msg):
16 message = '{}'.format(msg.text)
17 response = talk_robot(info=message)
18 return response
19 embed()
20
21 @robot.register()#话痨机器人
22 def print_group_msg(msg):
23 if msg.is_at:
24 message = '{}'.format(msg.text)
25 response = talk_robot(info=message)
26 return response
27 embed()
28 '''
29 @robot.register(Group,TEXT)#自动回复
30 def print_group_msg(msg):
31 msg.reply("本人不在线")
32 print(msg)
33 msg.member#窃取聊天记录
34 msg_id=msg.id
35 print(msg_id)
36 msg_id_regex=re.compile('<msgid>(\d+)</msgid>')
37 old_msg_id=msg_id_regex.findall(raw.get('Content'))[0]
38 print(old_msg_id)
39 embed()
结果如图所示
转载于: