1. 场景

前几天,有一位小伙伴在后台给我留言,说自己有几十个微信群,自己精力有限,没法看过来,想要筛选一些高质量的群,让我是否能帮忙想想办法。

其实,微信群里的所有聊天记录都在手机本地文件夹内,只需要导出来进行解密,然后来一波数据分析,就可以帮他筛选出高质量的社群。

本篇文章将带大家用 Python 一步步来实现这个功能。

2. 实现步骤

第 1 步,导出微信聊天记录数据库

首先,我们使用一部 Root 后的手机或者模拟器登录微信,找到微信聊天记录数据库,然后导出到本地。

数据库文件的完整路径如下:

# 微信聊天记录数据库完整路径
/data/data/com.tencent.mm/MicroMsg/[当前登录微信的随机字符串]/EnMicroMsg.db

需要注意的是,如果当前设备没有 Root,可以选择群聊消息进行一次迁移,然后从 Root 设备或模拟器中导出数据库。

第 2 步,获取数据库的密码

微信数据库的密码组成形式为:手机 IMEI + 微信 UIN,然后 md5 加密(32 位小写)的前 7 个数字。

其中,手机的 IMEI 可以通过 *#06# 获取,如果是双卡手机,需要自己做一下判断。

微信的 UIN 在下面配置文件中,找到 name 属性为 default_uin 的 value 值,即为 UIN

# 当前登录微信的配置文件
/data/data/com.tencent.mm/shared_prefs/system_config_prefs.xml

最后,然后将 IMET 和 UIN 组成字符串,然后利用 MD5 进行加密,取 32 位小写的前 7 位即为微信数据库的密码。

第 3 步,破解数据库

由于微信数据库是使用 SQLCipher 生成,所以要先安装 sqlcipher 命令行文件

# 安装sqlcipher命令行(Mac)
brew install sqlcipher# Win可以去下载sqlcipher命令行文件

然后,输入数据库的密码及解密方式等,导出破解后的数据库。

第 4 步,分析数据库

推荐使用 SQLiteSutdio 打开并分析上面破解后的数据库,重点查看 message、rcontact、chatroom 这 3 张表。

微信所有的文字聊天记录都存放在 mesage 数据表中,包含:聊天内容、发送者、消息类型、创建时间等

rcontact 为微信通讯录表,包含:微信 ID、昵称、备注名等

chatroom 是群聊信息表,包含:群聊 ID、成员列表等

第 5 步,Python 打开数据库并封装

使用 sqlite3 连接本地数据库文件,获取数据库对象和游标对象

import sqlite3def __init__(self, db_path="./weixin.db"):"""本地数据库初始化"""self.db = sqlite3.connect(db_path)self.cursor = self.db.cursor()

接着,对数据库常用的操作,包含:增删改查,进行封装操作。

def execute(self, sql, param=None):"""sql: Sql语句,包含:增、删、改param:数据,可以为列表、字典,也可以为空"""try:if param is None:self.cursor.execute(sql)else:if type(param) is list:self.cursor.executemany(sql, param)else:self.cursor.execute(sql, param)count = self.db.total_changesself.db.commit()except Exception as e:print(e)return False, e# 返回结果return True if count > 0 else Falsedef query(self, sql, param=None):"""查询语句sql:Sql语句param:参数,可以包含空retutn:成功返回True"""if param is None:self.cursor.execute(sql)else:self.cursor.execute(sql, param)# 返回查询的结果return self.cursor.fetchall()

第 6 步,通过群聊名称获取群聊 ID

根据群聊昵称,使用 Sql 语句查询 rcontact 表,可以获取群聊的 ID 值

def __get_chartroom_id(self):"""获取群聊的id:return:"""res = self.db.query('select username from rcontact where nickname=?;', (self.chatroom_name,))# 群聊idchatroom_id = res[0][0]return chatroom_id

第 7 步,获取群聊消息

拥有群聊 ID 之后,紧接着查询 message 表,获取当前群聊的所有消息内容。

# message表:聊天记录表
# isSend=0:对方发送的;isSend=1:自己发送的
sql = "SELECT content FROM message WHERE talker='{}' and isSend=0".format(chatroom_id)# 查询表,获取所有的聊天记录
result = self.db.query(sql)

为了获取有效的消息内容,可以清洗掉自己发送的消息、系统消息、红包消息等内容

# 循环查询到的所有的消息
for item in result:# 过滤数据if not item or not item[0] or item[0].find('xml') != -1 or item[0].find('sysmsg') != -1 or item[0].find('<msg>') != -1 or item[0].find('chatroom') != -1 or item[0].find('weixinhongbao') != -1:continue# 过滤掉自己发送的内容,不包含:temps = item[0].split(':')if len(temps) < 2:# print('自己发送的内容:' + item[0])continue# 每一条聊天记录,过滤掉发送者,只保留消息正文# 发送者send_from = item[0].split(':')[0]# 发送内容send_msg = "".join(item[0].split(':')[1:]).strip().replace("\"", "")# 过长的消息,也过滤掉if len(send_msg) > 200:continue

对于群其他成员发送的内容,再过滤掉消息内容的前半部分,只保留消息正文

第 8 步,生成词云

使用 jieba 对群内有效的消息进行分词,然后使用 wordcloud 生成词云图。

def generate_wordcloud(self, word):"""生成词云:param word::return:"""img = WordCloud(font_path="./DroidSansFallbackFull.ttf", width=2000, height=2000,margin=2, collocations=False).generate(word)plt.imshow(img)plt.axis("off")plt.show()# 保存图片img.to_file("{}.png".format("群聊"))# 分词
temp = " ".join(jieba.cut(words, cut_all=True))# 生成词云
generate_wordcloud(temp)

第 9 步,新建排名表,插入数据

为了统计群聊活跃度排名,我们需要新建一张表,包含:id、微信昵称、消息内容 3 个字段。

def __create_top_table(self):"""创建Top表:return:"""# 创建Top表,如果存在就不重新创建result = self.db.execute("CREATE TABLE IF NOT EXISTS top(uid integer primary key,name varchar(200),msg varchar(200))")

接着,将上一步的每一条消息中的发送者 ID、发送内容 2 个字段插入到新建的 Top 表内

# 定义一个列表,加入所有要统计的数据
msg_pre = []for item in result:# 发送者send_from = item[0].split(':')[0]# 发送内容send_msg = "".join(item[0].split(':')[1:]).strip().replace("\"", "")msg_pre.append((send_from, send_msg))# 把要统计的数据,插入到top表中self.db.execute("insert into top(uid,name,msg) values (NULL,?,?);", msg_pre)

第 10 步,获取活跃度排名并可视化

从 Top 数据表中,通过微信昵称查询出每一位成员发言的次数,并保存到一个列表中

def get_top_partner(self):"""排名前15的成员:return:"""sql = "SELECT name as 姓名,COUNT(*) as times FROM top GROUP BY name ORDER BY times DESC limit %d;" % self.top_numresult = self.db.query(sql)for item in result:# 用户idid = item[0]# 发言次数count = item[1]# 获取用户的昵称,即:微信昵称username = self.get_username(id)self.top_data.append({'username': username,'count': count})

最后,去除微信昵称的特殊符号,使用 pyecharts 将数据可视化。

def draw_image(self):"""数据可视化:return:"""usernames = []counts = []for user in self.top_data:# 去除昵称中的特殊符号usernames.append(get_ava_string(user.get('username').strip())[0:8])counts.append(user.get('count'))def bar_chart() -> Bar:c = (Bar().add_xaxis(usernames).add_yaxis("活跃度", counts).reversal_axis().set_series_opts(label_opts=opts.LabelOpts(position="right")).set_global_opts(title_opts=opts.TitleOpts(title="最活跃的%d个小伙伴" % self.top_num)))return c# 需要安装 snapshot-selenium 或者 snapshot-phantomjsmake_snapshot(driver, bar_chart().render(), "bar.png")

3. 最后

上面的操作,通过生成的词云了解到当前群聊过去一段时间都在聊的话题及价值,通过对聊天记录的数据分析,获取到微信群聊活跃度排名。

当然,也可以分析群成员潜水排名及某一位群成员的数据分析。

我已经将全部源码上传到后台,关注公众号后回复「 微信群聊 」即可获得全部源码。


● 80%的人都不知道,全球Python库下载前10名

● 我珍藏的一些好的Python代码,技巧|上篇

● 爬取300本Python书籍,用Python告诉你哪家强?

● 简单几步,100行代码用Python画一个蝙蝠侠的logo

● 我用Python分析了《青春有你2》109位漂亮小姐姐,真香!

点击阅读原文,原创400篇干货文章

用 Python 分析微信群聊记录,是怎样一种体验?相关推荐

  1. 手把手教你分析微信群聊记录,识别害群之马

    导读:很多朋友加入了很多微信群,作为群中一员,你想知道这个群是否值得留下?而作为群主,你想了解目前这个群是否健康?如果有问题,那么坏了这锅粥的老鼠屎是谁?应该怎样设立群规?本文通过简单的分析给出思路, ...

  2. Python分析微信群用户信息

    Python分析微信群用户信息 1.什么是开源 别人开发出来的东西 贡献出来了 你可以免费使用 但是不能用作商用 所以叫开源 一般都会有一个协议 叫遵守BSD协议 生活中哪些不是开源的 windows ...

  3. python企业微信群聊_python3企业微信群组报警

    公司提出一个需求需要做一个企业微信的一个消息推送,需要将消息发送到聊天群里详细信息如下. 如何创建应用请阅读我的上篇文章:https://www.cnblogs.com/wangyajunblog/p ...

  4. python企业微信群聊_给企业微信加个群机器人

    现在很多企业在使用企业微信或钉钉进行工作交流,我们可以在群里添加一个自定义群机器人,定时发送一些提醒或咨询信息,它可以作为一个小组手,也为工作增加一点乐趣. 群机器人 下面是企业微信和钉钉的群机器人文 ...

  5. python企业微信群聊_企业微信、钉钉群消息python机器人自动推送

    钉钉具体的接口配置文档:https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq 企业微信的接口配置文档,目前在应用内部添加机器人时能够查看,还没有提供 ...

  6. python企业微信群聊_python调用企业微信接口发送群聊消息代码参考

    # Author: sea 2019 import requests import json import time class WebchatUtil: corpid = '必须填写你自己申请的' ...

  7. 微信群画像,利用词云图分析微信群热点

    微信上有很多个群,不少群都是做了免打扰设置,但有的时候又想知道群里在讨论什么热点问题.利用词云图分析是一个了解某个微信群热点的方法.     本文通过itchat 采集微信群聊记录,用jieba做分词 ...

  8. 用Python机器人监听微信群聊

    随着微信社交的兴起,我们加入的群也越来越多,一个不经意就被拉入好几个群,群是大家协同交流的平台,但是微信群却越来越泛滥,不知道大家有没有统计过自己浪费在毫无营养的群中的时间? 因为群质量太低或者群太吵 ...

  9. 用Python机器人监听微信群聊 !

    随着微信社交的兴起,我们加入的群也越来越多,一个不经意就被拉入好几个群,群是大家协同交流的平台,但是微信群却越来越泛滥,不知道大家有没有统计过自己浪费在毫无营养的群中的时间? Python学习交流群: ...

最新文章

  1. 用Springboot实现文件下载功能
  2. 北京/杭州 | 阿里巴巴达摩院自然语言智能生物医学团队招聘研究型实习生
  3. 【洛谷1361】 小M的作物(最小割)
  4. apache lucene_全文搜索Apache Lucene简介
  5. 从酷睿双核到Tiger Lake-H,英特尔如何帮游戏笔记本完成蜕变
  6. 中台到底是什么?传统企业怎样建设中台?
  7. C#LeetCode刷题之#54-螺旋矩阵(Spiral Matrix)
  8. 基坑监测日报模板_深基坑支护施工安全技术措施
  9. C++之拷贝构造函数
  10. python-extend用法
  11. 基于Springboot的物业管理系统_代码
  12. c语言 程序数据要五行输出,C语言编程入门之--第三章编写第一个C语言程序
  13. python apply函数的用法_python apply函数
  14. weblogic修改密码
  15. 华擎主板的网络唤醒设置。
  16. C#使用TCP进行聊天通信(详细解析)
  17. JavaSE-环境安装配置
  18. DMSP夜间灯光数据
  19. 升级谷歌浏览器后焦点有了黑框
  20. 可以用到项目的优化网站加载速度方案

热门文章

  1. 长春市建筑物矢量数据(Shp格式+带高度)
  2. 初学者python总结
  3. Http Post、Get提交工具
  4. 深度学习系列50:苹果m1芯片加速pytorch
  5. 优质嵌入式C程序总结
  6. gstreamer插件开发指南(一)
  7. Vue2 修改打包文件的编码格式(webpack-encoding-plugin)
  8. 软件质量保证与测试PTA作业
  9. DSP CCS12.00 芯片:TMS320F28335 TFTLCD显示屏幕的应用
  10. 常微分方程 $5 微分方程稳定性