🔥 热搜王:用接口盒子 + 飞书 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 热搜,带热度和跳转链接:
