apify-ai-search-visibility-tracker

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

AI Search Visibility Tracker

AI 搜索可见度跟踪器

Four workflows covering the full AI visibility lifecycle: discover which prompts matter → find citation opportunities → audit your site → track over time.
All workflows use
apify/google-search-scraper
for AI search. Workflow C also uses
apify/website-content-crawler
.
Recommended flow: Run Workflow A to discover prompts → Workflow B to find citation opportunities → Workflow C to audit your site → Workflow D to track everything on a schedule.

覆盖 AI 可见度完整生命周期的四个工作流:发现哪些提示词重要 → 寻找引用机会 → 审计你的网站 → 持续跟踪。
所有工作流都使用
apify/google-search-scraper
进行 AI 搜索。工作流 C 还会使用
apify/website-content-crawler
。
推荐流程: 运行工作流 A 发现提示词 → 运行工作流 B 寻找引用机会 → 运行工作流 C 审计网站 → 运行工作流 D 按计划跟踪所有内容。

Workflow A — Competitor Prompt Discovery

工作流 A — 竞争对手提示词发现

Goal: Find which queries surface a competitor in AI search answers, so you know which prompts are worth monitoring.
目标: 找出哪些查询会在 AI 搜索答案中展示竞争对手,从而了解哪些提示词值得监控。

Inputs to collect

需要收集的输入

#InputNotes
1Competitor domain(s)e.g.
brightdata.com
,
scraperapi.com
2Seed topic keywordse.g. "web scraping", "data extraction API"
3AI sourcesDefault: all six (AI Overviews, AI Mode, ChatGPT, Perplexity, Copilot, Gemini)
#输入备注
1竞争对手域名例如
brightdata.com
、
scraperapi.com
2种子主题关键词例如“网络抓取”“数据提取 API”
3AI 来源默认:全部六个(AI Overviews、AI Mode、ChatGPT、Perplexity、Copilot、Gemini)

Workflow

工作流

  1. Generate 15–30 candidate queries from seed keywords using these templates:
    • best [topic]
      ,
      [topic] tools
      ,
      how to [topic]
      ,
      [topic] for [use case]
    • [topic] vs [competitor brand]
      ,
      [competitor brand] alternative
    • [topic] API
      ,
      [topic] pricing
      ,
      [topic] tutorial
  2. Run
    apify/google-search-scraper
    for each candidate query. For each result, extract:
    • aiOverview.sources[]
      ,
      aiMode.sources[]
      ,
      chatGptAnswer.sources[]
      ,
      perplexityAnswer.sources[]
      ,
      copilotAnswer.sources[]
      ,
      geminiAnswer.sources[]
    • Also check
      answer_text
      /
      aiOverview.text
      for competitor brand name mentions (word-boundary match:
      \bBrand\b
      )
  3. For each (query, source) pair where the competitor domain or brand appears: record a hit.
  4. Output a prompt-major table sorted by total hit count descending:
| Query | ChatGPT | Perplexity | AI Overviews | AI Mode | Copilot | Gemini | Total |
|-------|---------|------------|--------------|---------|---------|--------|-------|
| "best web scraping API" | ✓ | ✓ | — | ✓ | — | ✓ | 4 |
| "how to scrape Google" | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 6 |
  1. Deliver the top-N queries (default 10) as a ready-to-paste list for Workflow D's
    config.json
    prompts.

  1. 使用以下模板从种子关键词生成 15–30 个候选查询:
    • best [topic]
      、
      [topic] tools
      、
      how to [topic]
      、
      [topic] for [use case]
    • [topic] vs [competitor brand]
      、
      [competitor brand] alternative
    • [topic] API
      、
      [topic] pricing
      、
      [topic] tutorial
  2. 针对每个候选查询运行
    apify/google-search-scraper
    。对于每个结果,提取:
    • aiOverview.sources[]
      、
      aiMode.sources[]
      、
      chatGptAnswer.sources[]
      、
      perplexityAnswer.sources[]
      、
      copilotAnswer.sources[]
      、
      geminiAnswer.sources[]
    • 还要检查
      answer_text
      /
      aiOverview.text
      中是否出现竞争对手品牌名称(词边界匹配:
      \bBrand\b
      )。
  3. 对于竞争对手域名或品牌出现的每个(查询,来源)组合,记录一次命中。
  4. 输出以提示词为主体的表格,并按总命中数降序排列:
| Query | ChatGPT | Perplexity | AI Overviews | AI Mode | Copilot | Gemini | Total |
|-------|---------|------------|--------------|---------|---------|--------|-------|
| "best web scraping API" | ✓ | ✓ | — | ✓ | — | ✓ | 4 |
| "how to scrape Google" | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 6 |
  1. 交付 top-N 个查询(默认 10 个),以生成可直接粘贴到工作流 D 的
    config.json
    prompts
    中的列表。

Workflow B — Citation Opportunity Finder

工作流 B — 引用机会发现器

Goal: For a target topic, identify which domains and content types AI engines most often cite — revealing where to publish or pitch content.
目标: 针对目标主题,找出 AI 引擎最常引用的域名和内容类型,从而揭示应在何处发布内容或推广内容。

Inputs to collect

需要收集的输入

#InputNotes
1Target topic / industrye.g. "web scraping", "ecommerce automation"
2Seed queries5–20 queries covering the topic space
3AI sourcesDefault: all six
4Deep-crawl top cited?Optional: crawl top-3 cited pages with
website-content-crawler
for structure patterns
#输入备注
1目标主题/行业例如
web scraping
、
ecommerce automation
2种子查询覆盖该主题领域的 5–20 个查询
3AI 来源默认:全部六个
4是否深度抓取高频引用页面?可选:使用
website-content-crawler
抓取每个域名引用次数最高的 3 个页面,以分析结构模式

Workflow

工作流

  1. Run
    apify/google-search-scraper
    for each seed query across selected AI sources.
  2. Collect every URL from
    sources[]
    across all results. Normalise to registrable domain (
    blog.example.com
    →
    example.com
    ).
  3. Aggregate:
    • By domain: count citations, list which AI sources cite it, list which queries triggered it
    • By content type: infer from URL path patterns (docs →
      /docs/
      ,
      /reference/
      ; blog →
      /blog/
      ; news → known news domains)
  4. Rank by total citation count. Output:
Top-cited domains for "web scraping" (42 queries × 6 sources):
| Domain | Citations | AI Sources | Inferred type |
|--------|-----------|------------|--------------|
| docs.apify.com | 38 | ChatGPT, Perplexity, AI Mode | Documentation |
| scraperapi.com/blog | 21 | AI Overviews, Gemini | Long-form blog |
  1. If deep-crawl enabled: run
    apify/website-content-crawler
    on the top-3 cited URLs per domain. From the markdown output, extract:
    • First heading that directly answers the query
    • Presence of code blocks in first 500 words
    • Word count
    • Whether an H2/H3 contains the exact query phrase
  2. Summarise patterns: "AI engines in this topic prefer [long-form docs / short direct-answer posts]. Typical cited page: [word count range], [has/lacks direct-answer H2], [has/lacks code example above the fold]."

  1. 针对每个种子查询,在所选 AI 来源中运行
    apify/google-search-scraper
    。
  2. 收集所有结果中
    sources[]
    里的每个 URL。将其规范化为可注册域名(
    blog.example.com
    →
    example.com
    )。
  3. 聚合:
    • 按域名:统计引用次数,列出引用它的 AI 来源及触发它的查询
    • 按内容类型:根据 URL 路径模式推断(文档 →
      /docs/
      、
      /reference/
      ;博客 →
      /blog/
      ;新闻 → 已知新闻域名)
  4. 按总引用次数排名。输出:
Top-cited domains for "web scraping" (42 queries × 6 sources):
| Domain | Citations | AI Sources | Inferred type |
|--------|-----------|------------|--------------|
| docs.apify.com | 38 | ChatGPT, Perplexity, AI Mode | Documentation |
| scraperapi.com/blog | 21 | AI Overviews, Gemini | Long-form blog |
  1. 如果启用深度抓取:对每个域名引用次数最高的 3 个 URL 运行
    apify/website-content-crawler
    。从 markdown 输出中提取:
    • 直接回答查询的第一个标题
    • 前 500 个词中是否存在代码块
    • 词数
    • H2/H3 是否包含查询的确切短语
  2. 总结模式:“AI 引擎在此主题中偏好[长篇文档/简短直接回答型文章]。典型被引用页面:[词数范围],[有/无直接回答 H2],[首屏上方有/无代码示例]。”

Workflow C — GEO Website Audit

工作流 C — GEO 网站审计

Goal: Check whether a specific website's content is structured for AI citation; compare it against what AI engines actually cite for your target prompts.
目标: 检查特定网站的内容是否已针对 AI 引用进行结构化处理;并将其与 AI 引擎针对目标提示词实际引用的内容进行比较。

Inputs to collect

需要收集的输入

#InputNotes
1Your website URLe.g.
https://apify.com
2Target promptsUse Workflow A output, or supply 5–10 directly
3AI sourcesDefault: all six
#输入备注
1你的网站 URL例如
https://apify.com
2目标提示词使用工作流 A 的输出,或直接提供 5–10 个
3AI 来源默认:全部六个

Workflow

工作流

  1. Run
    apify/google-search-scraper
    for each target prompt. For each (prompt × source) record whether your registrable domain appears in
    sources[]
    .
  2. For prompts where your domain is not cited: identify the top-cited competitor URL for that prompt.
  3. Run
    apify/website-content-crawler
    on:
    • Your most relevant page(s) for each un-cited prompt
    • The top-cited competitor page for each un-cited prompt
  4. For each un-cited prompt, produce a gap card:
Prompt: "how to scrape Google search results"
Your page: apify.com/blog/scraping-google  →  NOT cited on ChatGPT, Perplexity, AI Mode
Top-cited: docs.brightdata.com/scraping/google (cited 5/6 sources)

Structural gaps:
  ✗ Your page: answer buried after 900 words, no direct-answer H2
  ✓ Competitor: H2 "How to scrape Google in 3 steps" at word 120 + code block at word 180

Recommended actions (priority order):
  1. Add H2 that mirrors the query phrase within first 300 words
  2. Move code example above the fold
  3. Add a "Quick answer" summary box at the top
  1. Deliver: per-prompt gap cards + a consolidated action table ranked by expected impact.

  1. 针对每个目标提示词运行
    apify/google-search-scraper
    。对于每个(提示词 × 来源)组合,记录你的可注册域名是否出现在
    sources[]
    中。
  2. 对于未引用你的域名的提示词,找出该提示词下被引用次数最高的竞争对手 URL。
  3. 对以下页面运行
    apify/website-content-crawler
    :
    • 每个未引用提示词对应的最相关页面
    • 每个未引用提示词对应的被引用次数最高的竞争对手页面
  4. 为每个未引用提示词生成差距卡片:
Prompt: "how to scrape Google search results"
Your page: apify.com/blog/scraping-google  →  NOT cited on ChatGPT, Perplexity, AI Mode
Top-cited: docs.brightdata.com/scraping/google (cited 5/6 sources)

Structural gaps:
  ✗ Your page: answer buried after 900 words, no direct-answer H2
  ✓ Competitor: H2 "How to scrape Google in 3 steps" at word 120 + code block at word 180

Recommended actions (priority order):
  1. Add H2 that mirrors the query phrase within first 300 words
  2. Move code example above the fold
  3. Add a "Quick answer" summary box at the top
  1. 交付:每个提示词的差距卡片,以及一份按预期影响排名的综合操作表。

Workflow D — Recurring Visibility Tracker

工作流 D — 定期可见度跟踪器

Goal: Snapshot brand citations and mentions across all six AI surfaces on a recurring schedule and track changes over time.
目标: 按计划对所有六个 AI 入口中的品牌引用和提及生成快照,并跟踪其随时间的变化。

Prerequisites

前置条件

(No need to check upfront)
  • APIFY_TOKEN
    saved in a
    .env
    file next to
    config.json
    (the runner auto-loads it).
  • Python 3.9+ on PATH.
    pip3 install requests
    (only third-party dependency);
    pip3 install tldextract
    recommended for accurate registrable-domain matching on multi-part TLDs.
  • For automated daily runs: macOS / Linux with launchd or cron available (the installer handles both). Windows users get printed
    schtasks
    instructions.
(无需预先检查)
  • APIFY_TOKEN
    已保存在
    config.json
    旁边的
    .env
    文件中(运行器会自动加载)。
  • PATH 中有 Python 3.9+。
    pip3 install requests
    (唯一的第三方依赖);建议使用
    pip3 install tldextract
    ,以便在多部分 TLD 上准确匹配可注册域名。
  • 对于自动每日运行:macOS / Linux 上可使用 launchd 或 cron(安装器会处理两者)。Windows 用户会获得打印出的
    schtasks
    说明。

Steps

步骤

Copy this checklist and track progress:
Task Progress:
- [ ] Step 1: Load or collect the seven required inputs
- [ ] Step 2: Confirm AI sources and cadence
- [ ] Step 3: Write config.json + .env, then install the OS schedule
- [ ] Step 4: Run a snapshot now so the user sees the first report
- [ ] Step 5: Deliver the history report (diff vs. all prior runs)
复制此清单并跟踪进度:
Task Progress:
- [ ] Step 1: Load or collect the seven required inputs
- [ ] Step 2: Confirm AI sources and cadence
- [ ] Step 3: Write config.json + .env, then install the OS schedule
- [ ] Step 4: Run a snapshot now so the user sees the first report
- [ ] Step 5: Deliver the history report (diff vs. all prior runs)

Step 1: Load or Collect the Seven Required Inputs

步骤 1:加载或收集七项必需输入

If
config.json
exists in the user's working directory, load it and skip to Step 4 unless the user asks to reconfigure. On first run, ask all seven anchors before any Actor call:
#InputWhy it matters
1Brand URLPrimary domain. Drives registrable-domain citation matching (
blog.apify.com
->
apify.com
).
2Brand name(s)Surface forms for text-mention matching (e.g.,
Apify
,
apify.com
,
@apify
). URL-only matching misses mentions without links.
3Competitor brandsAsk explicitly: "Which competitors do you want tracked alongside your brand?" Accept
name + domain
pairs. Zero is allowed; the question must still be asked on first run.
4Prompts to monitorOne or more search queries. Each runs through every enabled AI source. If you don't know which prompts to use yet, run Workflow A first — it discovers competitor-visible prompts you can paste here.
5Cadence
daily
/
weekly
/
monthly
. Drives the schedule entry that
install_cron.sh
writes.
6Which AI sourcesPresent the six (AI Overviews, AI Mode, ChatGPT, Perplexity, Copilot, Gemini), all enabled by default. Each adds per-result cost -- current pricing on the Actor page (https://apify.com/apify/google-search-scraper).
7Apify Dataset nameThe named dataset to append to. If absent, created on first run; the name is recorded in
config.json
.
After those seven, ask optional follow-ups:
countryCode
,
languageCode
,
location
(UULE), preferred run hour (default
09:00
local).
Then one verbosity question -- save as
config.json:include_full_answers
:
  • on_demand
    (default): report shows short quoted snippets around each surface-form match. Full LLM answers live in the named KV store; user can ask later.
  • always
    : report embeds the full LLM answer verbatim whenever any entity is mentioned. Useful for one prompt; gets unwieldy at 5+ prompts.
如果
config.json
存在于用户的工作目录中,则加载它并跳转到步骤 4,除非用户要求重新配置。首次运行时,必须在调用任何 Actor 之前询问全部七项必填内容:
#输入重要性
1品牌 URL主域名。用于可注册域名引用匹配(
blog.apify.com
->
apify.com
)。
2品牌名称用于文本提及匹配的形式(例如
Apify
、
apify.com
、
@apify
)。仅匹配 URL 会遗漏没有链接的提及。
3竞争对手品牌明确询问:“您希望与您的品牌一起监控哪些竞争对手?”接受“名称 + 域名”组合。可以没有竞争对手;首次运行时仍必须询问该问题。
4待监控提示词一个或多个搜索查询。每个查询都会在每个启用的 AI 来源中运行。如果尚不知道应使用哪些提示词,请先运行工作流 A——它会发现竞争对手可见的提示词,供你粘贴到此处。
5频率
daily
/
weekly
/
monthly
。用于决定
install_cron.sh
写入的调度条目。
6哪些 AI 来源列出这六个来源(AI Overviews、AI Mode、ChatGPT、Perplexity、Copilot、Gemini),默认全部启用。每个来源都会增加单次结果成本——当前价格见 Actor 页面(https://apify.com/apify/google-search-scraper)。
7Apify Dataset 名称要追加数据的命名 Dataset。如果未提供,则在首次运行时创建;名称会记录在
config.json
中。
完成上述七项后,再询问可选的后续问题:
countryCode
、
languageCode
、
location
(UULE)、首选运行时间(默认当地
09:00
)。
然后询问一个详细程度问题——保存为
config.json:include_full_answers
:
  • on_demand
    (默认):报告显示每个文本形式匹配项周围的简短引用片段。完整 LLM 答案保存在命名 KV store 中;用户可稍后索取。
  • always
    :每当提及任何实体时,报告都会逐字嵌入完整 LLM 答案。适合只使用一个提示词;提示词达到 5 个以上后会变得过于冗长。

Step 2: Confirm AI Sources and Cadence

步骤 2:确认 AI 来源和频率

Echo back the user's seven choices in a single paragraph for confirmation. If the user toggles sources, update the in-memory config before writing.
用一段话回显用户的七项选择以供确认。如果用户切换了来源,请在写入前更新内存中的配置。

Step 3: Write
config.json
+
.env
, Then Install the OS Schedule

步骤 3:编写 config.json + .env,然后安装操作系统调度

Create the working directory layout next to where the user wants reports to land:
working-dir/
  config.json     # copied from the skill's config.example.json, edited with collected values
  .env            # APIFY_TOKEN=apify_api_xxx   (chmod 600)
bash
cp ${CLAUDE_PLUGIN_ROOT}/reference/scripts/config.example.json ./config.json
在用户希望报告落地的位置旁创建工作目录结构:
working-dir/
  config.json     # copied from the skill's config.example.json, edited with collected values
  .env            # APIFY_TOKEN=apify_api_xxx   (chmod 600)
bash
cp ${CLAUDE_PLUGIN_ROOT}/reference/scripts/config.example.json ./config.json

then edit with the collected values, save

then edit with the collected values, save

echo 'APIFY_TOKEN=your_token_here' > ./.env chmod 600 ./.env

Then install the OS schedule:

```bash
bash ${CLAUDE_PLUGIN_ROOT}/reference/scripts/install_cron.sh --cadence daily --hour 9
Cron expression mapping:
CadenceCron expressionWhen
daily
0 H * * *
every day at H:00 local
weekly
0 H * * 1
every Monday at H:00
monthly
0 H 1 * *
the 1st of every month at H:00
echo 'APIFY_TOKEN=your_token_here' > ./.env chmod 600 ./.env

然后安装操作系统调度:

```bash
bash ${CLAUDE_PLUGIN_ROOT}/reference/scripts/install_cron.sh --cadence daily --hour 9
Cron 表达式映射:
频率Cron 表达式时间
daily
0 H * * *
每天的 H:00(本地时间)
weekly
0 H * * 1
每周一的 H:00
monthly
0 H 1 * *
每月 1 日的 H:00

Step 4: Run a Snapshot Now

步骤 4:立即运行快照

macOS:
bash
launchctl kickstart "gui/$(id -u)/com.apify.ai-visibility-tracker"
tail -f ~/Library/Logs/ai-visibility-tracker.log
Linux / generic:
bash
python3 ${CLAUDE_PLUGIN_ROOT}/reference/scripts/run_snapshot.py --config ./config.json
Both paths:
  1. Call
    apify/google-search-scraper
    with the configured prompts + AI-source toggles.
  2. Parse each (prompt x source) cell for citations and brand/competitor mentions.
  3. Append rows to the named Apify Dataset (schema in
    reference/output-schema.md
    ).
  4. Write the raw item to the named KV store (long-term archive).
  5. Compute the history vs. all prior runs.
  6. Write
    reports/snapshot-<ISO-date>.md
    next to
    config.json
    .
macOS:
bash
launchctl kickstart "gui/$(id -u)/com.apify.ai-visibility-tracker"
tail -f ~/Library/Logs/ai-visibility-tracker.log
Linux / 通用:
bash
python3 ${CLAUDE_PLUGIN_ROOT}/reference/scripts/run_snapshot.py --config ./config.json
两条路径都会:
  1. 使用配置的提示词和 AI 来源开关调用
    apify/google-search-scraper
    。
  2. 解析每个(提示词 × 来源)单元格中的引用和品牌/竞争对手提及。
  3. 将行追加到指定的 Apify Dataset(schema 位于
    reference/output-schema.md
    )。
  4. 将原始条目写入指定的 KV store(长期归档)。
  5. 计算相对于所有历史运行的变化。
  6. 在
    config.json
    旁写入
    reports/snapshot-<ISO-date>.md
    。

Step 5: Deliver the History Report

步骤 5:交付历史报告

Open
reports/snapshot-<ISO-date>.md
and surface the top findings in chat. Lead with:
  • First-ever citations / mentions today -- entity x source combinations crossing the threshold for the first time.
  • Drops -- entity was cited in the latest prior run but isn't today.
  • For every cited entity, the exact matched URL(s).
打开
reports/snapshot-<ISO-date>.md
,并在聊天中呈现最重要的发现。首先说明:
  • 今天首次出现的引用/提及——首次越过阈值的实体 × 来源组合。
  • 下降——实体在上一次运行中有引用,但今天没有。
  • 对每个被引用的实体,给出精确匹配的 URL。

Output format

输出格式

Snapshot summaries are entity-major: one Markdown table per tracked entity (brand, then competitors), one row per AI source, columns
Source | Cited | Mentioned | SoV% | Matched URLs | History
.

快照摘要以实体为主体:每个被跟踪实体(先是品牌,然后是竞争对手)对应一张 Markdown 表格,每个 AI 来源占一行,列为
Source | Cited | Mentioned | SoV% | Matched URLs | History
。

Actors

Actor

ActorUsed inKey input fields
apify/google-search-scraper
A, B, C, D
queries[]
,
aiOverview
,
chatGptSearch
,
perplexitySearch
,
googleAiMode
,
bingCopilotSearch
,
googleGeminiSearch
apify/website-content-crawler
B (optional), C
startUrls[]
,
maxCrawlPages
,
outputMarkdown: true
Pricing changes; check the pricing tab before quoting numbers. Disable unused AI sources to reduce cost.
Telemetry. Workflow D runs through
reference/scripts/run_snapshot.py
, which already sets
User-Agent: apify-awesome-skills/ai-search-visibility-tracker-...
on every Apify API call. When calling these Actors ad-hoc in Workflows A-C, pass the matching flags so usage is attributed:
--user-agent apify-awesome-skills/apify-ai-search-visibility-tracker
and
--json
(use
--format json
for
apify datasets get-items
), and append
2>/dev/null
. Example:
bash
apify actors call apify/google-search-scraper \
  --user-agent apify-awesome-skills/apify-ai-search-visibility-tracker \
  --json 2>/dev/null
Actor用途关键输入字段
apify/google-search-scraper
A、B、C、D
queries[]
、
aiOverview
、
chatGptSearch
、
perplexitySearch
、
googleAiMode
、
bingCopilotSearch
、
googleGeminiSearch
apify/website-content-crawler
B(可选)、C
startUrls[]
、
maxCrawlPages
、
outputMarkdown: true
价格可能会变化;引用具体数字前,请查看 定价选项卡。禁用不需要的 AI 来源以降低成本。
遥测。 工作流 D 通过
reference/scripts/run_snapshot.py
运行,该脚本已在每次 Apify API 调用时设置
User-Agent: apify-awesome-skills/ai-search-visibility-tracker-...
。在 A-C 工作流中临时调用这些 Actor 时,请传入匹配的标志,以便正确归因使用量:传入
--user-agent apify-awesome-skills/apify-ai-search-visibility-tracker
和
--json
(对
apify datasets get-items
使用
--format json
),并追加
2>/dev/null
。示例:
bash
apify actors call apify/google-search-scraper \
  --user-agent apify-awesome-skills/apify-ai-search-visibility-tracker \
  --json 2>/dev/null

Quality Rules

质量规则

  • Non-interactive. No stdin reads in
    run_snapshot.py
    -- launchd / cron has no stdin.
  • Word-boundary brand matching (
    \bbrand\b
    , case-insensitive). See
    reference/citation-matching.md
    .
  • Registrable-domain citation matching (
    blog.apify.com
    counts as
    apify.com
    ). See
    reference/citation-matching.md
    .
  • Never skip a row. If an AI source returns nothing, write a row with
    cited: false, mentioned: false, answer_text: "[no answer returned]"
    .
  • Every row carries the Apify run ID so any finding can be reverified.
  • 非交互式。
    run_snapshot.py
    不读取 stdin——launchd / cron 没有 stdin。
  • 词边界品牌匹配(
    \bbrand\b
    ,不区分大小写)。参阅
    reference/citation-matching.md
    。
  • 可注册域名引用匹配(
    blog.apify.com
    计为
    apify.com
    )。参阅
    reference/citation-matching.md
    。
  • 绝不跳过任何行。 如果某个 AI 来源没有返回内容,仍要写入一行,值为
    cited: false, mentioned: false, answer_text: "[no answer returned]"
    。
  • 每一行都携带 Apify run ID,以便重新验证任何发现。

Error Handling

错误处理

APIFY_TOKEN not found
-- Tell the user to put it in
.env
next to
config.json
(
echo 'APIFY_TOKEN=...' > .env && chmod 600 .env
). Token at https://console.apify.com/account/integrations.
config.json not found
-- Run Step 3 first to create it from the template.
Dataset name not set
-- Ask the user for a name; the runner will create the dataset on first append.
Actor run FAILED
-- Print the console link from the runner output and ask the user to inspect it.
AI source returned no answer
-- The row is still written with
[no answer returned]
. Not an error.
website-content-crawler returns no markdown
-- Page may be JS-heavy; try with
useBrowserCrawler: true
.
Schedule not firing
-- See
reference/scheduling.md
troubleshooting section.
No previous run to diff against
-- First run only. The report renders the snapshot without a history section.
APIFY_TOKEN not found
—— 告诉用户将其放在
config.json
旁边的
.env
中(
echo 'APIFY_TOKEN=...' > .env && chmod 600 .env
)。Token 位于 https://console.apify.com/account/integrations。
config.json not found
—— 运行步骤 3,从模板创建该文件。
Dataset name not set
—— 询问用户名称;运行器会在首次追加时创建 Dataset。
Actor run FAILED
—— 打印运行器输出中的控制台链接,并请用户检查。
AI source returned no answer
—— 仍应写入该行,并使用
[no answer returned]
。这不是错误。
website-content-crawler returns no markdown
—— 页面可能大量使用 JS;尝试使用
useBrowserCrawler: true
。
Schedule not firing
—— 参阅
reference/scheduling.md
的故障排除部分。
No previous run to diff against
—— 仅首次运行时会发生。报告在没有历史部分的情况下呈现快照。