s
o
u
l
s
j
i
e

小米手机导出微信聊天记录

导出手机微信数据库

首先要做的第一步就是将手机端的微信数据库.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.cfgapps\com.tencent.mm\r\MicroMsg\CompatibleInfo.cfgapps\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升级后导致数据库文件无法正常解密,该方法已经不适用!

posted @ 2021-02-01 17:17  soulsjie  阅读(1631)  评论(1编辑  收藏  举报
你累吗?累就对了,当你觉得累时证明你在走上坡路!-----NotFoundObject - 2016-12-14 08:43