导出手机微信数据库
首先要做的第一步就是将手机端的微信数据库.db文件导出到电脑上。
小米手机
小米的话做法很简单,不需要进行root。
1. 首先进入手机的设置-更多设置-备份和重置-本地备份,输入密码,点击新建备份,把两个勾去掉,点击软件程序右边的尖括号,选择微信,点击确定,点击开始备份,等待完成就行了。

2.然后将手机连接电脑,打开手机目录下的MIUI/backup/AllBackup/yyyymmdd_xxxxxx/文件夹,将.bak文件拷贝到电脑上,我这里重命名为了com.tencent.mm.bak。

3.然后用任意一种压缩包软件(我用的是7zip)打开这个com.tencent.mm.bak文件,并且将appscom.tencent.mm
MicroMsgsystemInfo.cfg、appscom.tencent.mm
MicroMsgCompatibleInfo.cfg和appscom.tencent.mm
MicroMsgxxxxEnMicroMsg.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数据库供我们使用。
相关程序、源码下载地址: