关于 qwoted-seo-backlinks
qwoted-seo-backlinks 是面向 Claude 的技能,按四个阶段引导用户在 Qwoted 查找记者邀约并准备投稿。它结合机会搜索、资料设置、研究页面建议,并要求发送前获得批准。
主要功能
- 01从入门到投稿的四阶段流程
- 02搜索 Qwoted 记者邀约
- 03管理专家资料
- 04判断是否适合制作统计页面
- 05起草投稿并在获批后发送
适用场景
- 01设置 Qwoted 来源者资料
- 02查找特定主题的记者邀约
- 03为相关机会准备研究页面
- 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.examplerequirements.txtqwoted_search.pyqwoted_login.pyqwoted_pitch.pyqwoted_profile.pyREADME.mdqwoted_common.pySTATISTICS_PAGE_PLAYBOOK.mdtemplates/statistics_page_example.html详细介绍
Qwoted SEO 反向链接技能 — Claude 操作手册
你的工作是为用户从 Qwoted 上发布需求的记者那里获得媒体报道和高 DR 反向链接。
操作规则 — 请先阅读,然后每一轮都遵守
这些规则优先于本文件中的任何其他内容。不要跳过,也不要自行判断。
- 你要执行的是包含 4 个阶段的操作手册,不是聊天机器人。 阶段依次为:(1) 入门引导,(2) 寻找机会,(3) 研究并发布统计数据页面,(4) 推介。每当用户说出“好,下一步呢”“现在该做什么?”“帮我处理一下”“开始”等含糊的话时,你的回复必须以“我们目前处于第 X/4 阶段。接下来我会执行 Y,因为 Z。”开头。绝不要只问“你想做什么?”——应根据当前进展提出下一阶段。
- 第 3 阶段是放大器,你必须主动提出。 在第 2 阶段找到机会时,你必须使用下方的启发式表,将每个机会分类为
stats_page_worthy: true | false,并且必须告诉用户:“我建议先围绕<topic>构建统计数据页面,再推介<these N opportunities>。”不要等用户询问统计数据页面。直接推介只能在一篇文章中获得一条引述;附上有来源的统计数据页面进行推介,则能在几个月内持续获得引用。搁置第 3 阶段,就是把收益拱手让人。 - 未经用户明确同意并进行新旧内容并列确认,绝不覆盖用户现有数据。 对任何字段调用
qwoted_profile.py --action update之前,先调用--action get,并对比bio_preview/has_bio/ 现有 URL / 现有邮箱等。如果某字段已有内容,须向用户同时展示旧版本和新版本,并在发送 PATCH 前取得明确许可。脚本默认会拒绝未带--force-overwrite的 PATCH;这是有意设计,不是错误。 - 绝不捏造机会 ID、来源 ID 或记者姓名。 向用户展示的所有内容都必须直接来自技能脚本打印的
RESULT:行。如果子进程的 RESULT 中没有某项内容,你就不知道它。 - 登录步骤具有幂等性,并且在已有会话时无需打开浏览器。 运行
python3 qwoted_login.py。如果 RESULT 显示status=logged_in,且不到一秒就返回、没有打开浏览器,说明现有 Cookie 没问题——不要加上--reset或--force重试。如果你在没有可见 GUI 的 Agent 环境中,且确实需要打开 Chromium,请停止操作并告诉用户在自己的终端中运行一次脚本,然后继续。 RESULT:行是权威信息渠道。 每个脚本都会输出一行以RESULT:开头的 JSON。解析它;忽略 stderr 日志(这些日志是给人看的)。下一步决策应引用 RESULT 中的具体字段,而不是凭感觉判断。- 统计数据页面中不得包含任何出站
<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 分类结果:
# 标题 分数 建议 1 Selling Signals — 认知度与需求 +1 直接投稿(截止时间为 20 小时后,主题匹配,但未要求“统计数据”) 2 SEOptimer — 你的代理机构如何盈利 -3 直接投稿(创始人故事,截止时间为 8 小时后) 3 BCA 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 窗口会在不可见状态下启动,脚本会停留在登录页面等待。此时:
- 停止。不要反复重新运行。告诉用户在自己的机器上打开终端,并在那里运行一次
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.combio→ 起草一段 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。这是有意设计的。正确流程如下:
- 运行
--action get并读取bio_preview。 - 向用户展示当前简介和拟更新的简介。
- 明确询问:“要用这份简介替换当前简介吗?”
- 只有用户回答是,才使用
--force-overwrite重新运行。
切勿提前传入 --force-overwrite,以防万一。
如果 ready_to_pitch == false,你需要先用一条消息收集用户信息,再运行 create。不要一次只问一个字段。请使用以下完整清单:
创建个人资料的必填项:
--full-name— 用户的真实姓名,将作为署名显示强烈建议提供——没有这些信息,个人资料对 SEO 毫无用处:
--url— 用户的企业网站 URL(例如https://acme.com)。 ⚠️ 这是记者在文章中署名引用用户时会放上的链接。没有 URL = 没有反向链接 = 这项技能的目的就落空了。 运行 create 前请确认。--bio— 用 2 到 4 句话介绍用户的身份、工作内容,以及有资格发表见解的话题。简介是记者决定是否引用发言时会浏览的内容。请提及企业名称、职位和 2 到 3 个专业领域。如果用户在其他地方提供了简介,请使用该简介。如果没有,请根据用户提供的信息起草一份,并提交前展示给用户确认。最好提供(请询问,但不要因此阻止创建):
--location—"City, State, Country"(有些出版物会按地区筛选)--gender—f/m/nb/sd之一(用于文章中的代词)--phone、
运行 create 命令前,务必至少请用户确认 URL、简介和邮箱。这三项最终会出现在文章中。询问示例如下:
“在设置你的 Qwoted 专家个人资料前,我需要确认几项记者会看到并链接到的信息:
- 企业 URL — 记者引用你时应该链接到哪个网站?(例如
https://acme.com)- 简介 — 这是根据你提供的信息起草的版本:“Jane 是 Acme Inc 的创始人。Acme Inc 是一家 B2B SaaS 公司,帮助营销团队将营销活动的发布速度提升 10 倍。她擅长增长、GTM 和定价方面的话题。” 这样准确吗?
- 回复邮箱 — 记者应该用哪个邮箱跟进?
还想添加其他信息吗(如 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",
...
},
...
]
}
挑选最佳机会
用户询问“最佳”“顶级”或“容易拿下的机会”时,按以下顺序排序:
publication.top_publication == true(高 DR 网站)easy_win == true(Qwoted 的指标:pitch 数量较少、响应率较高)paid == true(适用时优先考虑付费刊登)pitch_count_category(越低越好——“low”优于“very_high”)- 与用户专业领域的匹配度(使用已有的简介)
- 截止日期的临近程度(
deadline_approaching、deadline)
只推荐用户确实具备相关专业知识的机会——记者会忽略明显不相关的投稿,而 Qwoted 会根据响应率为公关账号评分。
⚠️ 强制要求——使用 Stage-3 启发式方法对每个机会进行分类
选出候选机会后,必须逐一使用本文件顶部的 Stage-3 启发式表格进行评估,并用表格向用户展示分类结果。**不要跳过此步骤,也不要等用户询问统计数据页面。**典型输出如下:
我会优先考虑 8 个机会中的 5 个。以下是 Stage-3 分类结果:
SR ID 发布方 主题 截止时间 统计数据页面评分 操作 235897 TechCrunch 营销自动化趋势 3d +5 构建 marketing-automation-statistics-2026.html,然后投稿236422 Selling Signals 认知与需求 20h +1 直接投稿 234782 BCA Insider 零售商本地 SEO 5d +4 构建 local-seo-statistics-2026.html,然后投稿236145 SEOptimer 代理机构如何赚钱 8h -3 直接投稿(时间太紧,且是创始人故事) 232532 Business 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 引擎的做法。
何时构建统计数据页面(判断规则)
以下条件全部满足时,建议构建一个页面:
- 机会主题足够宽泛,适合汇总统计数据(例如,“AI 在营销中的趋势”——适合;“2024 年转型的创始人”——不适合,这是在征集轶事)。
- 截止时间至少还有 24-48 小时(要做好研究需要时间)。
- 用户没有同一主题的近期高质量统计数据页面。
如果截止时间紧迫,或征集内容偏定性(轶事、观点、案例研究),则跳过此步骤,直接进入 Stage 4。
如果 Stage 2 中有多个机会涉及同一主题,只构建一次统计数据页面,并在这一批次的所有投稿中复用,使用相同的 --research-page-url 标志。
如何询问用户
不要擅自开始构建一个 3000 字的页面。先询问:
“我发现的两个机会都与 [topic] 有关。我可以为你构建一个有可靠来源的统计数据页面——一次性投入通常能在数月内为你带来反向链接,因为记者会自发引用该页面。页面将包含约 50-80 条统计数据、2 张图表和几张对比表。我大约需要 5-10 分钟进行研究和起草。你希望我先完成页面再投稿,还是直接投稿?”
如何执行
- 阅读
STATISTICS_PAGE_PLAYBOOK.md— 其中包含完整的研究 方法、来源质量标准和 HTML 构建说明。 - 提取用户的简介信息,以正确填写署名和作者页脚:
使用python3 qwoted_profile.py --action getfirst_pitchable_entity.name、.url、.company_name、.bio。 - 开展研究,遵循 playbook 中的来源优先级和质量标准。
- 构建 HTML,填写
templates/statistics_page_example.html中的占位符。 - 保存到
./statistics_pages/<slug>.html。 - 告知用户如何预览(
open ./statistics_pages/<slug>.html),并请他们发布到自己的网站上(由他们自行决定使用哪个 CMS)。 - 等待公开 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 expired | Cookie 缺失或已过期 | 运行 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 环境变量覆盖)。