weibo-backup 是一个超轻量的微博备份与归档工具(weibo backup / weibo archiver)。支持扫码登录、原画视频与实况照片的全量与增量下载,并可导出为 Markdown、CSV 或 SQLite。集成 Telegram 机器人交互,并支持企业微信/钉钉/飞书通知。适合需要长期保存微博内容与多格式导出的用户和团队。
基于 Node.js 与 TypeScript 开发,使用原生的网络请求和解析方式,与常见的使用 Playwright/Puppeteer/Selenium 的爬虫不同,运行起来只占几十兆内存,不仅冷启动非常快,即使在几十块钱一年的超低配 VPS 服务器、NAS 或个人电脑后台挂着跑,也不会卡顿。
- 📷 图片、视频、Live Photo 全搞定,绝不漏抓:
- 很多微博包含十几张图片,或者图片和视频混在一起发,传统脚本容易解析不到。本项目能自动提取全部资源;
- 视频会自动从多种清晰度里挑出**最清晰的原画版本(最高可达 1080P/2K/4K)**下载;
- 支持苹果实况照片(Live Photo),既保存高清静止封面,也把真实会动的
.mov视频源一起下载回来。
- 📱 手机扫码即可登录,一次登录长期有效:
- 支持在黑框框控制台里直接打印字符二维码,用微博手机 App 扫一下就能登录;
- 登录凭证会自动保存在本地,下一次运行直接自动复用,不用每次都去扫码。
- 📁 排版整齐,支持多种保存格式:
- Markdown 日报:按年月分文件夹,每天生成一个
.md文件,图片视频直接嵌在文档里,评论也像盖楼一样排好,用 Obsidian、VS Code 或 Typora 打开就能像刷微博一样看; - Excel 表格 (CSV):把每条微博的时间、内容、点赞数、评论数整理成表格,方便筛选和统计;
- 原始数据 (JSON):保留微博官方接口返回的全部原始数据,方便折腾与二次开发;
- 数据库存储:自带 SQLite 单文件数据库(不用安装数据库软件就能用),也支持连接 MySQL 或 PostgreSQL。
- Markdown 日报:按年月分文件夹,每天生成一个
- ⏳ 聪明的时间游标,只同步最新内容:
- 今天抓完后,程序会自动记下最后一条微博的时间。明天再运行,它会自动接着上次的地方往后抓,绝不浪费时间和磁盘去重复下载老内容。
- 🎯 支持定向抓取与定向删除:
- 看到某条特别想存的微博?直接把微博网页链接复制进命令,就能单独抓下来;
- 手抖抓错了某天?一条命令就能把本地图片、视频、表格、文档和数据库记录彻底清理干净。
- 🤖 手机随时远程遥控 (Telegram 机器人):
- 放在服务器后台挂着时,可以通过 Telegram 随时给它发指令,比如查查状态、让它马上抓一次、远程扫码登录、甚至临时加减博主名单。
- ☁️ 任务后置扩展脚本与网盘自动同步 (Post-Crawl Hook):
- 抓取完成后自动调用你的外部脚本(Python / Shell / PowerShell)或命令行工具(如
rclone); - 轻松实现将本地备份自动化同步至 Alist、OneDrive、百度网盘、阿里云盘或远程 NAS;
- 支持智能判定触发策略(如仅当有新内容时才同步)、阶梯超时熔断保护,并将网盘上传摘要合并推送至 Telegram 通知与终端日志。
- 抓取完成后自动调用你的外部脚本(Python / Shell / PowerShell)或命令行工具(如
weibo-backup/
├── src/ # 核心源代码
│ ├── config.ts # 读取 .env 配置文件的代码
│ ├── index.ts # 程序的主入口
│ ├── auth/ # 专门负责扫码登录、检查有没有掉线
│ ├── scraper/ # 核心爬虫:请求微博、解析文字、图片、视频和评论
│ ├── downloader/ # 核心下载器:负责把图片、视频、实况照片多线程下载到本地
│ ├── storage/ # 负责把抓到的内容存成 Markdown、表格、数据库、JSON
│ └── utils/ # 各种辅助工具(日志、Telegram机器人、时间转换等)
├── scripts/ # 任务后置扩展脚本示例(包含 Python 与 Shell 网盘同步范式)
├── output/ # 默认下载下来的所有内容都存在这里
├── userid.txt # 你想抓哪些博主?把他们的数字 ID 写在这个文件里
├── state.json # 扫码成功后自动生成的登录凭据(注意不要发给别人)
├── .env.example # 配置项参考模板
├── .env # 你的专属配置文件(开关、下载选项都在这里调)
├── package.json # 项目配置文件
└── tsconfig.json # TypeScript 编译配置
电脑上需要有 Node.js(建议版本 20 或以上)。如果还没安装,去 Node.js 官网 下载安装即可。
在终端(或 PowerShell / 命令提示符)里进入项目根目录:
# 推荐使用 pnpm 安装(也可以用 npm install)
pnpm install复制一份配置模板:
# Windows PowerShell 下执行:
copy .env.example .env
# Mac / Linux 终端下执行:
cp .env.example .env将代码转为可以直接运行的 JavaScript:
pnpm buildnode dist/index.js第一次运行时,终端里会打印出一个黑白二维码,拿起手机打开微博 App 扫一扫确认登录,程序就会开始自动为你抓取数据啦!
项目根目录下的 userid.txt 是你的“博主清单”。如果没有就自己创建一个。它的用法非常简单直白:
# 每一行写一个博主,格式是:博主数字UID [名字] [上次抓取到的时间] [结束时间]
# 分隔符支持管道符“ | ”或空格(单个空格、多个空格、制表符均可自动识别)
# 井号 "#" 开头的行会被当作备注跳过
1234567890 2026-10-10
1234567890 科技小侦探 2026-09-27T01:52:51+08:00
6634214154 | 宋雨琦_i-dle | 2026-01-01T00:00:00
9876543210 摄影达人老王
5462416458
# 以上这几种写法都可以,一行一个博主
- 在电脑浏览器打开博主的微博主页,比如:
https://weibo.com/u/1234567890或者https://weibo.com/1234567890; - 网址里的那串纯数字(例如
1234567890)就是该博主的 UID。
- 不用自己手打博主名字:添加新博主时,你只需要在文件里写那串纯数字 UID 就够了!程序第一次抓取时,会自动向微博询问博主真实的昵称,并自动帮你把名字工工整整地写回
userid.txt里,以后一眼就能看明白是谁。 - 不用自己管时间:每次抓完微博,程序会自动在末尾加上一串类似
2026-09-27T...的时间记录,表示“这个博主已经抓到这个时候了”。下一次运行时,它会自动从这个时间接着往后抓,省时又省硬盘空间。 - 想暂时暂停某个人怎么办?:直接在这一行的最前面加一个
#号(比如# 9876543210),程序就会跳过他,等想抓的时候把#删掉就行。
除了直接打 node dist/index.js 自动把列表里所有人最新微博抓一遍之外,你还可以用各种参数进行精准操作:
| 常用参数 | 完整参数 | 说明与用法 |
|---|---|---|
| (无参数) | 默认模式。把 userid.txt 里的所有博主挨个同步最新微博。 |
|
-c <目标> |
--crawl-post |
定向抓取。目标可以是一条微博的网页链接、短码、或者某一天。 |
-d <目标> |
--delete-post |
定向删除。把某条微博或某一天的本地文件、数据库记录全部清理干净。 |
-u <UID> |
--uid |
指定博主。如果名单里有很多人,通过这个参数指定到底操作哪位博主。 |
-h |
--help |
显示帮助说明手册。 |
支持三种输入方式,最推荐直接复制浏览器地址栏的链接,最省心:
# 1. 直接贴微博网址(最方便推荐):
node dist/index.js -c "https://weibo.com/1234567890/ABC123xyz"
# 2. 用微博网址后面的英文字符短码:
node dist/index.js -c ABC123xyz
# 3. 用微博内部的纯数字编号 (MID):
node dist/index.js -c 4999999999999999格式为 年-月-日(如 2026-09-26):
# 如果你的 userid.txt 里只有一个人,直接写日期就行:
node dist/index.js -c 2026-09-26
# 如果你的名单里有好几个人,需要用 -u 告诉程序抓谁(写那串数字 UID):
node dist/index.js -c 2026-09-26 -u 1234567890如果你测试时抓了不想要的数据,或者某天抓错了想重来,可以用 -d 参数彻底物理清除。程序会自动删掉对应的图片、视频、清理 Markdown 文档里的内容,并把数据库里的记录删掉:
# 1. 删除某一条特定微博的本地备份:
node dist/index.js -d "https://weibo.com/1234567890/ABC123xyz"
node dist/index.js -d ABC123xyz
# 2. 清理某博主某一整天的全部备份:
node dist/index.js -d 2026-09-26 -u 1234567890用文本编辑器打开 .env 文件,你可以自由调整各种开关。这里用大白话列出常见的设置:
> 💡 小提示: 配置文件中,true就是要的意思,false就是不要的意思。
USER_ID_LIST=userid.txt:你的博主名单文件,一般默认填userid.txt即可。ONLY_ORIGINAL=false:是否只抓原创?如果改成true,博主转发别人的微博就会被直接忽略。SCRAPE_COMMENTS=true:要不要顺便把评论区也抓下来?不想存评论可以设为false。MAX_COMMENTS_PER_POST=50:每条微博最多抓多少条评论?默认 50 条;填0表示不限数量尽量多抓。COMMENT_FLOW=0:评论排序抓取模式。0=按热度排序(默认推荐,适合绝大多数大V/明星博主,避免因控评/过滤导致只抓到几条评论),1=按时间排序。在热度模式下,若未达到抓取上限,系统还会自动衔接时间线补全更多评论。MAX_SUB_COMMENTS_PER_COMMENT=50:单条主评论最大抓取的楼中楼(二级回复)数量。START_DATE/END_DATE:如果你想统一抓某个固定时间段(比如想把 2026 年初到现在的都存一遍),可以在这里填2026-01-01,平时不限制留空即可。
DOWNLOAD_ORIGINAL_IMAGES=true:原创微博里的大图要不要下载到本地?DOWNLOAD_ORIGINAL_VIDEOS=true:原创微博里的视频要不要下载?DOWNLOAD_ORIGINAL_LIVEPHOTOS=true:原创微博里的 Live Photo 实况动图要不要下载?DOWNLOAD_ORIGINAL_AUDIOS=true:原创微博里的语音/音频文件要不要下载?(会自动提取并在 Markdown 中提供播放器与转写文本)DOWNLOAD_RETWEET_IMAGES=false:转发的微博里的图片要不要下载?(默认关,避免占太多硬盘)DOWNLOAD_RETWEET_VIDEOS=false:转发微博里的视频要不要下载?DOWNLOAD_RETWEET_LIVEPHOTOS=false:转发微博里的实况照片要不要下载?DOWNLOAD_RETWEET_AUDIOS=false:转发微博里的语音/音频要不要下载?DOWNLOAD_COMMENT_MEDIA=false:评论区里网友附带的表情包/图片要不要下载?CONCURRENT_DOWNLOADS=10:同时下载多少个文件?数字越大下载越快,一般 5 到 15 就很合适。
OUTPUT_DIR=./output:抓下来的所有东西默认存到当前目录的output文件夹里。SAVE_TYPES=csv,json,markdown:你想保留哪些格式?写哪个就存哪个,用逗号隔开。DB_TYPE=sqlite:数据库类型,默认是单文件 SQLite,不需要额外安装任何数据库服务端;如果不需要也可以留空。
LOGIN_MODE=TERMINAL_QR:登录模式。在本地电脑运行推荐TERMINAL_QR,控制台里直接出二维码。HTTP_PROXY=:网络代理。如果你的服务器在国外或者连某些通知需要走代理,可以填类似http://127.0.0.1:7890。
POST_SCRIPT_COMMAND=:外部脚本路径或执行命令(留空表示不启用)。例如:scripts/post_hook_example.py、rclone sync ./output onedrive:/weibo-backupPOST_SCRIPT_TRIGGER=has_new_data:触发策略。支持has_new_data(仅当有新博文或媒体落盘时触发,默认推荐)、success(只要成功即触发)、always(始终触发)、failure(仅失败时触发)POST_SCRIPT_WAIT=true:是否等待脚本执行完毕并将执行状态与摘要合并推送至 Telegram 报告POST_SCRIPT_TIMEOUT=10m:脚本执行超时时间(默认 10 分钟),超时将安全熔断强杀,绝不影响爬虫已保存的数据POST_SCRIPT_INHERIT_PROXY=false:外部脚本是否继承爬虫的代理配置(默认 false,防范局域网 NAS / 国内网盘走代理超时)
如果你在 .env 里配置了 Telegram 机器人的 Token,并开启了守护模式(DAEMON_MODE=true),爬虫就会常驻在后台,你可以用手机随时给它发消息发指令:
| 发送指令 | 怎么传参 | 它会帮你做什么 |
|---|---|---|
/help |
(无) | 查看所有指令的中文使用菜单 |
/status |
(无) | 看看当前有没有在抓取、有没有掉线、当前设置如何 |
/login |
(无) | 检查登录,如果掉线了,它会把登录二维码直接发在 Telegram 聊天里,手机扫码即可 |
/logout |
(无) | 退出登录并清除本地凭证 |
/run 或 /crawl |
(无) | 马上在后台跑一次全员增量同步,抓完了会发总结汇报给你 |
/c |
<网址/短码/日期> [UID] |
远程定向抓取某条微博或某一整天 |
/d |
<网址/短码/日期> [UID] |
远程定向删除某条微博或某一天的备份 |
/user list |
(无) | 查看现在正在追踪哪些博主,以及分别抓到了哪天 |
/user add |
<UID> <名字> |
临时添加一个新的博主进去追踪 |
/user del |
<UID> |
把某个博主从名单里移除 |
/user disable |
<UID> |
临时暂停抓取某个博主(相当于加个井号) |
/user enable |
<UID> |
恢复之前暂停的博主 |
/env list |
(无) | 看看现在的各个设置参数是什么 |
/env set |
<配置名> <新值> |
手机上直接改配置,改完立即生效,不用重启程序 |
如果你希望程序每天自动抓取,关掉终端窗口后还能继续跑,推荐使用最简单的 PM2 工具:
在 .env 里设置 DAEMON_MODE=true,并填上 SCHEDULE_CRAWL_TIME=08:00,20:00(表示每天早 8 点和晚 8 点各自动抓一次):
# 全局安装进程守护工具 pm2
npm install -g pm2
# 启动程序并取名叫 weibo-bot
pm2 start dist/index.js --name "weibo-bot"
# 查看运行状态
pm2 status
# 看看最新的运行日志(有没有报错看这里)
pm2 logs weibo-bot
# 让服务器重启时也能自动开机启动
pm2 startup
pm2 save在 .env 里设置 DAEMON_MODE=false,使用 Linux 自带的 crontab -e:
# 比如每天凌晨 2 点自动跑一次抓取:
0 2 * * * cd /你的项目绝对路径 && /usr/bin/node dist/index.js >> cron.log 2>&1- Q:下载的图片、视频在浏览器里打不开或者报 403 错误?
- A:微博的图片服务器会检查“防盗链”。本工具下载时已经自动模拟了官方的网页请求头,只要下载到了本地,直接双击本地文件就能随时随地查看。
- Q:怎么防止抓太快被微博限制?
- A:在
.env里把REQUEST_DELAY_MIN和REQUEST_DELAY_MAX稍微调大一点(比如调成 2000 和 4000),同时不要把并发下载数设得太高(默认 10 个就很安全),让程序像真人一样不紧不慢地抓。
- A:在
- Q:生成的 Markdown 里的图片怎么看?
- A:Markdown 里的图片用的是本地相对路径(比如
img/xxx.jpg)。用 Obsidian、VS Code 或者 Typora 打开整个月份目录或者整个项目文件夹,就能直接像平时看网页一样直接显示出图片和播放视频。
- A:Markdown 里的图片用的是本地相对路径(比如