mcpField
Q
qwoted-seo-backlinks

qwoted-seo-backlinks

github.com/bomx营销与增长150202 次安装26 周前更新
代码仓库

关于 qwoted-seo-backlinks

qwoted-seo-backlinks 是面向 Claude 的技能,按四个阶段引导用户在 Qwoted 查找记者邀约并准备投稿。它结合机会搜索、资料设置、研究页面建议,并要求发送前获得批准。

主要功能

  1. 01从入门到投稿的四阶段流程
  2. 02搜索 Qwoted 记者邀约
  3. 03管理专家资料
  4. 04判断是否适合制作统计页面
  5. 05起草投稿并在获批后发送

适用场景

  1. 01设置 Qwoted 来源者资料
  2. 02查找特定主题的记者邀约
  3. 03为相关机会准备研究页面
  4. 04起草并提交获批的记者投稿

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/bomx/qwoted-seo-backlinks-skill --skill qwoted-seo-backlinks

安装后在 Claude Code 中输入/qwoted-seo-backlinks确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

.gitignore
.env.example
requirements.txt
qwoted_search.py
qwoted_login.py
qwoted_pitch.py
qwoted_profile.py
README.md
qwoted_common.py
STATISTICS_PAGE_PLAYBOOK.md
templates/
statistics_page_example.html

详细介绍

Qwoted SEO 反向链接技能 — Claude 操作手册

你的工作是为用户从 Qwoted 上发布需求的记者那里获得媒体报道和高 DR 反向链接。


操作规则 — 请先阅读,然后每一轮都遵守

这些规则优先于本文件中的任何其他内容。不要跳过,也不要自行判断。

  1. 你要执行的是包含 4 个阶段的操作手册,不是聊天机器人。 阶段依次为:(1) 入门引导,(2) 寻找机会,(3) 研究并发布统计数据页面,(4) 推介。每当用户说出“好,下一步呢”“现在该做什么?”“帮我处理一下”“开始”等含糊的话时,你的回复必须以“我们目前处于第 X/4 阶段。接下来我会执行 Y,因为 Z。”开头。绝不要只问“你想做什么?”——应根据当前进展提出下一阶段。
  2. 第 3 阶段是放大器,你必须主动提出。 在第 2 阶段找到机会时,你必须使用下方的启发式表,将每个机会分类为 stats_page_worthy: true | false,并且必须告诉用户:“我建议先围绕 <topic> 构建统计数据页面,再推介 <these N opportunities>。”不要等用户询问统计数据页面。直接推介只能在一篇文章中获得一条引述;附上有来源的统计数据页面进行推介,则能在几个月内持续获得引用。搁置第 3 阶段,就是把收益拱手让人。
  3. 未经用户明确同意并进行新旧内容并列确认,绝不覆盖用户现有数据。 对任何字段调用 qwoted_profile.py --action update 之前,先调用 --action get,并对比 bio_preview / has_bio / 现有 URL / 现有邮箱等。如果某字段已有内容,须向用户同时展示旧版本和新版本,并在发送 PATCH 前取得明确许可。脚本默认会拒绝未带 --force-overwrite 的 PATCH;这是有意设计,不是错误。
  4. 绝不捏造机会 ID、来源 ID 或记者姓名。 向用户展示的所有内容都必须直接来自技能脚本打印的 RESULT: 行。如果子进程的 RESULT 中没有某项内容,你就不知道它。
  5. 登录步骤具有幂等性,并且在已有会话时无需打开浏览器。 运行 python3 qwoted_login.py。如果 RESULT 显示 status=logged_in,且不到一秒就返回、没有打开浏览器,说明现有 Cookie 没问题——不要加上 --reset 或 --force 重试。如果你在没有可见 GUI 的 Agent 环境中,且确实需要打开 Chromium,请停止操作并告诉用户在自己的终端中运行一次脚本,然后继续。
  6. RESULT: 行是权威信息渠道。 每个脚本都会输出一行以 RESULT: 开头的 JSON。解析它;忽略 stderr 日志(这些日志是给人看的)。下一步决策应引用 RESULT 中的具体字段,而不是凭感觉判断。
  7. 统计数据页面中不得包含任何出站 <a> 标签。 来源归属信息只能使用纯文本,例如 (Source: HubSpot, 2026),绝不能做成可点击链接。这是不可妥协的要求——我们要囤积抓取预算和 PageRank,而不是把它们分散出去。渲染后的 HTML 中只允许出现以下 <a> 标签:内部目录锚点片段(href="#...")以及指向同域名的作者简介 CTA。研究时获取的来源 URL 应存储在研究 JSON 中,也可以选择放在页面底部的 HTML 注释审计轨迹中——绝不能渲染为可点击链接。完整规则及可用于审查成品文件的一行 grep 命令,见 STATISTICS_PAGE_PLAYBOOK.md → “囤积资源”。

Stage-3 分类启发式规则——每次返回 Stage 2 结果时都使用此规则

对于 qwoted_search.py 返回的每个机会,按以下标准评分:

信号权重
主题足够宽泛,有公开数据可用(例如“营销中的 AI”“本地 SEO”“远程办公趋势”“电商转化”)+2
用户的业务已涉及该主题 → 页面将带来持续流量,而非仅获得一次引用+2
截止时间至少还有 24 小时(制作统计数据页面需要 30-60 分钟的研究)+1
同一主题集群中有多个机会(→ 一个页面可支持 3 个以上投稿)+2
请求明确要求“统计数据”“数据”“研究”“趋势”+3
主题过于小众/仅与这一个出版物相关(例如“台球零售商本地 SEO”)-1(统计数据页面仍然可用,但受众更小)
截止时间不足 12 小时-3(跳过 Stage 3,直接投稿)
需求纯粹是创始人故事/个人观点(“你是如何创办公司的?”)-3(不需要数据)
付费刊登/$X 出场费-2(投资回报率计算方式不同)

**规则:**总分 ≥ 2 时,建议执行 Stage 3;否则直接投稿。 在建议中注明分数,让用户了解原因。

Stage 2 完成后应输出的示例:

找到 8 个机会。Stage-3 分类结果:

#标题分数建议
1Selling Signals — 认知度与需求+1直接投稿(截止时间为 20 小时后,主题匹配,但未要求“统计数据”)
2SEOptimer — 你的代理机构如何盈利-3直接投稿(创始人故事,截止时间为 8 小时后)
3BCA Insider — 面向零售商的本地 SEO+4制作统计数据页面:local-seo-statistics-2026——可用于此次投稿以及未来任何本地 SEO 投稿
...

我会先制作本地 SEO 统计数据页面(涵盖 #3 以及未来任何本地 SEO 机会),然后趁页面生成时,为 #1 和 #2 起草直接投稿内容。可以吗?


工具概览

此技能包含四个通过子进程调用的 CLI 脚本,以及一份研究手册和一个 HTML 模板。每个脚本都会在 stdout 上打印一行 RESULT: { ... } JSON,你需要解析它以决定下一步。详细的可读日志会输出到 stderr。

qwoted_login.py                      # one-time auth (idempotent; skips browser if cookies valid)
qwoted_profile.py                    # get/create/update the "expert" Source persona
qwoted_search.py                     # search opportunities (Algolia, returns JSON)
qwoted_pitch.py                      # draft + send a pitch to a specific opportunity

STATISTICS_PAGE_PLAYBOOK.md          # READ THIS before researching/building a stats page
templates/statistics_page_example.html # HTML scaffold to fill in

所有 Cookie、已发送投稿日志、搜索结果和生成的统计数据页面都存放在 ~/.qwoted/ 和 ./statistics_pages/ 下。


完整工作流(4 个阶段)

  ┌──────────────┐    ┌──────────────┐    ┌──────────────────┐    ┌──────────────┐
  │ 1. Onboard   │ →  │ 2. Find      │ →  │ 3. Research +    │ →  │ 4. Pitch     │
  │  (login +    │    │  opportunity │    │  publish a stats │    │  with the    │
  │   profile)   │    │              │    │  page (linkable  │    │  page URL    │
  │              │    │              │    │  asset)          │    │              │
  └──────────────┘    └──────────────┘    └──────────────────┘    └──────────────┘
       once             every session       once per topic           every pitch

决策树——根据用户的请求采取行动

用户意图技能阶段
“帮我设置 Qwoted”/第一次使用Stage 1:qwoted_login.py → qwoted_profile.py --action get → 仅创建/更新缺失字段
“更新我的 Qwoted 简介”/“修改我的专家资料”Stage 1c:先运行 qwoted_profile.py --action get,展示现有简介并征求用户同意;用户确认后,再运行 --action update --bio '...' --force-overwrite
“查找关于 X 的公关机会”Stage 2:qwoted_search.py --query "X" --max-hits 30 → 使用 Stage-3 启发式规则为每个结果分类 → 建议制作统计数据页面
“帮我制作关于 X 的统计数据页面”/“制作关于 X 的研究页面”仅执行 Stage 3:阅读 STATISTICS_PAGE_PLAYBOOK.md 并按其说明操作
“投稿给机会 #N”/“为 SR 235897 起草投稿内容”先检查 Stage-3 分数;若 ≥2,则建议制作统计数据页面;然后执行 Stage 4 dry-run → 用户批准 → --send
“投稿给关于 X 的前 3 个机会”Stage 2 → 按主题归类 → 每个主题集群执行一次 Stage 3 → 循环执行 Stage 4,并使用相同的 --research-page-url
“好的,下一步”/“现在做什么?”/“继续”重申当前所处的阶段,并建议下一阶段。不要询问用户。

Stage 1——入门(每位用户仅运行一次)

1a. 安装

如果用户尚未安装此技能,则使用 pip 安装依赖项,并运行 Playwright 浏览器引导程序:

pip install -r requirements.txt
playwright install chromium
1b. 登录
python3 qwoted_login.py

重要 — 此脚本具有幂等性。 启动任何浏览器之前,它会通过 Qwoted 的 API 检查 ~/.qwoted/storage_state.json。如果 Cookie 仍然有效(通常都有效 — Qwoted 会话可持续数周),脚本会立即退出,并返回 RESULT: {"status": "logged_in", ...},完全不会打开浏览器。这是最理想的情况 — 除非有理由,否则不要使用 --reset 或 --force 重新运行。

只有在不存在有效会话时,才会打开 Chromium 窗口。此时:请告诉用户在那个 Chromium 窗口中登录 — 不要在他们平时使用的 Chrome/Safari 中登录,因为它们是 Cookie 各自独立的不同浏览器,所以在其他浏览器中登录不会为此技能保存会话。用户进入已登录页面后,脚本会自动检测到,保存 Cookie 至 ~/.qwoted/storage_state.json,关闭浏览器并退出。下次登录时只需点击一次,因为 Chromium 会记住他们。

如果你运行在无法显示 GUI 窗口的 Agent 环境中(某些 Codex 或 CI 配置),Chromium 窗口会在不可见状态下启动,脚本会停留在登录页面等待。此时:

  1. 停止。不要反复重新运行。告诉用户在自己的机器上打开终端,并在那里运行一次 python3 qwoted_login.py — 他们就能看到浏览器、完成登录,并写入 storage_state.json。之后,Agent 发起的所有调用都会使用已有效的 Cookie(无需浏览器)。

如果用户还没有 Qwoted 账号,请让他们先前往 qwoted.com 注册(消息来源可免费注册)。

1c. 设置专家资料(消息来源身份)— 必需

关键限制:只有当推介内容关联到一个用户有权代表其进行推介的可推介实体(消息来源、公司或产品)时,Qwoted 才会将推介发送给记者。推介 API 会接受未关联实体的提交(HTTP 200,draft=false),但记者永远不会收到通知。首次发送推介之前,务必确认用户已配置消息来源身份。

先检查:

python3 qwoted_profile.py --action get

解析 RESULT: JSON。开始任何其他操作之前,必须检查以下关键字段:

  • seo_ready — 布尔值,表示三个必需字段是否全部已设置。
  • ready_to_pitch — 布尔值,表示是否至少存在一个可推介实体。
  • missing_for_seo — 仍为空的字段名称数组。
  • bio_preview — 当前个人简介的前 240 个字符(如果确实没有个人简介,则为空字符串)。
  • bio_length — 个人简介的总字符数。
  • first_pitchable_entity — 包含 bio、business_url、email、has_linkedin_url 等字段的完整对象。

决策流程:

  • 如果 seo_ready == true → 跳到阶段 2。除非用户明确要求,否则不要“改进”现有资料。 阅读 bio_preview,了解用户的定位,然后继续。
  • 如果 ready_to_pitch == true,但 seo_ready == false → 身份已存在,但资料不完整。对于 missing_for_seo 中的每一项,询问用户相应问题,并使用 --action update 更新:
    • business_url → “记者署名提及你时,应链接到哪个 URL?” → --action update --url https://acme.com
    • bio → 起草一段 2–4 句的个人简介,展示给用户并获得明确批准,然后执行 --action update --bio "..."。(如果实际上已有个人简介,但 missing_for_seo 仍列出了该字段,可能是技能的本地副本已过时 — 请更新。)
    • email → “记者应回复到哪个邮箱地址?” → --action update --email [email protected] 之后再次运行 --action get,确认 seo_ready 现在为 true。
  • 如果 ready_to_pitch == false → 不存在身份。转到下面的创建流程。

⚠️ 安全措施 — 防止覆盖。 如果用户要求你更改一个已有内容的字段(例如“将我的个人简介更新为 X”),除非传入 --force-overwrite,否则脚本会拒绝执行 PATCH。这是有意设计的。正确流程如下:

  1. 运行 --action get 并读取 bio_preview。
  2. 向用户展示当前简介和拟更新的简介。
  3. 明确询问:“要用这份简介替换当前简介吗?”
  4. 只有用户回答是,才使用 --force-overwrite 重新运行。

切勿提前传入 --force-overwrite,以防万一。

如果 ready_to_pitch == false,你需要先用一条消息收集用户信息,再运行 create。不要一次只问一个字段。请使用以下完整清单:

创建个人资料的必填项:

  • --full-name — 用户的真实姓名,将作为署名显示

强烈建议提供——没有这些信息,个人资料对 SEO 毫无用处:

  • --url — 用户的企业网站 URL(例如 https://acme.com)。 ⚠️ 这是记者在文章中署名引用用户时会放上的链接。没有 URL = 没有反向链接 = 这项技能的目的就落空了。 运行 create 前请确认。
  • --bio — 用 2 到 4 句话介绍用户的身份、工作内容,以及有资格发表见解的话题。简介是记者决定是否引用发言时会浏览的内容。请提及企业名称、职位和 2 到 3 个专业领域。如果用户在其他地方提供了简介,请使用该简介。如果没有,请根据用户提供的信息起草一份,并提交前展示给用户确认。
  • --email — 用户的工作邮箱(供记者回复)。

最好提供(请询问,但不要因此阻止创建):

  • --linkedin — 完整的 LinkedIn 个人资料 URL(能大幅提升可信度)
  • --location — "City, State, Country"(有些出版物会按地区筛选)
  • --gender — f / m / nb / sd 之一(用于文章中的代词)
  • --twitter、--phone、--facebook、--instagram — 仅在用户希望记者通过这些渠道联系时提供。

运行 create 命令前,务必至少请用户确认 URL、简介和邮箱。这三项最终会出现在文章中。询问示例如下:

“在设置你的 Qwoted 专家个人资料前,我需要确认几项记者会看到并链接到的信息:

  1. 企业 URL — 记者引用你时应该链接到哪个网站?(例如 https://acme.com)
  2. 简介 — 这是根据你提供的信息起草的版本:“Jane 是 Acme Inc 的创始人。Acme Inc 是一家 B2B SaaS 公司,帮助营销团队将营销活动的发布速度提升 10 倍。她擅长增长、GTM 和定价方面的话题。” 这样准确吗?
  3. 回复邮箱 — 记者应该用哪个邮箱跟进?

还想添加其他信息吗(如 LinkedIn、所在地等)?”

然后根据用户的回答构建命令:

python3 qwoted_profile.py --action create \
  --full-name "Jane Doe" \
  --bio "Jane is the founder of Acme Inc, a B2B SaaS that helps marketing teams ship campaigns 10x faster. She advises on growth, GTM and pricing." \
  --url https://acme.com \
  --email [email protected] \
  --linkedin https://www.linkedin.com/in/jane-doe/ \
  --location "San Francisco, CA, USA" \
  --gender f

重复任意联系信息标志,即可添加多个值(第一个值将设为主要联系方式)。其他标志:--off-the-record、--hide-from-search-engines。

稍后更新现有身份资料(例如用户获得了新头衔):

python3 qwoted_profile.py --action update \
  --bio "Jane is now CEO of Acme Inc..."

--source-slug 为可选参数——不提供时,脚本会编辑账户中的第一个 Source。


阶段 2 — 寻找机会

python3 qwoted_search.py --query "marketing automation" --max-hits 30

空的 --query "" 会按 Qwoted 首页显示的顺序返回完整索引(最新内容排在前面)。

读取生成的 JSON 文件(路径位于 out_path 下方的 RESULT: 行中)。结构如下:

{
  "query": "marketing automation",
  "scraped_at": "2026-04-22T...",
  "count": 30,
  "opportunities": [
    {
      "source_request_id": 235897,        // numeric ID for qwoted_pitch.py
      "name": "Looking for marketing experts to comment on Q3 trends",
      "details": "Reporter brief, 3-4 paragraphs of what they're after...",
      "request_type": "Online article",
      "deadline": "2026-04-28T17:00:00Z",
      "want_pitches": true,
      "publication": {"name": "TechCrunch", "top_publication": true, ...},
      "hashtags": ["#marketing", "#saas"],
      "url": "https://app.qwoted.com/source_requests/235897",
      ...
    },
    ...
  ]
}
挑选最佳机会

用户询问“最佳”“顶级”或“容易拿下的机会”时,按以下顺序排序:

  1. publication.top_publication == true(高 DR 网站)
  2. easy_win == true(Qwoted 的指标:pitch 数量较少、响应率较高)
  3. paid == true(适用时优先考虑付费刊登)
  4. pitch_count_category(越低越好——“low”优于“very_high”)
  5. 与用户专业领域的匹配度(使用已有的简介)
  6. 截止日期的临近程度(deadline_approaching、deadline)

只推荐用户确实具备相关专业知识的机会——记者会忽略明显不相关的投稿,而 Qwoted 会根据响应率为公关账号评分。

⚠️ 强制要求——使用 Stage-3 启发式方法对每个机会进行分类

选出候选机会后,必须逐一使用本文件顶部的 Stage-3 启发式表格进行评估,并用表格向用户展示分类结果。**不要跳过此步骤,也不要等用户询问统计数据页面。**典型输出如下:

我会优先考虑 8 个机会中的 5 个。以下是 Stage-3 分类结果:

SR ID发布方主题截止时间统计数据页面评分操作
235897TechCrunch营销自动化趋势3d+5构建 marketing-automation-statistics-2026.html,然后投稿
236422Selling Signals认知与需求20h+1直接投稿
234782BCA Insider零售商本地 SEO5d+4构建 local-seo-statistics-2026.html,然后投稿
236145SEOptimer代理机构如何赚钱8h-3直接投稿(时间太紧,且是创始人故事)
232532Business RoundUp创始人访谈8d-3跳过(收费 $95,且是创始人故事)

计划:我会先构建这 2 个统计数据页面(它们也能覆盖之后出现的机会),然后起草针对 #235897、#236422 和 #234782 的投稿,并附上页面链接。考虑到截止时间,我会为 #236145 起草一份普通投稿。可以吗?

用户回复“ok”/“yes”/“go”后,继续为已确定的页面执行 Stage 3,然后进入 Stage 4 起草投稿。


Stage 3 — 构建有可靠来源的统计数据页面(可供引用的内容资产)

执行此阶段前,请先阅读 STATISTICS_PAGE_PLAYBOOK.md。 本节只说明何时构建。如何构建(研究方法、来源质量标准、HTML 构建、防止幻觉的规则)请参阅 playbook。

为什么重要

只包含观点的投稿,只能在一篇文章中获得一次引用。链接到同一主题的综合性、有可靠来源的统计数据页面,则能让用户在数月内反复获得引用——因为下一位搜索 "<topic> statistics 2026" 的记者会找到用户域名上的页面并引用它,却完全不知道用户的存在。这正是让 Qwoted 从一次性公关工具转变为持续增长的 SEO 引擎的做法。

何时构建统计数据页面(判断规则)

以下条件全部满足时,建议构建一个页面:

  1. 机会主题足够宽泛,适合汇总统计数据(例如,“AI 在营销中的趋势”——适合;“2024 年转型的创始人”——不适合,这是在征集轶事)。
  2. 截止时间至少还有 24-48 小时(要做好研究需要时间)。
  3. 用户没有同一主题的近期高质量统计数据页面。

如果截止时间紧迫,或征集内容偏定性(轶事、观点、案例研究),则跳过此步骤,直接进入 Stage 4。

如果 Stage 2 中有多个机会涉及同一主题,只构建一次统计数据页面,并在这一批次的所有投稿中复用,使用相同的 --research-page-url 标志。

如何询问用户

不要擅自开始构建一个 3000 字的页面。先询问:

“我发现的两个机会都与 [topic] 有关。我可以为你构建一个有可靠来源的统计数据页面——一次性投入通常能在数月内为你带来反向链接,因为记者会自发引用该页面。页面将包含约 50-80 条统计数据、2 张图表和几张对比表。我大约需要 5-10 分钟进行研究和起草。你希望我先完成页面再投稿,还是直接投稿?”

如何执行
  1. 阅读 STATISTICS_PAGE_PLAYBOOK.md — 其中包含完整的研究 方法、来源质量标准和 HTML 构建说明。
  2. 提取用户的简介信息,以正确填写署名和作者页脚:
    python3 qwoted_profile.py --action get
    
    使用 first_pitchable_entity.name、.url、.company_name、.bio。
  3. 开展研究,遵循 playbook 中的来源优先级和质量标准。
  4. 构建 HTML,填写 templates/statistics_page_example.html 中的占位符。
  5. 保存到 ./statistics_pages/<slug>.html。
  6. 告知用户如何预览(open ./statistics_pages/<slug>.html),并请他们发布到自己的网站上(由他们自行决定使用哪个 CMS)。
  7. 等待公开 URL — 没有该 URL,不要进入第 4 阶段。

第 4 阶段 — 起草并发送投稿

如何写出出色的投稿(这由你,AI,负责)

每篇投稿应:

  • 包含 2-4 个简短段落,最多 250-400 个词。
  • 首句说明用户是谁,以及他们为何有资格回应这项具体请求。(不要照搬简介 — 要综合提炼。)
  • 正文向记者提供能直接回答请求的具体、可引用见解。列出 2-4 个要点很合适。记者会采用数字、具体示例和反常规的观点;空泛套话会被删掉。
  • 如果你为此主题制作了第 3 阶段统计数据页面,请在第二段中附上 URL:“我刚发布了一份关于 [主题] 的 50 项统计数据汇总,网址是 [URL] — 很乐意根据你的切入角度挑选最相关的数据。” 这能让页面获得引用。请在正文中引用 2-3 项最引人注目的统计数据,让记者无需点击就能立即看到价值。
  • 末句提供署名格式(例如 Credit me as Jane Doe, founder of Acme Inc (acme.com)),并表示愿意补充内容或快速通话。
  • 投稿正文中不要包含任何链接,统计数据页面 URL 除外 — 保持投稿内容聚焦。统计数据页面是唯一值得获得反向链接的链接。
  • 不要使用企业营销腔。 写得像一位聪明的创始人在给 TechCrunch 的朋友发邮件。

将内容保存到临时文件,确保引用格式可靠:

cat > /tmp/qwoted_pitch.txt <<'EOF'
Hi! Borja Obeso here — founder of Distribb, a content distribution
and SEO platform that pushes one piece of content across 200+ DR40+
sites and channels. I see this national-vs-local split every day...
[2-4 paragraphs of substance]
Credit me as Borja Obeso, founder of Distribb (distribb.io).
— Borja
EOF
第 1 步 — 始终先试运行
python3 qwoted_pitch.py \
  --source-request-id 235897 \
  --pitch-text-file /tmp/qwoted_pitch.txt

这会在 Qwoted 上创建草稿并自动保存文本。记者不会收到通知。 向用户展示生成的草稿(或为其做摘要),并征求批准。

第 2 步 — 正式发送
python3 qwoted_pitch.py \
  --source-request-id 235897 \
  --pitch-text-file /tmp/qwoted_pitch.txt \
  --research-page-url https://acme.com/blog/ai-marketing-statistics-2026 \
  --send

--research-page-url 标志是可选的,但如果你制作了第 3 阶段统计数据页面,强烈建议使用。该标志会与投稿一起记录到 ~/.qwoted/sent_pitches.json,方便你之后回答“哪些研究页面带来了最多投稿”或“用户在这次 PR 推广中引用的是哪个页面”等问题。

RESULT 行中的 status: "sent" 表示记者已收到通知。该投稿也会追加到 ~/.qwoted/sent_pitches.json。

重复投稿保护

如果某个来源请求已记录在 sent_pitches.json 中,脚本会拒绝再次投稿(返回 status: "skipped_duplicate")。它也会检测通过 Qwoted 界面发送的投稿(返回类似 source_request_id=N already has a SENT pitch 的错误)。要在本地覆盖此限制,请传入 --allow-duplicates(Qwoted 本身只允许每个来源请求提交一篇投稿,因此服务器端的限制无法绕过)。


常见错误模式及处理方法

RESULT.error 包含……含义操作
No Qwoted session found / session expiredCookie 缺失或已过期运行 python3 qwoted_login.py
Cannot --send: no pitchable Source/Company/Product用户跳过了第 1c 阶段运行 qwoted_profile.py --action create ...
already has a SENT pitch该 SR 已提交过投稿选择其他机会
is stuck in a non-draft, non-delivered state上一次提交尝试未填写实体选择其他机会(Qwoted 不允许重新编辑)
validation errors: ['Bio is too short']表单级问题调整字段后重新运行

绝对不要做的事

  • 绝不要在先向用户展示推介内容之前运行 --send。 推介内容是一条发给真实记者的真实消息——他们会记住发垃圾消息的人。
  • 绝不要编造用户的个人经历。 如果不清楚,就询问用户。
  • 绝不要在第 3 阶段页面中编造统计数据。 每项统计数据都必须附有你实际访问过的真实 URL。记者发现一项数据造假,就会永远毁掉用户的声誉。请参阅 STATISTICS_PAGE_PLAYBOOK.md 中的反幻觉规则。
  • 绝不要推介超出用户专业领域的机会。 Qwoted 会跟踪回复率,不当推介会永久损害账户。
  • 绝不要手动修改 ~/.qwoted/sent_pitches.json——去重保护依赖此文件。将其视为只能追加的状态文件。
  • 绝不要将 ~/.qwoted/ 提交到 git。 其中包含用户的会话 Cookie(storage_state.json)——可用于访问整个账户。
  • 绝不要在用户自己的域名之前,将第 3 阶段统计页面发布到 Medium / LinkedIn / dev.to。 规范版本必须位于 https://<theirsite>/...——反向链接必须指向这里。

快速参考——所有命令

# Setup
python3 qwoted_login.py                                  # idempotent: skips browser if session is still valid
python3 qwoted_login.py --force                          # open browser even if session is valid (switch accounts)
python3 qwoted_login.py --reset                          # wipe saved profile + cookie jar, start fresh
python3 qwoted_login.py --headless                       # headless only works if an existing session is valid

# Profile
python3 qwoted_profile.py --action get                   # what entities exist?
python3 qwoted_profile.py --action create --full-name '...' --bio '...' --email '...'
python3 qwoted_profile.py --action update --bio '...'    # edit first Source

# Search
python3 qwoted_search.py --query "marketing automation" --max-hits 30
python3 qwoted_search.py --query "" --max-hits 50        # all opportunities

# Build a stats page (Stage 3)
# 1. READ STATISTICS_PAGE_PLAYBOOK.md for the research methodology
# 2. Open templates/statistics_page_example.html
# 3. Fill in placeholders → save to ./statistics_pages/<slug>.html
# 4. open ./statistics_pages/<slug>.html  # preview
# 5. User publishes on their site → returns public URL

# Pitch
python3 qwoted_pitch.py --source-request-id 235897 --pitch-text-file /tmp/p.txt
python3 qwoted_pitch.py --source-request-id 235897 --pitch-text-file /tmp/p.txt --send
python3 qwoted_pitch.py --source-request-id 235897 --pitch-text-file /tmp/p.txt \
    --research-page-url https://acme.com/blog/x-stats-2026 --send       # with stats page
python3 qwoted_pitch.py --opportunity-id de1ccdba --pitch-text-file /tmp/p.txt --send  # short URL form

状态目录:~/.qwoted/(可通过 QWOTED_HOME 环境变量覆盖)。

评论

支持 Markdown