热点雷达(hotspot)#
微博实时热搜 + 用户关注词过滤(DeepSeek 判定)的极简网站:登录后写下你想关注的内容(如 ai、新能源车),页面只留相关热搜,也能一键看完整榜单。
域名 hot.hsfp.cn(预览 hot_dev.hsfp.cn);代码 /root/pi-cwd-20260820/hotspot,容器 hotspot(:4440),2026-09-22 建。
关联:提示词、Authentik接入指南、nginx-proxy-manager使用手册、我的服务
关键实现#
数据源:
https://weibo.com/ajax/statuses/hot_band(带category分类,最全),失败回退/ajax/side/hotSearch。必须带浏览器 UA + Referer,否则微博返回{"error":"Forbidden"}(服务器是境外 IP,无 Referer 直接 403;实测这两个 ajax 接口带 Referer 可用,不用走代理)。登录:auth.hsfp.cn(Authentik)OIDC 授权码,应用
hotspot(provider pk 37),redirect URI 两条(hot / hot_dev)。无状态 HMAC session cookie,签名密钥HOTSPOT_SESSION_SECRET(缺失回退 client_secret,30 天有效期)。参考实现见 Authentik接入指南 与autodev/lib/auth.ts。标签 + 判定三层复用(2026-09-22 重构,核心省 token 机制):
热搜快照全站共享 TTL 5 分钟(只留最近 20 份);
条目标签
ItemLabel(全局):键 = 标题归一化哈希(去 #/空白/标点后小写),同一个标题只让 AI 打一次 1–3 个中文通用标签(数码/手机、车企/新能源车、娱乐圈/歌手…),以后同标题直接读标签;用户级逐关键词判定
UserItemDecision:唯一键(userId, titleHash, keyword),判过就不再问 AI(60 天过期,另有「重新判定」按钮清空);标签亲和
TagAffinity(用户级):AI 认定「关注词↔标签」关系后,以后带该标签的新条目直接本地命中。 判定顺序:缓存 → 标题/标签字面双向包含(标签命中)→ 标签亲和(标签复用)→ 最后才呼叫 AI(AI 新判,一次调用覆盖本轮所有未决对)。页面每条标出判定来源角标。
实测收益(53 条榜单 / 2 个关注词 /
deepseek-flash):首次全量 33s(102 对);同条件再请求 39ms、0 次 AI;榜单换新后只判新标题(新增 1 条 → 1 对新判,7.8s);新标题带已知标签时 0 次 AI 直接命中。一个真 bug(已修):同一条目里若某关注词已被标签命中、其余关键词未决,旧实现会把整行所有关键词都再送 AI —— 既白烧 token,又把
rule结论覆盖成llm。修法是本轮已定的对记进handled集合,AI 回填时跳过;llmPairs统计也只算真正未决的对(原先按「未决条目数 × 全部关键词数」高估)。降级:抓取失败 → 回退最近快照并标
stale(页面提示数据滞后);判定失败/未配 key → 字面包含匹配,且降级结果不写缓存,下次请求自动重试。前端:Next.js 16 App Router + Semi Design + 自写 CSS 变量(亮/暗色切换)、5 分钟自动刷新、只看关注开关。移动端响应式。
踩坑#
DeepSeek 是推理模型:
max_tokens给小会把正文截空(finish_reason=length,content 为空字符串)——lib/judge.ts设 8000 才稳。这条与 2026-09-19 记录的 new-api 思考吃满 max_tokens 是同一类问题。docker build 里
apt-get install openssl极慢/失败:node:slim 默认deb.debian.org,本机实测 9 MB 索引拉 12 分钟,还会因半截索引报Unable to locate package openssl。必须先sed -i 's#deb.debian.org#mirrors.aliyun.com#g' /etc/apt/sources.list.d/debian.sources(builder 和 runner 两个 stage 都要)。直接用本机已有的node:24-slim,node:20-slim本地没有、要拉。反代下推断站点 origin 要用
x-forwarded-proto+host,不能用req.url(host 会被改写,导致 redirect_uri 对不上)。docker compose up -d --build会随机失败:加速站docker.1panel.live对HEAD /v2/library/node:24-slim回 403,BuildKit 解析不到基础镜像元数据(同样的构建几分钟前还是好的,属镜像站抖动)。本机已有该镜像,用docker build --pull=false -t hotspot:latest .+docker compose up -d --no-build绕开。
数据模型(prisma/schema.prisma,SQLite)#
User(主键=Authentik sub,不建密码表)/ WatchPref(关注词 JSON,最多 20 个)/ HotSnapshot(榜单快照)/ ItemLabel(全局条目标签,键 titleHash)/ UserItemDecision(用户级判定缓存,键 userId+titleHash+keyword)/ TagAffinity(用户级关键词↔标签亲和)。旧的 MatchResult 表已删。
上线验收(2026-09-22)#
https://hot.hsfp.cn/https://hot_dev.hsfp.cn均 200,走*.hsfp.cn通配证书(NPM host id 176/177,http2_support: true避免 421);容器hotspot跑在172.17.0.1:4440,rootfs 检查 20 项(正常)。线上端到端实测(真 Cookie 访问 /api/hot):关注词
["ai", <泛娱乐圈词>]→ 50 条榜命中 10 条,全是该类人物相关,零误报;["数码"]命中 3 条 vivo 相关;榜单里确实没有 AI 条目时ai正确命中 0 条。前端 10 条渲染、关键词标签与理由、暗色切换(theme-mode=dark,bg #16181d)均已验证;测试用户已从库里清掉。v2(标签/判定复用)线上验收:真实用户 happen 已用 auth.hsfp.cn 登录成功(SSO 链路真机验证通过)并设了关注词
ai;线上首次判定 26.5s(99 对,其中 6 条新打标签、其余 44 条标签复用),同条件再请求 180ms、0 次 AI;页面每条显示标签 chip + 判定来源角标(AI 新判/标签命中/标签复用/历史判定),统计行显示「本次无需 AI 判定(全部复用既有标签/判定) · 复用 100 对 · 已打标签条目 50/50」。清理提醒:直接改 SQLite(不经 Prisma)删 User 不会触发级联,会留下孤立的
UserItemDecision/TagAffinity/WatchPref行,删测试用户时要手动按 userId 清。
讨论 0
还没有人说话。
登录登录后可以参与讨论