weibo-cli 实战:用命令行搭建微博自动化运营 Pipeline
环境: Node.js 18+ · @weibo-ai/weibo-cli · macOS / Linux / Windows
前言
前一篇文章介绍了 weibo-cli 的具体用法。本篇就进入实战阶段:如何把 weibo-cli 的各项能力组合起来,搭建一条可定时运行、稳定输出结果的自动化 Pipeline。
weibo-cli 目前支持的能力包括:内容发布、评论与转发等互动操作、内容检索、热点趋势查询。本篇的所有示例均基于这些已开放能力。
文中所有命令均为实际执行验证后的结果。涉及发布、回复等写操作的示例统一标注 写操作,此类操作不可撤销,执行前请确认数据无误。
一、Pipeline 的基本结构
一条典型的微博数据 Pipeline 由三个环节组成:
- 采集:调用 weibo-cli 命令获取数据,输出 JSON
- 处理:用 Python / Shell 对 JSON 做过滤、聚合、格式转换
- 输出:写入文件、发送通知、或触发下一步动作
三个环节通过 Shell 管道(|)或临时文件串联。weibo-cli 的 --output json 参数保证输出格式固定,适合作为管道数据源。
输出格式说明
| 参数值 | 适合场景 |
|---|---|
table(默认) |
终端直接查看,人类可读 |
json |
脚本解析、管道传递、文件存储 |
在脚本中始终显式指定 --output json,保证后续处理逻辑的稳定性。
二、场景一:热点趋势监控
注意:
search hot_word/biz需要 Pro 或 Ultra 套餐。
2.1 获取热搜列表
weibo-cli 提供热点趋势查询能力,可获取当前热搜数据:
bash
weibo-cli search hot_word/biz --output json
输出的 data 数组包含热搜词条,字段包括 id(排名)、word(热搜词)、num(热度值)。
bash
weibo-cli search hot_word/biz --output json | python3 -c "
import sys, json
data = json.load(sys.stdin)['data']
for item in data:
print(f\"{item['id']}. {item['word']} 热度:{item['num']}\")
"
2.2 关键词过滤
bash
weibo-cli search hot_word/biz --output json | python3 -c "
import sys, json
data = json.load(sys.stdin)['data']
keyword = 'AI'
matches = [x for x in data if keyword in x['word']]
for m in matches:
print(m['word'], m['num'])
"
2.3 定时执行
将上述脚本保存为 monitor.sh,加入 crontab 定时运行:
bash
# 每小时执行一次
0 * * * * /path/to/monitor.sh >> /var/log/monitor.log 2>&1
三、场景二:内容检索与数据采集
3.1 关键词搜索
weibo-cli 支持按关键词检索微博内容:
bash
weibo-cli search statuses/limited \
--q "目标关键词" \
--type 1 \
--sort hot \
--count 20 \
--output json > result.json
主要参数说明(经 commands show 核验):
| 参数 | 必填 | 说明 |
|---|---|---|
--q |
是 | 检索关键词,不能含 {、}、" 等特殊字符 |
--type |
是 | 1=微博 2=评论 3=私信 |
--count |
否 | 返回条数,默认 10,最大 20 |
--sort |
否 | time=时间倒序 hot=热门度(仅返回精选微博) |
--page |
否 | 页码,默认为 1 |
可用套餐:Basic、Plus、Pro、Ultra
3.2 多页采集
单次最多返回 20 条,需要更多数据时使用 --page 参数翻页:
bash
#!/bin/bash
# collect.sh 分页采集关键词搜索结果
KEYWORD="目标关键词"
for page in 1 2 3 4 5; do
weibo-cli search statuses/limited \
--q "$KEYWORD" \
--type 1 \
--sort hot \
--count 20 \
--page $page \
--output json > "page_${page}.json"
COUNT=$(python3 -c "
import json
d = json.load(open('page_${page}.json'))
print(len(d.get('statuses', [])))
")
echo "第 $page 页:$COUNT 条"
if [ "$COUNT" -eq "0" ]; then
echo "无更多数据,停止"
break
fi
sleep 1.5
done
注意: 相邻两次请求之间建议间隔 1 秒以上,避免请求频率过高。
3.3 结果合并与规范化
python
import json, glob
all_statuses = []
for f in sorted(glob.glob("page_*.json")):
data = json.load(open(f))
all_statuses.extend(data.get("statuses", []))
normalized = []
for s in all_statuses:
normalized.append({
"id": str(s.get("id", "")),
"text": s.get("text", ""),
"attitudes_count": s.get("attitudes_count", 0),
"comments_count": s.get("comments_count", 0),
"reposts_count": s.get("reposts_count", 0),
"user_name": s.get("user", {}).get("screen_name", ""),
"user_followers": s.get("user", {}).get("followers_count", 0),
})
with open("merged.jsonl", "w", encoding="utf-8") as f:
for item in normalized:
f.write(json.dumps(item, ensure_ascii=False) + "\n")
print(f"合并完成,共 {len(normalized)} 条")
四、场景三:互动数据处理
4.1 获取评论
获取当前账号收到的评论(可用套餐:Basic、Plus、Pro、Ultra):
bash
weibo-cli comments to_me/biz \
--count 20 \
--output json > comments.json
参数说明:--count 最大 20,--page 可翻页,--max_id / --since_id 可做游标翻页。
4.2 过滤特定评论
python
import json, re
comments = json.load(open("comments.json"))["comments"]
pattern = re.compile(r'多少钱|在哪买|怎么买|链接')
inquiry = [c for c in comments if pattern.search(c.get("text", ""))]
print(f"筛选出 {len(inquiry)} 条咨询类评论")
with open("inquiry.json", "w", encoding="utf-8") as f:
json.dump(inquiry, f, ensure_ascii=False, indent=2)
4.3 批量回复 [写操作]
注意: 回复操作不可撤销。执行前请先检查
inquiry.json的内容是否符合预期。
python
import json, subprocess
inquiry = json.load(open("inquiry.json"))
for c in inquiry:
mid = c["rootidstr"] # 被评论的微博 ID(对应 --id)
cid = c["idstr"] # 评论 ID(对应 --cid)
subprocess.run([
"weibo-cli", "comments", "reply",
"--id", mid,
"--cid", cid,
"--comment", "感谢咨询,详情可私信了解~"
])
comments reply 必填参数:--id(微博 ID)、--cid(评论 ID)、--comment(回复内容,不超过 140 汉字)。可用套餐:Basic、Plus、Pro、Ultra。
五、完整 Pipeline 示例
将采集、处理、输出三个环节串联为一个可定时执行的脚本:
bash
#!/bin/bash
# pipeline.sh
# 用法:bash pipeline.sh "目标关键词"
set -euo pipefail
KEYWORD="${1:-AI工具}"
TIMESTAMP=$(date +%Y%m%d_%H%M)
OUTPUT_DIR="./data/${TIMESTAMP}"
mkdir -p "$OUTPUT_DIR"
echo "=== [1/3] 检查账号状态 ==="
weibo-cli doctor
echo ""
echo "=== [2/3] 采集关键词微博 ==="
weibo-cli search statuses/limited \
--q "$KEYWORD" \
--type 1 \
--sort hot \
--count 20 \
--output json > "$OUTPUT_DIR/raw.json"
echo ""
echo "=== [3/3] 生成简报 ==="
python3 - <<EOF
import json
data = json.load(open("$OUTPUT_DIR/raw.json"))
items = data.get("statuses", [])
total = len(items)
if total == 0:
print("无数据")
else:
avg_att = sum(s["attitudes_count"] for s in items) / total
avg_cmt = sum(s["comments_count"] for s in items) / total
top3 = sorted(items, key=lambda x: x["attitudes_count"], reverse=True)[:3]
print(f"关键词:$KEYWORD")
print(f"采集量:{total} 条")
print(f"平均点赞:{avg_att:.0f} 平均评论:{avg_cmt:.0f}")
print("\nTop 3 互动微博:")
for i, s in enumerate(top3, 1):
print(f" {i}. [{s['attitudes_count']} 赞] {s['user']['screen_name']}: {s['text'][:50]}...")
EOF
echo ""
echo "完成,数据保存至 $OUTPUT_DIR"
加入 crontab 每日定时执行:
bash
0 9 * * * /path/to/pipeline.sh "AI工具" >> /var/log/pipeline.log 2>&1
六、常见问题
| 问题现象 | 排查方式 |
|---|---|
| 命令执行报错,原因不明 | 先运行 weibo-cli doctor,逐项确认账号与套餐状态 |
--count 指定数量但实际返回更少 |
sort=hot 仅返回精选微博,实际条数可能少于上限 |
COUNT_EXCEEDS_MAX 报错 |
search statuses/limited 和 comments to_me/biz 的 --count 最大均为 20 |
hot_word/biz 提示无权限 |
该命令需要 Pro 或 Ultra 套餐 |
| Windows 下管道符传输 JSON 乱码 | 改用 PowerShell 或 WSL2 执行脚本 |
| 写操作执行了不想要的内容 | 写操作前务必先检查数据,操作不可撤销 |
七、小结
weibo-cli 将微博开放能力封装为可在终端直接调用的命令,核心价值在于降低接口调用的门槛:开发调试阶段可以快速验证效果,在已有项目中也可以将其作为流程的一个环节嵌入。
本篇涉及的三个场景------热点趋势监控、内容检索采集、互动数据处理------均基于 weibo-cli 当前已开放的能力,所有命令参数均经 CLI 实际调用核验。具体的业务逻辑、内容策略和应用设计,需要开发者结合自身需求完成。
更多命令和参数说明,参见官方文档。
参考资源