目录导读

- 为什么你需要脚本备份? —— 从“手动存档”到“全自动容灾”的思维升级
- 核心原理拆解 —— 解密微信/QQ/Telegram 的数据库与导出协议
- 实战脚本库(附代码逻辑) —— Windows/Mac/Linux 通用方案
- 定时任务与增量备份 —— 让脚本在深夜安静地守护你的回忆
- 常见报错与自救手册 —— 加密库冲突、权限拒绝、乱码修复
- 问答精华区 —— 高频疑问一站式解答
为什么你需要脚本备份?
很多人习惯用手机自带的云同步,但云同步有三大致命伤:存储空间收费、消息被压缩、服务器端可能被“和谐”,更重要的是,当你换手机或卸载重装应用时,本地数据库往往会被清空,而脚本备份的本质,是直接绕过应用层,对底层的 SQLite 数据库文件进行冷拷贝,这就像给聊天记录做了一次“CT扫描”,连已撤回(未彻底删除)的残留片段都能捞回来。
核心原理拆解
以最常见的微信 PC 版为例,你的所有消息都存储在一个名为 MSG.db 的 SQLite 文件中,路径通常在 文档\WeChat Files\微信号\db_storage,而 Telegram 桌面版则使用 tdata 文件夹,脚本备份的关键动作只有两个:① 定位进程并结束其文件占用锁;② 复制 .db 文件到指定安全目录,但难点在于,部分数据库是加密的(如微信的 SQLCipher)。
实战脚本库(附核心逻辑)
这里给你一个跨平台的 Python 伪代码逻辑,请根据实际路径调整:
import os, shutil, datetime, subprocess, platform
def kill_wechat():
# Windows 杀掉微信进程,Linux 用 pkill
if platform.system() == "Windows":
os.system('taskkill /f /im WeChat.exe')
else:
os.system('pkill -f wechat')
def backup_db(src_path, dst_root):
# 生成带时间戳的备份文件名
time_tag = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
dst_file = os.path.join(dst_root, f"backup_{time_tag}.db")
# 关键:复制前先解除文件句柄锁
kill_wechat()
shutil.copy2(src_path, dst_file)
print(f"备份成功: {dst_file}")
# 使用示例(微信路径为例)
backup_db(r"D:\WeChat Files\wxid_xxx\db_storage\MSG.db", r"E:\ChatBackup")
高级技巧: 如果要备份 Telegram,不要直接复制 tdata,因为那是加密的,应使用官方导出的 export_html 或通过 Bot API 拉取 JSON 格式,下面的脚本展示如何用 Python + Telethon 库备份:
from telethon.sync import TelegramClient
import asyncio
async def dump_history():
# 请替换为你的 api_id 和 api_hash
client = TelegramClient('session', 123456, 'your_api_hash')
await client.start()
# 遍历所有对话,保存为 txt 文件
async for dialog in client.iter_dialogs():
with open(f"{dialog.name}.txt", "w", encoding="utf-8") as f:
async for msg in client.iter_messages(dialog.id):
f.write(f"{msg.date}: {msg.text}\n")
asyncio.run(dump_history())
定时任务与增量备份
手动跑脚本没意义,要自动化,在 Windows 上使用 任务计划程序,在 Mac/Linux 上用 crontab,以下是一个每天凌晨3点执行备份的 crontab 示例:
0 3 * * * /usr/bin/python3 /home/user/backup_script.py --incremental
增量备份逻辑:先计算源文件的 md5 哈希值,如果与上次记录不同,才执行复制,这样可以避免重复占用磁盘空间。
常见报错与自救手册
- 错误1:
Database is locked→ 原因:微信仍在后台运行,解决办法:脚本开头强制结束进程,备份后重启微信。 - 错误2:
no such table: message→ 原因:你没找到正确的数据库文件,或文件被加密,对策:检查路径下是否有MSG.db、MicroMsg.db等多个文件,微信的主要聊天记录在MSG.db中。 - 错误3:乱码 → 原因:解码格式错误,对策:在用 Notepad 打开时,强制指定 UTF-8 带 BOM。
问答精华区
Q1:脚本备份会封号吗? A: 纯本地复制数据库文件,不涉及网络协议交互,风险极低,但如果你用机器人框架(如 itchat)去主动拉取消息列表,那存在异常检测风险。建议只冷备份,不热读取。
Q2:备份的文件能直接导入新手机吗?
A: 不能直接导入,因为 .db 文件绑定了原设备的设备ID和加密密钥,正确做法是:将备份文件恢复后,用微信官方自带的“迁移与备份”功能再次导出为通用格式。
Q3:有没有不需要编程的图形化工具?
A: 有,比如针对 iOS 的 iMazing,但那是付费的,免费方案是:用 Firefox 浏览器登录网页版微信,按下 F12 打开开发者工具,在 Console 面板运行几行 JS 代码提取当前页面渲染出来的消息(仅限当前加载部分)。
Q4:脚本备份能备份语音或图片吗?
A: 文本消息在 .db 里,但音视频文件通常存储在 FileStorage 文件夹下,你需要在脚本中同时复制 MSG.db 和 FileStorage 整个目录,才能做到全量备份。
Q5:账号被注销后,备份还有用吗?
A: 如果账号注销,本地数据库会被自动清理,但如果你提前备份了源文件,理论上可以用 sqlcipher 工具通过暴力破解密钥来解密(前提是你记得设备的访问密钥)。备份完请把密钥或设备文件一起备份。
别等对话框变成一片空白才开始后悔,花半小时配置好这套脚本,它就能成为你的私人记忆保险库。备份的本质不是囤积数据,而是给未来的自己留一张回到过去的车票,现在就打开编辑器,写下你的第一行备份代码吧。