微信上有很多个群,不少群都是做了免打扰设置,但有的时候又想知道群里在讨论什么热点问题。利用词云图分析是一个了解某个微信群热点的方法。
本文通过itchat 采集微信群聊记录,用jieba做分词,用wordcloud生成词云图,主界面用wxPython完成。分析结果如下图:
对隐私内容马赛克处理了。
一、准备工作
首选,先要确定你的微信能登录微信网页版。只有能成功登录微信网页版,才能用 itchat 去分析群信息。
如果不能登录,只能借用其他的微信号进行研究了。
接下来配置好开发环境,安装相关库。
Python 3.7.3
itchat 1.3.10
jieba 0.42.1
Pypubsub 4.0.3
wordcloud 1.6.0
wxPython 4.0.6
二、过程:
1、创建数据表
import SqliteLib as sl
db = sl.WorkDb('db.db')
# 建立数据表 微信群表
sql_str = '''
create table wxq(id integer primary key autoincrement
, wxq_name string unique
, wxq_uid string
, wxq_time string
)
'''
db.run_sql(sql_str)
# 建立数据表 微信群聊信息表
sql_str = '''
create table wxq_msg(id integer primary key autoincrement
, wxq_id string
, wxq_name string
, wxq_member string
, wxq_time string
, wxq_msg string
)
'''
db.run_sql(sql_str)
2、主页面
主界面就一个文本框。
3、数据显示
用以前开发过的数据显示模块显示。
def OnWxgM(self,event):
fld = 'wxq_name,wxq_time'
fld_head = '群名|最后活跃时间'
table_name = 'wxq'
wb_tbl = {'name': table_name, 'fld': fld, 'key': " ", 'order': 'order by id desc'}
wb_tbl['value'] = ()
wb_tbl['fld_head'] = fld_head
wb_tbl['srch_fld'] = 'wxq_name'
wb_tbl['Title'] = '微信群列表'
wb_tbl['info'] = '点击鼠标右键查看群画像'
wb_tbl['col_len'] = [300, 200]
wb_tbl['scr_size'] = [800, 400]
wb_tbl['work_id'] = 'set_wx_group'
frame = DSFrame(wb_tbl)
frame.Show()
4、微信信息处理
def Listen_Wx(self):
# 监控微信群信息
@itchat.msg_register(TEXT, isGroupChat=True) # 这里的TEXT表示如果有人发送文本消息,那么就会调用下面的方法
def simple_reply(msg):
message = ''
msg_group = ''
msg_member = '本机登录用户'
try:
try:
group = itchat.get_chatrooms(update=True)
wx_group = {}
for g in group:
m_dict = {}
for menb in g['MemberList']:
m_dict[menb['UserName']] = menb['NickName']
wx_group[g['UserName']] = {'name': g['NickName'], 'member': m_dict}
msg_group = wx_group[msg['FromUserName']]['name']
if msg['ActualNickName'] == wx_group[msg['FromUserName']]['member'][msg['ActualUserName']]:
msg_member = msg['ActualNickName']
else:
msg_member = "{}[{}]".format(msg['ActualNickName'],wx_group[msg['FromUserName']]['member'][msg['ActualUserName']])
except Exception as e:
self.debug_log(repr(e))
try:
if msg_group == '':
msg_group = msg['User']['NickName']
except Exception as e:
self.debug_log(repr(e))
t_now = time.strftime('%Y-%m-%d %H:%M:%S', (time.localtime(msg['CreateTime'])))
message = msg['Content']
# pub.sendMessage("update", mstatus=message)
m_show = "{}\n{} {} \n{}".format(t_now, msg_group, msg_member, message )
# 更新群活跃时间
self.ldb.save_wxg_info((msg_group, t_now))
#'保存微信信息'
wx_msg = (msg_group, msg_member, t_now, message)
wx_msg_id = self.ldb.insert_wx_msg(wx_msg)
pub.sendMessage("update", mstatus=m_show)
except Exception as e:
f_e = open('error.log', 'a', encoding='utf-8')
t_now = time.strftime('%Y-%m-%d %H:%M:%S', (time.localtime(time.time())))
f_e.write("\n{}\n{}".format(t_now, repr(e)))
f_e.close()
itchat.auto_login(hotReload=True)
auth_flag = 'ok'
if auth_flag == 'ok':
t_now = time.strftime('%Y-%m-%d %H:%M:%S', (time.localtime(time.time())))
itchat.send('登录{}'.format(t_now), toUserName='filehelper')
pub.sendMessage("update", mstatus='loginok')
itchat.run()
else:
itchat.logout()
5、词云显示
词云部分参考了 HateMath归来 的博文 https://www.cnblogs.com/hatemath/p/10238145.html
# 去掉符号
resultword=re.sub("[\[\`\~\!\@\#\$\^\&\*\(\)\=\|\{\}\'\:\;\'\,\[\]\.\<\>\/\?\~\。\@\#\\\&\*\%]", "",word)
wordlist_after_jieba = jieba.cut(resultword)
wl_space_split = " ".join(wordlist_after_jieba)
# 设置停用词
sw = set(STOPWORDS)
sw.add("通知")
# 建立词云图
my_wordcloud = WordCloud(scale=4,font_path=font,stopwords=sw,background_color='white',
max_words = 100,max_font_size = 60,random_state=20).generate(wl_space_split)
#显示生成的词云
fig = plt.figure(figsize=(8, 5))
fig.canvas.set_window_title(wxg)
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
三、使用
启动后,登录微信,需要用手机端微信扫描弹出的二维码,登录后,自动记录群聊消息。可以通过菜单查看,搜索群聊记录。
在群列表中,点击鼠标右键,可以生成词云。
四、后记
目前的代码,是分析群所有聊天记录。后续开发可以考虑增加以下功能:
1、增加剔除关键字维护, 比如群主的名字 :)。
2、增加分析时间段。
3、清除数据
4、增加重要消息关键字维护,有匹配上的关键字信息,转发到手机微信的 文件传输助手。
有其他的需求或者建议欢迎和我联络。