X Demand Radar

SKILL运维和基础设施
运维和基础设施 未标注权限 许可证不明确

AI 热点雷达 - 在新 AI 工具/关键词爆火前发现它们,抢注域名、建站套利。 触发条件: - 用户说「跑雷达」、「热点扫描」、「X 雷达」 - cron 每 12 小时自动触发(9:00, 21:00) 核心目标: 在 AI 关键词/工具首次病毒传播 → 大众认知的 24-72h 窗口内发现, 抢注域名 + 建工具站 + 吃搜索流量红利。 典型案例:Nano Banana、Ghibli AI、OpenClaw、Hermes

一句话选型结论

按资料字段整理

X Demand Radar是运维和基础设施类的 Agent Skill,安装方式:GitHub 仓库,权限级别未标注,许可证不明确,没有现成安装命令,需按说明手动放置 SKILL.md。技能本质是给模型读的说明书,效果取决于模型与客户端;装完先用一个小任务验证,再放进正式流程。

分类运维和基础设施 安装方式GitHub 仓库 权限级别未标注权限 许可证许可证不明确
累计安装 未标注 本周 未标注
GitHub 星标 未标注 仓库 7deer_skills
下载量 未标注 技能市场下载数
权限级别 未标注权限 安装前请确认风险范围
许可证 许可证不明确 未说明

安装

GitHub 仓库
在支持 Skills 的客户端里执行,装完问一句「你有哪些技能」验证
  1. 1
    确认客户端支持

    确认你的客户端支持 Skills(Claude、Codex、Cursor 等),并升级到较新的版本。

  2. 2
    拿到技能文件

    按安装说明或仓库 README,把 SKILL.md 放到客户端的 skills 目录(一般一个技能一个文件夹)。

  3. 3
    刷新技能列表

    重新打开客户端,或刷新技能列表,让新放进来的技能被加载。

  4. 4
    验证是否生效

    问一句「你有哪些技能」,确认列表里出现它,再拿一个小任务试跑。

技能档案

运维和基础设施
字段来自技能仓库与公开索引,中文说明由本站标注
作者 / 维护方kennyzir仓库 7deer_skills · 版本 未标注
宿主客户端未标注技能可被这些客户端加载
安装方式GitHub 仓库安装包 kennyzir/7deer_skills
权限级别未标注权限安装前请确认风险范围
许可证未说明许可证不明确,商用前请自行确认条款
仓库可用性available技能仓库当前是否可访问
最近核验未标注上游最后核验时间 · 数据更新 2026-05-09
正文体量17.6 KBSKILL.md 原文大小,越大说明说明书写得越细

典型使用场景

3 类
按分类整理的常见用法,具体以 SKILL.md 为准
查服务与日志

按现象定位服务状态与日志线索。

写部署与巡检脚本

把重复的部署、巡检写成脚本。

故障排查

按步骤排查网络、依赖与配置。

选择建议

装之前先看这几条
按条目字段给出的判断,不替你决定用不用

值得选的地方

  • 基础信息齐全,可以先按说明装一个试试。

先想清楚的地方

  • 没有标注权限级别,实际能做什么要装好后确认。
  • 许可证不明确,商用或二次分发前先到仓库确认条款。
  • 没有现成安装命令,要按安装说明或仓库 README 手动放置。
  • 没有做站内核验,内容以作者仓库为准。
  • 技能只是说明书,实际效果取决于模型与客户端,装完先用小任务试一遍。

更适合

  • 需要在运维和基础设施场景里给模型补一套做法的人。
  • 愿意先读一遍 SKILL.md、确认它会让模型做什么的人。

不太适合

  • 对许可证要求很严、必须明确可商用的人。
  • 只想装完就自动变强、不打算看说明书的人。

同类对比

6 个同类
同分类里挑最接近的几条,字段以各自详情页为准
技能权限级别安装方式累计安装宿主客户端安装命令
X Demand Radar当前 未标注权限 GitHub 仓库 未标注 未标注 无
Azure 部署 调用外部服务 GitHub 仓库 664.2 万 Codex、Claude、Cursor 有
Azure diagnostics 问题管理 调用外部服务 GitHub 仓库 657.6 万 Codex、Claude、Cursor 有
Azure aigateway 部署 调用外部服务 GitHub 仓库 655.3 万 Codex、Claude、Cursor 有
Azure AI 搜索 调用外部服务 GitHub 仓库 651.4 万 Codex、Claude、Cursor 有
Azure Cloud migrate 部署 调用外部服务 GitHub 仓库 650.7 万 Codex、Claude、Cursor 有

SKILL.md 全文

17.6 KB
模型实际读到的说明书原文,来自技能仓库

X AI 热点雷达

核心指标

最终得分 = X 热度 × 项目新鲜度

  • raw_hot_score = likes × log(1 + likes_per_hour)
  • 增速 = 点赞数 / (当前时间 - 发布时间) 小时
  • 项目新鲜度校验:发现 GitHub 项目后,必须导航到仓库页面验证创建日期
  • final_score = raw_hot_score × freshness_multiplier
  • 项目 < 7 天:× 1.0
  • 项目 7-30 天:× 0.7
  • 项目 30-90 天:× 0.3
  • 项目 > 90 天:标记 ⚠️ 旧项目回锅,不参与排名

🔴 关键教训:UI-TARS-desktop (bytedance) 29K 星但 repo 已存在数月,X 帖子虽然是新的但项目不新 → 套利空间归零。热度高 ≠ 项目新。

搜索矩阵(6 层探测器)

每层目标不同,覆盖野生热点 → 新品发布 → 病毒传播 → 开源爆发 → FOMO 需求全链路。

L0: 野生病毒(48h 窗口)🆕

捕捉不带 AI 标签但疯狂传播的产品/游戏/工具。这是捕捉 H5 游戏、网页工具等非 AI 热点的关键层。

(&quot;this is insane&quot; OR &quot;game changer&quot; OR &quot;holy shit&quot; OR &quot;mind blown&quot; OR &quot;this is crazy&quot; OR &quot;cannot believe&quot; OR &quot;blown away&quot;) (game OR tool OR app OR website OR &quot;web app&quot; OR builder OR generator OR platform OR &quot;waitlist&quot;) min_faves:200 since:SINCE_48H

⚠️ 注意:L0 不要求 AI 关键词,min_faves 提升到 200 以过滤噪声。

L1: 新品发射-AI(24h 窗口)

捕捉"刚刚发布/开源"的 AI 工具,最早信号。

(&quot;just launched&quot; OR &quot;just dropped&quot; OR &quot;just shipped&quot; OR &quot;new AI tool&quot; OR &quot;just released&quot; OR &quot;introducing&quot; OR &quot;launching today&quot;) (AI OR LLM OR GPT OR agent OR open source) min_faves:30 since:SINCE_24H

L1-b: 泛新品发射(24h 窗口)🆕

捕捉非 AI 的新发布产品/游戏/工具。

(&quot;just launched&quot; OR &quot;just dropped&quot; OR &quot;just shipped&quot; OR &quot;just released&quot; OR &quot;introducing&quot; OR &quot;launching today&quot; OR &quot;new&quot; OR &quot;announcing&quot;) (game OR tool OR app OR website OR &quot;web app&quot; OR builder OR platform) min_faves:100 since:SINCE_24H

L2: 病毒传播(48h 窗口)

捕捉正在被疯转的 AI 产品。

(&quot;this is insane&quot; OR &quot;game changer&quot; OR &quot;holy shit&quot; OR &quot;mind blown&quot; OR &quot;this is crazy&quot; OR &quot;cannot believe&quot; OR &quot;blown away&quot;) (AI OR LLM OR GPT OR agent OR tool) min_faves:100 since:SINCE_48H

L3: GitHub 星标暴增(48h 窗口)

开源 AI 项目突然爆火。

(&quot;github.com&quot; OR &quot;open source&quot;) (AI OR LLM OR GPT OR agent) (&quot;stars&quot; OR &quot;trending&quot; OR &quot;blew up&quot; OR &quot;blowing up&quot; OR &quot;just hit&quot;) min_faves:100 since:SINCE_48H

L4: FOMO / Waitlist(72h 窗口)

等不及、求邀请、排长队 = 需求溢出信号。

(&quot;waitlist&quot; OR &quot;beta access&quot; OR &quot;invite&quot; OR &quot;early access&quot; OR &quot;can&#x27;t wait&quot; OR &quot;need this&quot;) (AI OR LLM OR tool OR app) min_faves:50 since:SINCE_72H

执行流程

[Cron: 每12小时]
       ↓
[浏览器注入 X Cookie → 已登录状态]
       ↓
[L0-L4 逐层搜索 → JS 滚动收集]
       ↓
[合并去重 → 计算 raw_hot_score]
       ↓
[🔍 Step 2.5: 项目新鲜度校验]
       ↓
[AI 提取:关键词 + 产品名 + 项目年龄 + 一句话总结]
       ↓
[Top 10 排序 → 生成报告]
       ↓
[直接发送飞书]

Step 1: 构造搜索 URL

const now = new Date();
const since24h = new Date(now - 24*60*60*1000).toISOString().split(&#x27;T&#x27;)[0];
const since48h = new Date(now - 48*60*60*1000).toISOString().split(&#x27;T&#x27;)[0];
const since72h = new Date(now - 72*60*60*1000).toISOString().split(&#x27;T&#x27;)[0];

const SEARCH_GROUPS = [
  {
    layer: &#x27;L0-野生病毒&#x27;,
    q: `(&quot;this is insane&quot; OR &quot;game changer&quot; OR &quot;holy shit&quot; OR &quot;mind blown&quot; OR &quot;this is crazy&quot; OR &quot;cannot believe&quot; OR &quot;blown away&quot;) (game OR tool OR app OR website OR &quot;web app&quot; OR builder OR generator OR platform OR &quot;waitlist&quot;) min_faves:200 since:${since48h}`,
    since: since48h
  },
  {
    layer: &#x27;L1-新品发射-AI&#x27;,
    q: `(&quot;just launched&quot; OR &quot;just dropped&quot; OR &quot;just shipped&quot; OR &quot;new AI tool&quot; OR &quot;just released&quot; OR &quot;introducing&quot;) (AI OR LLM OR GPT OR agent OR &quot;open source&quot;) min_faves:30 since:${since24h}`,
    since: since24h
  },
  {
    layer: &#x27;L1-b-泛新品&#x27;,
    q: `(&quot;just launched&quot; OR &quot;just dropped&quot; OR &quot;just shipped&quot; OR &quot;just released&quot; OR &quot;introducing&quot; OR &quot;launching today&quot; OR &quot;new&quot; OR &quot;announcing&quot;) (game OR tool OR app OR website OR &quot;web app&quot; OR builder OR platform) min_faves:100 since:${since24h}`,
    since: since24h
  },
  {
    layer: &#x27;L2-病毒传播&#x27;,
    q: `(&quot;this is insane&quot; OR &quot;game changer&quot; OR &quot;holy shit&quot; OR &quot;mind blown&quot; OR &quot;this is crazy&quot; OR &quot;cannot believe&quot; OR &quot;blown away&quot;) (AI OR LLM OR GPT OR agent OR tool) min_faves:100 since:${since48h}`,
    since: since48h
  },
  {
    layer: &#x27;L3-GitHub爆发&#x27;,
    q: `(&quot;github.com&quot; OR &quot;open source&quot;) (AI OR LLM OR GPT OR agent) (&quot;stars&quot; OR &quot;trending&quot; OR &quot;blew up&quot; OR &quot;blowing up&quot; OR &quot;just hit&quot;) min_faves:100 since:${since48h}`,
    since: since48h
  },
  {
    layer: &#x27;L4-FOMO&#x27;,
    q: `(&quot;waitlist&quot; OR &quot;beta access&quot; OR &quot;invite&quot; OR &quot;early access&quot; OR &quot;can&#x27;t wait&quot; OR &quot;need this&quot;) (AI OR LLM OR tool OR app) min_faves:50 since:${since72h}`,
    since: since72h
  }
];

Step 2: 抓取 + 计算热力值

// 在 browser console 中运行
async function collectAndScore(sinceHours) {
  let allPosts = [];
  let prevCount = 0;
  let scrolls = 0;
  const maxScrolls = 12;

  while (scrolls &lt; maxScrolls) {
    const articles = document.querySelectorAll(&#x27;article&#x27;);
    articles.forEach((a) =&gt; {
      const textEl = a.querySelector(&#x27;[data-testid=&quot;tweetText&quot;]&#x27;) || a.querySelector(&#x27;[lang]&#x27;);
      const text = textEl?.innerText || &#x27;&#x27;;
      if (!text || text.length &lt; 30) return;

      const likesEl = a.querySelector(&#x27;[data-testid=&quot;like&quot;] span&#x27;);
      let likes = 0;
      if (likesEl) {
        const txt = likesEl.innerText.replace(/,/g, &#x27;&#x27;);
        if (txt.includes(&#x27;K&#x27;)) likes = Math.round(parseFloat(txt.replace(&#x27;K&#x27;,&#x27;&#x27;)) * 1000);
        else if (txt.includes(&#x27;M&#x27;)) likes = Math.round(parseFloat(txt.replace(&#x27;M&#x27;,&#x27;&#x27;)) * 1000000);
        else likes = parseInt(txt) || 0;
      }

      // 提取作者
      const allLinks = Array.from(a.querySelectorAll(&#x27;a[role=&quot;link&quot;]&#x27;));
      const authorLink = allLinks.find(l =&gt; l.href &amp;&amp; l.href.includes(&#x27;x.com/&#x27;) &amp;&amp; !l.href.includes(&#x27;/status/&#x27;) &amp;&amp; !l.href.includes(&#x27;search&#x27;) &amp;&amp; !l.href.includes(&#x27;hashtag&#x27;));
      const author = authorLink?.href?.split(&#x27;/&#x27;).pop() || &#x27;&#x27;;

      // 提取时间
      const timeEl = a.querySelector(&#x27;time&#x27;);
      const time = timeEl?.getAttribute(&#x27;datetime&#x27;) || &#x27;&#x27;;

      // 提取链接
      const statusLink = allLinks.find(l =&gt; l.href &amp;&amp; l.href.includes(&#x27;/status/&#x27;));
      const link = statusLink?.href || &#x27;&#x27;;

      // 提取转发数
      const repostEl = a.querySelector(&#x27;[data-testid=&quot;retweet&quot;] span, [data-testid=&quot;repost&quot;] span&#x27;);
      let reposts = 0;
      if (repostEl) {
        const txt = repostEl.innerText.replace(/,/g, &#x27;&#x27;);
        if (txt.includes(&#x27;K&#x27;)) reposts = Math.round(parseFloat(txt.replace(&#x27;K&#x27;,&#x27;&#x27;)) * 1000);
        else reposts = parseInt(txt) || 0;
      }

      if (!allPosts.some(p =&gt; p.text === text)) {
        allPosts.push({ text: text.substring(0, 400), likes, reposts, author, time, link });
      }
    });

    if (allPosts.length === prevCount &amp;&amp; scrolls &gt; 2) break;
    prevCount = allPosts.length;

    window.scrollBy(0, 600);
    await new Promise(r =&gt; setTimeout(r, 1500));
    scrolls++;
  }

  // 计算热力值
  const now = new Date();
  return allPosts.map(p =&gt; {
    const postTime = new Date(p.time);
    const hoursAgo = Math.max(0.1, (now - postTime) / (1000 * 60 * 60));
    const likesPerHour = p.likes / hoursAgo;
    const hotScore = Math.round(p.likes * Math.log(1 + likesPerHour));
    return { ...p, hoursAgo: Math.round(hoursAgo * 10) / 10, likesPerHour: Math.round(likesPerHour), hotScore };
  }).sort((a, b) =&gt; b.hotScore - a.hotScore);
}

Step 2.5: 项目新鲜度校验(🔴 必须执行)

⚠️ X 热度 ≠ 项目新。旧项目被重新提起可能在 X 上很热,但套利窗口已关闭。

先查已知旧项目清单:references/known-stale-repos.md — 匹配到的直接排除,无需导航 GitHub。

对每个包含 GitHub 链接的信号,必须 navigate 到仓库页面验证创建日期:

// 在 GitHub 仓库页面运行
const createdEl = document.querySelector(&#x27;relative-time&#x27;);
const createdAt = createdEl?.getAttribute(&#x27;datetime&#x27;) || &#x27;&#x27;;
const daysSinceCreated = (new Date() - new Date(createdAt)) / (1000 * 60 * 60 * 24);

let freshnessLabel;
if (daysSinceCreated &lt; 7) freshnessLabel = &#x27;🆕 新品&#x27;;
else if (daysSinceCreated &lt; 30) freshnessLabel = &#x27;📈 上升&#x27;;
else if (daysSinceCreated &lt; 90) freshnessLabel = &#x27;⚠️ 旧项目回锅&#x27;;
else freshnessLabel = &#x27;💀 古董(排除)&#x27;;

const freshnessMultiplier = daysSinceCreated &lt; 7 ? 1.0 : daysSinceCreated &lt; 30 ? 0.7 : daysSinceCreated &lt; 90 ? 0.3 : 0;
const finalScore = Math.round(rawHotScore * freshnessMultiplier);

过滤规则:freshnessMultiplier === 0 的项目直接排除,不出现在报告中。

对于非 GitHub 项目(如新产品发布、API、Waitlist),默认 freshnessMultiplier = 0.8(给非开源项目一定宽容度),但如果能从页面提取发布日期则优先使用实际日期。

Step 3: 过滤规则

// 排除话题:crypto、战争、NSFW、meme coin
const excludePatterns = [
  /crypto|bitcoin|nft|token.*sale/i,
  /war|killed|attack|bomb/i,
  /nsfw|onlyfans|porn/i,
  /ai.*girlfriend|ai.*waifu/i,
  /meme.*coin/i
];

const filtered = allPosts
  .filter(p =&gt; p.hotScore &gt;= 200)  // 热力值阈值
  .filter(p =&gt; !excludePatterns.some(r =&gt; r.test(p.text)))
  .slice(0, 15);

Step 4: AI 提取关键词

对每条帖子运行 prompt:

从以下 X 帖子提取热点关键词(不限 AI):

帖子:{{ text }}
发布者:@{{ author }}
点赞:{{ likes }} | 转发:{{ reposts }}
发布:{{ hoursAgo }}小时前 | 增速:{{ likesPerHour }}赞/小时

输出:
- **关键词/产品名**:[提取 1-3 个核心关键词]
- **一句话**:[这个工具/项目做什么]
- **热度评分**:[hotScore]
- **套利信号**:强/中/弱(增速&gt;500赞/h = 强,100-500 = 中,&lt;100 = 弱)

Step 5: 输出报告格式

JSON 输出结构(demand-radar.json)

每个信号必须包含以下全部字段:

{
  &quot;date&quot;: &quot;YYYY-MM-DD&quot;,
  &quot;signals&quot;: [{
    &quot;rank&quot;: 1,
    &quot;keyword&quot;: &quot;产品/项目名&quot;,
    &quot;description&quot;: &quot;一句话描述做什么&quot;,
    &quot;likes&quot;: 188, &quot;velocity&quot;: 109, &quot;hotScore&quot;: 884,
    &quot;freshness&quot;: &quot;🆕 新品&quot;, &quot;finalScore&quot;: 884, &quot;signal&quot;: &quot;🟡 中&quot;,
    &quot;author&quot;: &quot;@handle&quot;,
    &quot;tweetLink&quot;: &quot;https://x.com/user/status/xxx&quot;,
    &quot;hoursAgo&quot;: 1.7,
    &quot;github&quot;: &quot;owner/repo&quot;, &quot;stars&quot;: &quot;2.8K&quot;,
    &quot;sourceLayer&quot;: &quot;L1 新品发射-AI&quot;,
    &quot;arbitrageDirection&quot;: &quot;套利方向说明 + 推荐域名&quot;,
    &quot;domainSuggestions&quot;: [&quot;domain1.com&quot;, &quot;domain2.com&quot;],
    &quot;actionPlan&quot;: &quot;具体行动方案:做什么、怎么做、为什么现在是时机&quot;,
    &quot;painPoint&quot;: &quot;用户痛点:为什么有人需要这个&quot;
  }]
}

🔴 关键规则:每个信号必须包含 tweetLink(原帖链接)、arbitrageDirection(套利方向)、domainSuggestions(域名建议)、actionPlan(行动方案)、painPoint(痛点)。缺少任一字段的信号视为不完整,不出现在报告中。

🔍 AI 热点雷达 | {{DATE}} {{TIME}}

&gt; **数据来源:X/Twitter 实时抓取 @claw0x**

## 📰 Today&#x27;s News 侧边栏

| 话题 | 时间 | 帖数 |
|------|------|------|
| {{topic}} | {{age}} | {{posts}} |

## 🔥 Top 10 热力榜

| # | 关键词 | 赞 | 增速(赞/h) | 热力值 | 新鲜度 | 最终得分 | 套利信号 |
|---|--------|-----|-----------|--------|--------|---------|---------|
| 1 | xxx | 5.2K | 1,200 | 36,000 | 🆕 0.8天 | 36,000 | 🔴 强 |

### 🚀 立即行动(套利信号 ≥ 中)
1. **{{keyword}}** — {{summary}}
   - @{{author}} | {{likes}}赞 | {{likesPerHour}}赞/小时 | {{hoursAgo}}h前
   - GitHub: `{{owner/repo}}` | 创建 {{daysAgo}} 天前 | {{stars}} stars
   - 域名:{{domain}}.com({{status}})
   - 套利方向:{{arbitrageDirection}}

## ⚠️ 已排除(旧项目回锅)

| 项目 | 原因 | 星标 | 年龄 |
|------|------|------|------|
| UI-TARS-desktop (ByteDance) | 桌面自动化 agent,X 重新被提起 | 30.9K | &gt;12个月 |

---

📊 扫描参数
- 搜索层:L0 野生 / L1 新品-AI / L1-b 泛新品 / L2 病毒 / L3 GitHub / L4 FOMO
- 时间范围:{{since}} - {{until}}
- 原始帖子:{{raw}} 条 → 去重 {{deduped}} → 过滤 {{filtered}} → 精选 {{top}} 条
- GitHub 校验:排除 {{excluded}} 个旧项目
- 浏览器状态:已登录 @claw0x

## 🔮 关键洞察

(列出 2-4 个本日扫描发现的关键趋势)

Step 6: 部署(git push → CF Pages)

cd /Volumes/sunzi/Code/ludusAI
# Save per-date JSON snapshot for /radar detail pages
cp public/data/demand-radar.json &quot;public/data/radar/YYYY-MM-DD.json&quot; 2&gt;/dev/null || true
# Build manifest
ls public/data/radar/*.json | python3 -c &quot;
import json,os,sys
m=[]
for f in sys.stdin.read().strip().split():
  d=json.load(open(f))
  t=d.get(&#x27;top10&#x27;,[])
  m.append({&#x27;date&#x27;:os.path.basename(f).replace(&#x27;.json&#x27;,&#x27;&#x27;),&#x27;topKeywords&#x27;:[x.get(&#x27;keyword&#x27;,&#x27;&#x27;) for x in t[:3]],&#x27;signalCount&#x27;:len(t),&#x27;newsTopics&#x27;:[n.get(&#x27;topic&#x27;,&#x27;&#x27;) for n in d.get(&#x27;news&#x27;,[])[:2]],&#x27;insights&#x27;:d.get(&#x27;insights&#x27;,[])[:3],&#x27;strongSignal&#x27;:sum(1 for x in t if &#x27;强&#x27; in x.get(&#x27;signal&#x27;,&#x27;&#x27;)),&#x27;mediumSignal&#x27;:sum(1 for x in t if &#x27;中&#x27; in x.get(&#x27;signal&#x27;,&#x27;&#x27;)),&#x27;raw&#x27;:d.get(&#x27;scanParams&#x27;,{}).get(&#x27;raw&#x27;,0),&#x27;top&#x27;:d.get(&#x27;scanParams&#x27;,{}).get(&#x27;top&#x27;,0),&#x27;excluded&#x27;:d.get(&#x27;scanParams&#x27;,{}).get(&#x27;githubExcluded&#x27;,0),&#x27;layers&#x27;:d.get(&#x27;scanParams&#x27;,{}).get(&#x27;layers&#x27;,[])})
m.sort(key=lambda x:x[&#x27;date&#x27;],reverse=True)
json.dump(m,open(&#x27;public/data/radar-manifest.json&#x27;,&#x27;w&#x27;),ensure_ascii=False,indent=2)
print(f&#x27;manifest: {len(m)} reports&#x27;)
&quot;
git add daily-reports/YYYY-MM-DD/x-demand-radar.md public/data/demand-radar.json public/data/radar/YYYY-MM-DD.json public/data/radar-manifest.json
git commit -m &quot;radar: YYYY-MM-DD HH:MM CST - &lt;top signal summary&gt;&quot;
git pull --rebase &amp;&amp; git push  # ⚠️ 必须 rebase,防止 non-fast-forward 拒绝

⚠️ 必须用 send_message 发飞书,不依赖 cron announce。

Cookie 注入(每次执行前)

⚠️ 详见 references/x-auth-and-collection.md — 包含完整注入流程、async IIFE 模板、K/M 解析、hotScore 公式。

// 先导航到 x.com 再注入,然后验证 x.com/home 登录成功
document.cookie = &quot;auth_token=06dec19f563932f39d96f93e9d8c005d3de9b7a9; domain=.x.com; path=/; secure; SameSite=None&quot;;

配置

  • X 账户: @claw0x(已登录浏览器)
  • 执行频率: 每 12 小时(9:00 + 21:00 CST)
  • Cookie 有效期: 需用户定期更新 auth_token
  • 输出目标: daily-reports/YYYY-MM-DD/x-demand-radar.md + public/data/demand-radar.json
  • 部署: git push → CF Pages 自动构建

Pitfalls

  1. Cookie 不跨会话持久化:每次 Hermes 启动都是新浏览器实例,cookie 必须重新注入。Cron 每次执行的第一步就是注入 cookie → 验证登录。
  2. browser_console 不能直接 return:必须用 IIFE (async function() { ... })() 包裹,否则报 Illegal return statement。详见 references/x-auth-and-collection.md。
  3. 搜索稀疏性属于正常现象:min_faves≥100 + 复杂布尔查询组合下,每层 4-16 条结果属于正常。L3(GitHub)尤其稀疏。不要降低 min_faves 阈值否则噪声淹没信号。
  4. Today's News 侧边栏是免费信号源:每次搜索页面右侧显示当日新闻话题和帖数,这些是确定性热点,应纳入报告。
  5. 推送必须直接发飞书:不要依赖 cron announce。结果写入文件后立即用 message 发送。
  6. 搜索词全球通用:所有查询用英文,不限定地区。报告聚焦全球热点(不限 AI)。
  7. execute_code 不支持大段内联 JSON:将 JSON 数据直接嵌入 Python 字符串会导致 SyntaxError: leading zeros 等解析错误。正确做法是先用 write_file 写入临时文件,再用 open() 读取:with open(&#x27;/tmp/data.json&#x27;) as f: data = json.load(f)。同样,read_file 返回带行号前缀的文本(如 1|{...}),不能直接 json.loads(),需用原生 open()。
  8. git push 可能被拒绝(non-fast-forward):远程仓库可能有其他 cron 实例或手动提交先于当前 push。始终执行 git pull --rebase &amp;&amp; git push,不要单独 git push。
  9. JS 收集截断的帖子文本可能丢失 GitHub URL:text.substring(0, 300) 可能截掉末尾的 GitHub 链接。如果帖子中提到 GitHub 但未提取到 github.com 链接,需导航到原帖 (browser_navigate 到 link 字段) 提取完整 URL,或用 GitHub 搜索 repo name 关键词查找。
  10. L0 层噪声较大(已验证):min_faves:200 挡不住大量「game changer」口语化帖子(政治/体育/生活类)。首次运行 L0 收集 19 条中仅有 4 条有潜在产品价值。建议:若连续两次雷达 L0 信号/噪声比 < 20%,将 min_faves 提升至 500,或在 L0 查询中加入 -(political OR sports OR religion) 排除词。

补充信号源(可选)

  • GitHub Trending: https://github.com/trending?since=daily
  • Product Hunt: https://www.producthunt.com/
  • Hacker News: https://news.ycombinator.com/

常见问题

5 问
答案由本站依据条目字段整理
X Demand Radar怎么安装?

没有现成安装命令:按安装说明或仓库 README,把 SKILL.md 放进客户端的 skills 目录(一般一个技能一个文件夹)。

X Demand Radar支持哪些客户端?

资料没有标注宿主客户端,但只要客户端支持 Skills(Claude、Codex、Cursor 等),一般都能加载。

X Demand Radar权限高吗,安全吗?

权限级别为未标注权限。安装前先看它会读取或写入哪些内容。

X Demand Radar收费吗?

本站不代收费用,也没有标注具体价格。是否收费取决于技能本身和所用的模型或客户端,正式使用前按作者说明确认。

X Demand Radar用什么许可证?

许可证标注为 未说明(许可证不明确)。商用或二次分发前请到仓库确认条款原文。

热门专题

按场景挑技能
全部专题 →

技能内容以作者仓库为准;分类、权限级别与许可证状态的中文说明为中文整理,最近核验 未标注。