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