🔥 热搜王:用接口盒子 + 飞书 Webhook 快速掌握微博热搜
在之前的牛马专列系列,已经实现了“有温度”的打工人提醒机器人。在女朋友的提议下,又灵感一现,准备通过获取微博热搜接口做一个热搜整合机器人,供饭后消遣。
我给它起了个特别整蛊的名字:热搜王。
每天工作时间,它会自动在群里冒出来提醒:
- 微博热搜 Top5
- 热度信息和跳转链接
- 真实热搜(剔除广告和置顶干扰)
功能概览
- 自动抓取热搜:通过接口盒子快速获取微博热搜数据
- 筛选真实热搜:只取 desc_extr 为纯数字的热度信息
- 飞书互动卡片:生成 Markdown 格式卡片,带标题、热度和跳转链接
- 定时推送:每天 9:15 – 18:00,每 2 小时推送一次;启动时立即执行一次
- 防重复运行:文件锁机制确保同一时间只有一个实例
- 日志记录:记录每次热搜抓取和发送情况,日志超过设定大小自动清理
这里使用 接口盒子 的原因,是因为这个工具真的很轻量,注册一个会员即可使用。且提供的各个平台的接口也十分丰富,后续也可以通过更改URL直接进行扩展,
核心实现思路
1. 接口盒子抓取热搜
def fetch_weibo_hotsearch(api_id, api_key):
url = f"https://cn.apihz.cn/api/xinwen/weibo.php?id={api_id}&key={api_key}"
resp = requests.get(url, timeout=20)
resp.raise_for_status()
data = resp.json()
if data.get("code") != 200:
raise RuntimeError(f"API异常: {data}")
return data.get("data", [])
- api_id 和 api_key 通过接口盒子申请
- 返回数据包含标题、热度、跳转链接等
2. 筛选真实热搜
def filter_and_pick_top(items, topn=5):
real = [it for it in items if is_pure_digits(it.get("desc_extr"))]
real.sort(key=lambda x: int(str(x.get("desc_extr")).strip()), reverse=True)
return real[:topn]
- 只保留热度为纯数字的项,避免广告或置顶
- 按热度排序,取前 5
微博热搜接口返回范例:
{
"code": 200,
"time": 1756352435,
"time2": "2025-08-28 11:40:35",
"data": [{
"title": "持之以恒推动中俄关系高水平发展",
"icon": "https://simg.s.weibo.com/moter/flags/2_0.png",
"desc_extr": null, //新时代热搜,不统计
"scheme": "https://m.weibo.cn/search?xxxxx"
},
{
"title": "普京和金正恩等出席抗战纪念活动",
"icon": "https://simg.s.weibo.com/moter/flags/1_0.png",
"desc_extr": 1864629,
"scheme": "https://m.weibo.cn/search?xxxxx"
},
{
"title": "孙颖莎T杂志",
"icon": "https://simg.s.weibo.com/moter/flags/1_0.png",
"desc_extr": 1323548,
"scheme": "https://m.weibo.cn/search?xxxxx"
},
{
"title": "中国蓝盔卫士亮相九三阅兵",
"icon": null,
"desc_extr": 1204785,
"scheme": "https://m.weibo.cn/search?xxxxx"
},
{
"title": "真夫妻kisskiss我shyshy",
"icon": "https://simg.s.weibo.com/moter/flags/1_0.png",
"desc_extr": "综艺 1199311", //热搜前带备注,广告/推广 不统计
"scheme": "https://m.weibo.cn/search?xxxxx"
},
{
"title": "251万存款凭空消失被6名老人取走",
"icon": "https://simg.s.weibo.com/moter/flags/1_0.png",
"desc_extr": 820034,
"scheme": "https://m.weibo.cn/search?xxxxx"
}
]
}
3. 飞书卡片发送
def build_feishu_card(hotlist, mention_uid=None):
elements = []
if mention_uid:
elements.append({
"tag": "div",
"text": {"tag": "lark_md", "content": f"<at id={mention_uid}></at> 微博热搜更新"}
})
for idx, item in enumerate(hotlist, start=1):
title = item.get("title", "(无标题)")
scheme = item.get("scheme") or ""
hot_value = str(item.get("desc_extr")).strip()
content = f"**{idx}. [{title}]({scheme})** 🔥 **{hot_value}**"
elements.append({"tag": "div", "text": {"tag": "lark_md", "content": content}})
elements.append({
"tag": "note",
"elements": [
{"tag": "plain_text", "content": "数据来源:微博热搜,仅取真实热搜数据(不包含广告、新时代置顶热搜)"}
]
})
return {
"msg_type": "interactive",
"card": {
"config": {"wide_screen_mode": True},
"header": {
"template": "red",
"title": {
"content": f"微博热搜 Top {len(hotlist)} | {datetime.datetime.now(SH_TZ).strftime('%Y-%m-%d %H:%M')}",
"tag": "plain_text"
}
},
"elements": elements
}
}
- 支持 @ 指定用户
- 支持 Markdown 高亮显示热度和标题
4. 定时调度
- 使用 while True 循环 + 时间检查
- 每天 9:15 – 18:00,每两小时推送一次(9:15, 11:15, 13:15, 15:15, 17:15)
- 启动时立即执行一次
5. 防并发 & 日志
- 文件锁 fcntl.flock() 确保只运行一个实例
- 日志文件超过 5 MB 自动删除重建
配置项说明
| 变量 | 含义 | 默认值 | 说明 |
|---|---|---|---|
| WEBHOOK_URL | 飞书 Webhook 地址 | (你的地址) | 去飞书群聊添加机器人获得 |
| API_ID | 接口盒子 ID | (你的ID) | 抓取微博热搜需要 |
| API_KEY | 接口盒子 Key | (你的Key) | 抓取微博热搜需要 |
| LOG_FILE | 日志文件路径 | trendingking.log | 记录抓取和发送情况 |
| LOCK_FILE | 锁文件路径 | trendingking.lock | 防重复运行 |
| MAX_LOG_MB | 日志最大大小 | 5 MB | 超过会自动删除重建 |
运行方式
1. 安装依赖:
pip install requests
2. 运行脚本:
python3 trendingking.py
3. 建议使用 nohup 或 systemd 常驻运行:
nohup python3 trendingking.py &
飞书卡片效果
飞书卡片显示 Top5 热搜,带热度和跳转链接:
