2026-10-14 · 原文发布日
每周邮件追踪自家域名被 AI 引用情况
每周一上午读取 TriRank 缓存的域名 AI 引用测量数据(只读不触发新检测),与上次结果比对:有引用、零引用、数据缺失或过期分别作为不同状态处理,只在有变化或首次基线时用 SMTP 发纯文本邮件提醒,平稳周不打扰。使用前需先在 TriRank 网站跑免费审计建立基线。
原文要点
原模板只在每周一09:00按n8n工作流时区读取TriRank已缓存的域名AI引用测量,明确是只读请求、不触发新AI探测;HTTP错误与限流单列成不可用数据。它用n8n workflow static data保存上次读数做比对,把实测有引用、实测零引用、部分覆盖、无新鲜测量分成不同状态;读数不变不发邮件,首次运行可选发基线。匿名每IP每天60次读取,可选x-api-key提高额度;static data只在激活的计划运行中持久,手动测试不持久。
这次做成什么
照着搭一条“安静型”监测:每周固定时间只读取自家域名在TriRank的缓存引用数,和上周比,只在首次基线或状态变化时发一封纯文本邮件;平稳周零打扰。练习用本站虚构域名与合成读数,不碰真实生产邮箱。
准备什么
- 一个可访问外网的n8n实例,并能使用计划触发与SMTP发送节点
- 一个隔离测试邮箱的SMTP凭据,不要用生产告警邮箱硬测
- 已在TriRank对练习域名完成免费审计并本人通过人机验证以建立基线
- 可选:TriRank API key,仅以Header Auth凭据保存,不写进工作流JSON
具体怎么做
先建基线再谈比对
在TriRank审计页对练习域名跑一次免费审计,本人完成人机验证;确认该域名已有可读缓存测量后再进n8n。没基线时工作流只能报无新鲜测量,不是实测零引用。
搭只读链路
计划触发设为周一09:00并核对工作流时区;配置节点放domain与notifyOnFirstRun;HTTP请求用GET访问TriRank signals接口,方法保持只读,如需提额把x-api-key放进Header Auth凭据;把HTTP错误、限流与空数据都归入不可用,不要当成零引用。
用static data做状态机
在Code节点读取上次快照,计算当前状态:实测有引用、实测零引用、部分覆盖、无新鲜测量或不可用;与上次状态和上次数值比较,首次且notifyOnFirstRun为真才生成基线邮件,状态或数值变化才生成变更邮件,完全一致则把message置空。
有消息才发并激活
用IF判断message非空才进入SMTP Send Email,正文用纯文本;填From与To为隔离邮箱。先手动跑一次看日志,再激活;记住手动测试不写static data,激活后的计划运行才会持久比对基线。
可直接复制的材料
状态判定与邮件模板配置
本站独立示例配置;domain、邮箱、状态文案需替换,接口字段名要以实际signals响应为准。
{
"domain": "example-practice.cn",
"notifyOnFirstRun": true,
"timezoneNote": "使用n8n工作流时区,周一09:00触发",
"states": ["MEASURED_CITATIONS", "MEASURED_ZERO", "PARTIAL_COVERAGE", "NO_FRESH_MEASUREMENT", "UNAVAILABLE"],
"emailSubject": "[AI引用周报] example-practice.cn 状态变化",
"emailBody": "域名:example-practice.cn\n本次状态:MEASURED_CITATIONS\n引用计数:3\n上次状态:MEASURED_ZERO\n结论:出现新增AI引用,请检查品牌词与来源页。"
}n8n Code比对逻辑
本站编写的示意逻辑;res.ok、citations、fresh、partial是占位字段,必须按真实signals响应改名后再用。
const staticData = this.getWorkflowStaticData('global');
const cfg = $('Configure domain').first().json;
const res = $input.first().json;
let status = 'UNAVAILABLE';
let count = null;
if (res && res.ok === true && typeof res.citations === 'number' && res.fresh === true) {
count = res.citations;
status = count > 0 ? 'MEASURED_CITATIONS' : 'MEASURED_ZERO';
} else if (res && res.ok === true && res.partial === true) {
status = 'PARTIAL_COVERAGE';
} else if (res && res.ok === true) {
status = 'NO_FRESH_MEASUREMENT';
}
const prev = staticData.snapshot || null;
const first = !prev;
const changed = !prev || prev.status !== status || prev.count !== count;
let message = '';
if ((first && cfg.notifyOnFirstRun) || (!first && changed)) {
message = `域名:${cfg.domain}\n本次状态:${status}\n引用计数:${count}\n上次状态:${prev ? prev.status : '无'}\n说明:仅读取缓存测量,未触发新检测。`;
}
staticData.snapshot = { status, count, at: new Date().toISOString() };
return [{ json: { domain: cfg.domain, status, count, changed, message } }];合成signals响应样例
本站虚构练习数据,只用于跑通状态机,不代表TriRank真实返回结构。
{
"ok": true,
"domain": "example-practice.cn",
"citations": 3,
"fresh": true,
"partial": false,
"measuredAt": "2026-10-12T09:00:00Z"
}输入与输出示例
本站虚构演示,未调用真实接口,数字与字段仅对应上文合成输入。
输入
练习域名example-practice.cn,上周快照为MEASURED_ZERO且count为0,本周合成signals返回ok为true、citations为3、fresh为true、partial为false。对应输出
判定状态MEASURED_CITATIONS,changed为true,生成邮件:主题[AI引用周报] example-practice.cn 状态变化;正文含本次状态MEASURED_CITATIONS、引用计数3、上次状态MEASURED_ZERO,并注明仅读取缓存测量未触发新检测。做完检查这些
- HTTP请求方法为GET且只读,失败与限流进入UNAVAILABLE而不是被当成零引用
- 四类测量状态与不可用能分别落到不同分支,邮件正文能看出状态名与计数
- 读数与状态完全不变时message为空,SMTP节点被IF拦住不发信
- 激活后的计划运行能把快照写入static data,下周能基于该快照判断变化
容易卡住的地方
- 手动测试执行不持久static data,会反复像首次运行,需激活后等计划周期验证
- 把无新鲜测量误当实测零引用会制造假告警,两类必须分开命名
- 时区没核对会让周一09:00落到别的日期,先看工作流时区再排错
- 匿名读取约每IP每天60次,频繁手动重跑容易触发限流并显示不可用
- 旧审计会过期且本流程不刷新,长期报无新鲜测量时应回TriRank重跑审计
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Monitor AI citation changes for your domain with TriRank and SMTP email
- 原作者
- TriRank
- 原始发布日期
- 2026-10-14T08:10:09.673Z
- 来源
- https://n8n.io/workflows/20942