小米手机导出微信聊天记录
导出手机微信数据库
首先要做的第一步就是将手机端的微信数据库.db
文件导出到电脑上。
小米手机
小米的话做法很简单,不需要进行root。
1. 首先进入手机的设置-更多设置-备份和重置-本地备份
,输入密码,点击新建备份
,把两个勾去掉,点击软件程序右边的尖括号,选择微信,点击确定,点击开始备份,等待完成就行了。
2.然后将手机连接电脑,打开手机目录下的MIUI/backup/AllBackup/yyyymmdd_xxxxxx/
文件夹,将.bak
文件拷贝到电脑上,我这里重命名为了com.tencent.mm.bak
。
3.然后用任意一种压缩包软件(我用的是7zip)打开这个com.tencent.mm.bak
文件,并且将apps\com.tencent.mm\r\MicroMsg\systemInfo.cfg
、apps\com.tencent.mm\r\MicroMsg\CompatibleInfo.cfg
和apps\com.tencent.mm\r\MicroMsg\xxxx\EnMicroMsg.db
三个文件解压到电脑上。这里xxxx是一串随机的字母,代表你的微信用户,每个人不一样,一般是最大的那个文件夹,我这里是下图所示文件夹:
其他手机通用做法
其他手机可能没有这么方便,一种办法是root之后去/data/data/com.tencent.mm/MicroMsg
下面找这三个文件,但是很多人是不会去root的,所以介绍另一种方法。
首先电脑上安装一款安卓模拟器,然后里面下载手机微信并登录,最重要的一步就是将手机端聊天记录备份到电脑端微信,然后将电脑端聊天记录恢复到安卓虚拟器里的微信,这个功能是微信自带的,应该没有什么难度。
然后对安卓虚拟器进行root,这个也是设置里就有的,最后就能把三个文件都拷贝到电脑上了。
破解数据库密码
4.将上面的所有文件全部放在一个目录下。
5.然后命令行运行如下代码:
javac IMEI.java
java IMEI systemInfo.cfg CompatibleInfo.cfg
第三行就是数据库的密码了。
导出聊天记录
6.然后打开sqlcipher.exe
软件,用它打开EnMicroMsg.db
数据库,输入第五步得到的密码。
8.这时候会显示出很多的表格,点击菜单栏的File-Export-Table as CSV file
,选择message
表,并导出。
9.如果直接用excel打开这个表格,可能会显示乱码。所以新建一个excel表格,点击数据-来自文本
,然后导入这个.csv
文件
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上内容转自知乎:https://zhuanlan.zhihu.com/p/77418711
主要描述的内容:将聊天记录从数据库db文件导出至csv文件
原文是将:聊天记录用py处理,这里因为需求不同,我需要把聊天内容处理到sqlserver数据库,处理的语言用C#
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
一、创建表
--------------CREATE--------------- CREATE TABLE MSG( ID INT IDENTITY(1,1) PRIMARY KEY,---自增主键 SENDNAME VARCHAR(200),---发送人姓名 SENDTIME VARCHAR(200),---发送时间 SENDCONTENT VARCHAR(MAX)---发送内容 )
二、创建程序
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace WCT { public partial class Form1 : Form { /// <summary> /// 构造方法 /// </summary> public Form1() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; } /// <summary> /// CSV文件选择 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button1_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Multiselect = false; //是否允许多选 dialog.Title = "请选择要处理的文件"; //窗口title dialog.Filter = "文本文件(*.db)|*.*"; //可选择的文件类型 if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { this.textBox1.Text = dialog.FileName; } } /// <summary> /// 时间戳转时间 /// </summary> /// <param name="timeStamp"></param> /// <returns></returns> private DateTime ConvertStringToDateTime(string timeStamp) { DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); long lTime = long.Parse(timeStamp + "0000"); TimeSpan toNow = new TimeSpan(lTime); return dtStart.Add(toNow); } /// <summary> /// 数据入库 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void button4_Click(object sender, EventArgs e) { string CsvPath = textBox1.Text.Trim(); this.log.Text = "csv文件载入中,请稍等......"; CsvStreamReader csv = new CsvStreamReader(CsvPath); DataTable dt = csv.csvDT; List<message> messages = new List<message>(); for (int i = 0; i < dt.Rows.Count; i++) { message ms = new message(); ms.msgId = dt.Rows[i]["\"msgId\""].ToString(); ms.msgSvrId = dt.Rows[i]["\"msgSvrId\""].ToString(); ms.type = dt.Rows[i]["\"type\""].ToString(); ms.status = dt.Rows[i]["\"status\""].ToString(); ms.isSend = dt.Rows[i]["\"isSend\""].ToString(); ms.isShowTimer = dt.Rows[i]["\"isShowTimer\""].ToString(); ms.createTime = dt.Rows[i]["\"createTime\""].ToString(); ms.talker = dt.Rows[i]["\"talker\""].ToString(); ms.content = dt.Rows[i]["\"content\""].ToString(); ms.imgPath = dt.Rows[i]["\"imgPath\""].ToString(); ms.reserved = dt.Rows[i]["\"reserved\""].ToString(); ms.lvbuffer = dt.Rows[i]["\"lvbuffer\""].ToString(); ms.transContent = dt.Rows[i]["\"transContent\""].ToString(); ms.transBrandWording = dt.Rows[i]["\"transBrandWording\""].ToString(); ms.talkerId = dt.Rows[i]["\"talkerId\""].ToString(); ms.bizClientMsgId = dt.Rows[i]["\"bizClientMsgId\""].ToString(); ms.bizChatId = dt.Rows[i]["\"bizChatId\""].ToString(); ms.bizChatUserId = dt.Rows[i]["\"bizChatUserId\""].ToString(); ms.msgSeq = dt.Rows[i]["\"msgSeq\""].ToString(); ms.flag = dt.Rows[i]["\"flag\""].ToString(); ms.solitaireFoldInfo = dt.Rows[i]["\"solitaireFoldInfo\""].ToString(); ms.historyId = dt.Rows[i]["\"historyId\""].ToString(); messages.Add(ms); } messages = messages.Where(o => o.talker == "这里是会话微信ID" && !o.content.Contains("<msg>")).ToList(); this.log.Text = "csv文件载入成功,准备数据入库"; var task = Task.Run(() => { DB db = new DB(" Data Source=127.0.0.1;Initial Catalog=WX;Integrated Security=SSPI; "); db.OpenDB(); int total = 0; foreach (var item in messages) { total++; //记录字符串 string OneReaderStr = string.Empty; //发送人 string senders = string.Empty; if (item.isSend == "1") { senders = "SOULJIE"; } if (item.isSend == "0") { senders = "QBB"; } ////发送时间 string sendtime = ConvertStringToDateTime(item.createTime).ToString("yyyy-MM-dd HH:mm:ss"); string content = item.content.Replace("'", "\""); int a = db.ExecuteNonQuery("INSERT INTO [dbo].[MSG]([SENDNAME],[SENDTIME],[SENDCONTENT]) VALUES ('" + senders + "','" + sendtime + "','" + content + "')", null); if (a >= 1) { this.log.Text = "成功处理第" + total + "条记录!"; } } db.Close(); }); } } }
至此,数据全部导入SQL数据库供我们使用。
相关程序、源码下载地址:
https://gitee.com/soulsjie/WXExportPro
------------------------2023-02-23更新--------------------------------
由于MIUI升级后导致数据库文件无法正常解密,该方法已经不适用!