Skip to content

About

🚀 超轻量的微博备份与归档工具。支持扫码登录、原画视频与实况照片全量下载、Markdown/CSV/SQLite 多格式导出、增量同步,集成 Telegram 机器人交互及企微/钉钉/飞书消息通知。

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Latest commit

 

History

72 Commits

Folders and files

Repository files navigation

🤖 Weibo Backup - 微博数据备份与下载小工具

weibo-backup 是一个超轻量的微博备份与归档工具(weibo backup / weibo archiver)。支持扫码登录、原画视频与实况照片的全量与增量下载,并可导出为 Markdown、CSV 或 SQLite。集成 Telegram 机器人交互,并支持企业微信/钉钉/飞书通知。适合需要长期保存微博内容与多格式导出的用户和团队。

基于 Node.js 与 TypeScript 开发,使用原生的网络请求和解析方式,与常见的使用 Playwright/Puppeteer/Selenium 的爬虫不同,运行起来只占几十兆内存,不仅冷启动非常快,即使在几十块钱一年的超低配 VPS 服务器、NAS 或个人电脑后台挂着跑,也不会卡顿。


📌 它能帮你做什么?

  1. 📷 图片、视频、Live Photo 全搞定,绝不漏抓:
    • 很多微博包含十几张图片,或者图片和视频混在一起发,传统脚本容易解析不到。本项目能自动提取全部资源;
    • 视频会自动从多种清晰度里挑出**最清晰的原画版本(最高可达 1080P/2K/4K)**下载;
    • 支持苹果实况照片(Live Photo),既保存高清静止封面,也把真实会动的 .mov 视频源一起下载回来。
  2. 📱 手机扫码即可登录,一次登录长期有效:
    • 支持在黑框框控制台里直接打印字符二维码,用微博手机 App 扫一下就能登录;
    • 登录凭证会自动保存在本地,下一次运行直接自动复用,不用每次都去扫码。
  3. 📁 排版整齐,支持多种保存格式:
    • Markdown 日报:按年月分文件夹,每天生成一个 .md 文件,图片视频直接嵌在文档里,评论也像盖楼一样排好,用 Obsidian、VS Code 或 Typora 打开就能像刷微博一样看;
    • Excel 表格 (CSV):把每条微博的时间、内容、点赞数、评论数整理成表格,方便筛选和统计;
    • 原始数据 (JSON):保留微博官方接口返回的全部原始数据,方便折腾与二次开发;
    • 数据库存储:自带 SQLite 单文件数据库(不用安装数据库软件就能用),也支持连接 MySQL 或 PostgreSQL。
  4. ⏳ 聪明的时间游标,只同步最新内容:
    • 今天抓完后,程序会自动记下最后一条微博的时间。明天再运行,它会自动接着上次的地方往后抓,绝不浪费时间和磁盘去重复下载老内容。
  5. 🎯 支持定向抓取与定向删除:
    • 看到某条特别想存的微博?直接把微博网页链接复制进命令,就能单独抓下来;
    • 手抖抓错了某天?一条命令就能把本地图片、视频、表格、文档和数据库记录彻底清理干净。
  6. 🤖 手机随时远程遥控 (Telegram 机器人):
    • 放在服务器后台挂着时,可以通过 Telegram 随时给它发指令,比如查查状态、让它马上抓一次、远程扫码登录、甚至临时加减博主名单。
  7. ☁️ 任务后置扩展脚本与网盘自动同步 (Post-Crawl Hook):
    • 抓取完成后自动调用你的外部脚本(Python / Shell / PowerShell)或命令行工具(如 rclone);
    • 轻松实现将本地备份自动化同步至 Alist、OneDrive、百度网盘、阿里云盘或远程 NAS;
    • 支持智能判定触发策略(如仅当有新内容时才同步)、阶梯超时熔断保护,并将网盘上传摘要合并推送至 Telegram 通知与终端日志。

📁 项目目录长什么样?

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 build

第五步:开始运行

node dist/index.js

第一次运行时,终端里会打印出一个黑白二维码,拿起手机打开微博 App 扫一扫确认登录,程序就会开始自动为你抓取数据啦!


📄 怎么添加你想备份的博主?(userid.txt)

项目根目录下的 userid.txt 是你的“博主清单”。如果没有就自己创建一个。它的用法非常简单直白:

1. 基础书写格式

# 每一行写一个博主,格式是:博主数字UID [名字] [上次抓取到的时间] [结束时间]
# 分隔符支持管道符“ | ”或空格(单个空格、多个空格、制表符均可自动识别)
# 井号 "#" 开头的行会被当作备注跳过

1234567890 2026-10-10
1234567890 科技小侦探 2026-09-27T01:52:51+08:00
6634214154 | 宋雨琦_i-dle | 2026-01-01T00:00:00
9876543210 摄影达人老王
5462416458
# 以上这几种写法都可以,一行一个博主

2. 怎么获取博主的数字 UID?

  1. 在电脑浏览器打开博主的微博主页,比如:https://weibo.com/u/1234567890 或者 https://weibo.com/1234567890;
  2. 网址里的那串纯数字(例如 1234567890)就是该博主的 UID。

3. 超贴心的小细节:

  • 不用自己手打博主名字:添加新博主时,你只需要在文件里写那串纯数字 UID 就够了!程序第一次抓取时,会自动向微博询问博主真实的昵称,并自动帮你把名字工工整整地写回 userid.txt 里,以后一眼就能看明白是谁。
  • 不用自己管时间:每次抓完微博,程序会自动在末尾加上一串类似 2026-09-27T... 的时间记录,表示“这个博主已经抓到这个时候了”。下一次运行时,它会自动从这个时间接着往后抓,省时又省硬盘空间。
  • 想暂时暂停某个人怎么办?:直接在这一行的最前面加一个 # 号(比如 # 9876543210),程序就会跳过他,等想抓的时候把 # 删掉就行。

💻 常用命令行(CLI)使用方法

除了直接打 node dist/index.js 自动把列表里所有人最新微博抓一遍之外,你还可以用各种参数进行精准操作:

1. 命令行参数一览

常用参数 完整参数 说明与用法
(无参数) 默认模式。把 userid.txt 里的所有博主挨个同步最新微博。
-c <目标> --crawl-post 定向抓取。目标可以是一条微博的网页链接、短码、或者某一天。
-d <目标> --delete-post 定向删除。把某条微博或某一天的本地文件、数据库记录全部清理干净。
-u <UID> --uid 指定博主。如果名单里有很多人,通过这个参数指定到底操作哪位博主。
-h --help 显示帮助说明手册。

2. 精准抓取示例 (-c)

场景 A:看到一条好微博,想单独把它存下来

支持三种输入方式,最推荐直接复制浏览器地址栏的链接,最省心:

# 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

场景 B:只想抓某博主某一整天发的所有微博

格式为 年-月-日(如 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

3. 精准删除备份示例 (-d)

如果你测试时抓了不想要的数据,或者某天抓错了想重来,可以用 -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 人话版说明)

用文本编辑器打开 .env 文件,你可以自由调整各种开关。这里用大白话列出常见的设置:

> 💡 小提示: 配置文件中,true就是要的意思,false就是不要的意思。

1. 抓取与内容偏好

  • 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,平时不限制留空即可。

2. 媒体(图片/视频/实况/语音)下载开关

  • 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 就很合适。

3. 数据存在哪里?

  • OUTPUT_DIR=./output:抓下来的所有东西默认存到当前目录的 output 文件夹里。
  • SAVE_TYPES=csv,json,markdown:你想保留哪些格式?写哪个就存哪个,用逗号隔开。
  • DB_TYPE=sqlite:数据库类型,默认是单文件 SQLite,不需要额外安装任何数据库服务端;如果不需要也可以留空。

4. 其它设置

  • LOGIN_MODE=TERMINAL_QR:登录模式。在本地电脑运行推荐 TERMINAL_QR,控制台里直接出二维码。
  • HTTP_PROXY=:网络代理。如果你的服务器在国外或者连某些通知需要走代理,可以填类似 http://127.0.0.1:7890。

5. 任务后置扩展脚本与网盘同步配置 (可选)

  • POST_SCRIPT_COMMAND=:外部脚本路径或执行命令(留空表示不启用)。例如:scripts/post_hook_example.py、rclone sync ./output onedrive:/weibo-backup
  • POST_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 / 国内网盘走代理超时)

🤖 Telegram 机器人指令(手机随时遥控)

如果你在 .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 工具:

1. 配合 Telegram 机器人常驻后台(推荐)

在 .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

2. 用系统定时任务跑(不使用 Telegram 机器人)

在 .env 里设置 DAEMON_MODE=false,使用 Linux 自带的 crontab -e:

# 比如每天凌晨 2 点自动跑一次抓取:
0 2 * * * cd /你的项目绝对路径 && /usr/bin/node dist/index.js >> cron.log 2>&1

💡 常见疑问与排坑小贴士 (FAQ)

  • Q:下载的图片、视频在浏览器里打不开或者报 403 错误?
    • A:微博的图片服务器会检查“防盗链”。本工具下载时已经自动模拟了官方的网页请求头,只要下载到了本地,直接双击本地文件就能随时随地查看。
  • Q:怎么防止抓太快被微博限制?
    • A:在 .env 里把 REQUEST_DELAY_MIN 和 REQUEST_DELAY_MAX 稍微调大一点(比如调成 2000 和 4000),同时不要把并发下载数设得太高(默认 10 个就很安全),让程序像真人一样不紧不慢地抓。
  • Q:生成的 Markdown 里的图片怎么看?
    • A:Markdown 里的图片用的是本地相对路径(比如 img/xxx.jpg)。用 Obsidian、VS Code 或者 Typora 打开整个月份目录或者整个项目文件夹,就能直接像平时看网页一样直接显示出图片和播放视频。

About

🚀 超轻量的微博备份与归档工具。支持扫码登录、原画视频与实况照片全量下载、Markdown/CSV/SQLite 多格式导出、增量同步,集成 Telegram 机器人交互及企微/钉钉/飞书消息通知。

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages