关于 pp-apify
pp-apify 是面向平台运营者的 Printing Press CLI 技能,用于协调 Apify Actor,构建定期研究、抓取和简报流程。它提供本地新内容跟踪、跨数据集搜索、成本控制和声明式调度。
主要功能
- 01运行 Actor 并仅输出未见条目
- 02跨 Actor 搜索缓存数据集
- 03查看并限制运行成本
- 04生成摘要并串联工作流
- 05以代码管理计划任务
- 06保存并重放 Actor 输入预设
适用场景
- 01查找定期抓取中的新增结果
- 02比较 Actor 成本与结果重合度
- 03从多个 Actor 生成简报
- 04对 Apify 计划任务进行版本管理
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mvanhorn/ printing-press-library --skill pp-apify安装后在 Claude Code 中输入/pp-apify确认已加载。
详细介绍
Apify — Printing Press CLI
前提条件:安装 CLI
此技能使用 apify-pp-cli 二进制文件。**调用此技能中的任何命令之前,必须确认 CLI 已安装。**如果尚未安装,请先安装:
- 使用 Printing Press 安装程序安装。在 macOS/Linux 上,二进制文件默认安装到
$HOME/.local/bin;在 Windows 上,默认安装到%LOCALAPPDATA%\Programs\PrintingPress\bin:npx -y @mvanhorn/printing-press-library install apify --cli-only - 验证:
apify-pp-cli --version - 确保报告的安装目录位于调用此技能的 Agent/运行时的
$PATH中。
如果 npx 安装失败(没有 Node、处于离线状态等),请改用 Go 直接安装(需要 Go 1.26.6 或更高版本):
go install github.com/mvanhorn/printing-press-library/library/developer-tools/apify/cmd/apify-pp-cli@latest
如果安装后 --version 报告“command not found”,则运行时无法在 $PATH 中找到二进制文件目录。验证成功之前,请勿继续执行技能命令。
何时使用此 CLI
当你需要将多个 Apify Actor 编排为定期运行的研究、抓取或新闻简报工作流时,请使用 apify-pp-cli。如果你需要查看每次运行的成本、仅输出新内容、跨 Actor 搜索或将计划作为代码管理,它就是合适的工具。开发 Actor(编写自己的抓取器)时,请使用官方的 apify-cli;此 CLI 面向平台运营人员。
独特功能
这些功能是此 API 的其他任何工具都不具备的。
可累积的本地状态
-
run— 运行 Actor,只输出该 Actor 之前运行时未出现过的条目。当你需要在新闻简报或提醒工作流中定期抓取,并了解“自上次运行以来有哪些新内容”时,请使用此功能。
apify-pp run trudax/reddit-scraper --input @sub-list.json --only-new --format markdown -
search items— 对每个 Actor 的所有缓存数据集进行全文搜索,并将结果规范化为通用架构。如果你想知道“本周大家都说了哪些关于 X 的内容”,而不想费心处理 8 个数据集 ID,请使用此功能。
apify-pp search "model context protocol" --since 7d --actors twitter,reddit,hn --json --select url,title,source_actor -
digest --offline— 使用本地 SQLite 副本中的历史数据集运行查询并渲染模板,无需调用 API。调整模板或去重启发式规则时,请使用此功能,让迭代无需成本。
apify-pp digest --offline --topic AI --since 7d --template draft.tmpl
成本管控
-
cost report— 结合缓存的运行元数据和 Apify 月度用量接口,生成按次运行划分的美元成本报告。当用户询问“为什么我的 Apify 账单这么高”或“哪个 Actor 的单条有效内容成本最高”时,请使用此功能。
apify-pp cost report --since 30d --group-by actor,schedule --json -
run --max-cost— 根据同一 Actor 过去运行的本地 p50/p90 进行预运行成本预测;如果预测成本超出预算,则中止运行。对任何长尾或不可信的 Actor 使用此功能,以便在成本超支时默认中止,而不是等到账单出来后才发现。
apify-pp-cli run xquik/x-tweet-scraper --input @xquik-tweets.json --max-cost 0.50 --wait -
ab run— 将同一输入分别交给两个竞争 Actor 运行,通过统一架构规范化结果,并报告每条新增内容的成本和重叠百分比。用户在安排定期任务之前,想知道“更便宜的 Actor 是否够用”时,请使用此功能。
apify-pp ab run apidojo/tweet-scraper kaitoeasyapi/twitter-x-data-tweet-scraper-pay-per-result-cheapest --input shared.json --judge novelty --json
新闻简报工作流
-
digest— 从本地存储生成 Markdown 简报:按 URL 和标题相似度去重,按互动度、时效性和新颖度排序,并填充 Go 模板。将此功能作为任何新闻简报或每周报告工作流的最后一步;输出内容可直接粘贴到 Beehiiv,或通过管道交给写作 Agent。
apify-pp digest --topic "AI dev tools" --since 24h --template weekly.tmpl -
workflow run— 运行由 YAML 声明的工作流,在多个 Actor 之间依次执行 run → normalize → novelty → digest → publish。当用户希望拥有一条定期运行的“执行一条命令,即可生成新闻简报”工作流,而不想手动编排 Actor 调用时,请使用此功能。
apify-pp workflow run ./weekly-newsletter.yaml --json
GitOps
-
schedules apply— 声明式的 cron 与 Actor 输入配置包,可通过类似 Terraform 的 plan/apply/diff,与实时 Apify 计划 API 交互。当用户管理 3 个或更多计划,并希望将其纳入版本控制时,请使用此功能。
apify-pp schedule apply ./schedules.yaml --dry-run && apify-pp schedule diff
可重复性
-
preset save— 从之前的运行中保存经过验证的 Actor 输入 JSON,并支持通过覆盖参数重放。使用此功能,无需每次重新运行定期抓取时都手动重建输入 JSON。
apify-pp preset save twitter weekly-ai --from-run abc123 && apify-pp call twitter --preset weekly-ai --override [email protected]
命令参考
actor-builds — 本节所述的 API 端点可用于管理和删除 Apify Actor 构建。
请注意,如果任何返回的构建对象包含以美元计价的用量,那么计算该美元等值时使用的是查询时适用的单位价格,因此仅供参考。
你可以在文档中进一步了解平台用量。
apify-pp-cli actor-builds delete— 删除构建。不能删除当前设为 Actor 默认构建的构建。仅限拥有构建...apify-pp-cli actor-builds get— 获取用户的所有构建列表。响应是一个 JSON 对象数组,其中每个对象都包含基本...apify-pp-cli actor-builds get-actorbuilds— 获取包含 Actor 特定构建全部详情的对象。传入可选的...
actor-runs — 本节所述的 API 端点可用于管理和删除 Apify Actor 运行。
如果任何返回的运行对象包含以美元计价的用量,那么计算该美元等值时使用的是查询时适用的单位价格,因此仅供参考。
对于已完成的运行,stats 等汇总字段或美元用量总额最终一致,会在几秒内更新。若需要与最终总额一致的数值,请在运行完成后等待约 10 秒,然后重新获取该运行。
你可以在文档中进一步了解平台用量。
apify-pp-cli actor-runs delete— 删除运行。仅可删除已结束的运行。只有发起运行的个人或组织才能删除该运行。apify-pp-cli actor-runs get— 获取用户的所有运行列表。响应是一个对象列表,其中每个对象都包含基本信息...apify-pp-cli actor-runs get-actorruns— 这不是单个端点,而是一组完整的端点,可用于获取运行或其任何默认...apify-pp-cli actor-runs put— 此端点可用于更新运行的状态消息,并配置其常规资源访问权限...
actor-tasks — 本节所述的 API 端点可用于创建、管理、删除和运行 Apify Actor 任务。 如需了解更多信息,请参阅 Actor tasts 文档。
:::note
对于所有接受 actorTaskId 参数以指定任务的 API 端点,你可以传入任务 ID(例如 HG7ML7M8z78YcAPEB),也可以传入以波浪号分隔的任务所有者用户名和任务名称(例如 janedoe~my-task)。
:::
部分 API 端点会返回运行对象。如果此类运行对象包含以美元计价的用量,那么计算该美元等值时使用的是查询时适用的单位价格,因此仅供参考。
你可以在文档中进一步了解平台用量。
apify-pp-cli actor-tasks delete— 删除由actorTaskId参数指定的任务。apify-pp-cli actor-tasks get— 获取用户创建或使用过的任务完整列表。响应是一个对象列表,其中每个对象...apify-pp-cli actor-tasks get-actortasks— 获取包含任务全部详情的对象。apify-pp-cli actor-tasks post— 使用 POST 负载中以 JSON 传入的对象所指定的设置创建新任务。响应是完整的...apify-pp-cli actor-tasks put— 使用 POST 负载中以 JSON 传入的对象所指定的值更新任务设置。如果该对象...
acts — 管理 acts
apify-pp-cli acts delete— 删除 Actor。apify-pp-cli acts get— 获取用户创建或使用过的所有 Actor 的列表。响应是一个对象列表,其中每个对象……apify-pp-cli acts get-actorid— 获取包含特定 Actor 全部详情的对象。apify-pp-cli acts post— 根据 POST 请求负载中以 JSON 传递的 Actor 对象指定的设置,创建新的 Actor。响应是……apify-pp-cli acts put— 根据 POST 请求负载中以 JSON 传递的 Actor 对象指定的值,更新 Actor 的设置。如果……
browser-info — 管理浏览器信息
apify-pp-cli browser-info tools-delete— 返回有关 HTTP 请求的信息,包括客户端 IP 地址、国家/地区代码、请求标头和正文……apify-pp-cli browser-info tools-get— 返回有关 HTTP 请求的信息,包括客户端 IP 地址、国家/地区代码、请求标头和正文……apify-pp-cli browser-info tools-post— 返回有关 HTTP 请求的信息,包括客户端 IP 地址、国家/地区代码、请求标头和正文……apify-pp-cli browser-info tools-put— 返回有关 HTTP 请求的信息,包括客户端 IP 地址、国家/地区代码、请求标头和正文……
datasets — 管理数据集
apify-pp-cli datasets delete— 删除指定的数据集。apify-pp-cli datasets get— 列出用户的所有数据集。响应是一个 JSON 对象数组,其中每个对象都包含基本……apify-pp-cli datasets get-datasetid— 返回指定数据集 ID 对应的数据集对象。此操作不会返回数据集条目,只返回有关存储的信息……apify-pp-cli datasets post— 创建数据集并返回其对象。请注意,存储在未命名数据集下的数据遵循 [data……apify-pp-cli datasets put— 根据请求正文中以 JSON 传递的对象所指定的值,更新数据集名称和常规资源访问级别……
key-value-stores — 管理键值存储
apify-pp-cli key-value-stores delete— 删除键值存储。apify-pp-cli key-value-stores get— 获取用户拥有的键值存储列表。响应是一个对象列表,其中每个对象都包含……apify-pp-cli key-value-stores get-keyvaluestores— 获取包含特定键值存储全部详情的对象。apify-pp-cli key-value-stores post— 创建键值存储并返回其对象。响应与 [Get…… 返回的对象相同apify-pp-cli key-value-stores put— 根据请求正文中以 JSON 传递的对象所指定的值,更新键值存储的名称和常规资源访问级别……
logs — 本节介绍的 API 端点用于下载由 Actor 构建和运行生成的日志。请注意,系统只会存储日志末尾的 5M 个字符,其余部分将被丢弃。
:::note
请注意,这些端点不需要身份验证令牌;调用通过难以猜测的 Actor 构建或运行 ID 进行身份验证。
:::
apify-pp-cli logs <buildOrRunId>— 获取特定 Actor 构建或运行的日志。
request-queues — 管理请求队列
apify-pp-cli request-queues delete— 删除指定的队列。apify-pp-cli request-queues get— 列出用户的所有请求队列。响应是一个 JSON 对象数组,其中每个对象都包含基本……apify-pp-cli request-queues get-requestqueues— 返回指定队列 ID 对应的队列对象。apify-pp-cli request-queues post— 创建请求队列并返回其对象。请注意,存储在未命名队列下的请求遵循 [data……apify-pp-cli request-queues put— 根据请求正文中以 JSON 传递的对象所指定的值,更新请求队列的名称和常规资源访问级别……
schedules — 本节介绍用于管理计划的 API 端点。 计划用于在特定时间自动启动 Actor。每个计划可以关联多个 Actor 和 Actor 任务。也可以覆盖每个 Actor(任务)的设置,方式与通过 API 调用 Actor(任务)时类似。 更多信息请参阅计划文档。
每个计划都会分配要执行的操作。操作分为两种类型:
RUN_ACTOR和RUN_ACTOR_TASK。
详情请参阅获取计划端点的文档。
apify-pp-cli schedules delete— 删除计划。apify-pp-cli schedules get— 获取用户创建的计划列表。该端点支持使用limit和offset进行分页……apify-pp-cli schedules get-scheduleid— 获取包含所有详细信息的计划对象。apify-pp-cli schedules post— 使用请求负载中以 JSON 格式传入的计划对象所提供的设置创建新计划。响应为……apify-pp-cli schedules put— 使用 POST 请求负载中以 JSON 格式传入的计划对象指定的值更新计划。如果对象……
store — Apify Store 汇集了数千个面向 Apify 社区的公开 Actor。 本节介绍的 API 端点用于检索这些 Actor。
:::note
这些端点无需身份验证令牌。
:::
apify-pp-cli store— 获取 Apify Store 中的公开 Actor 列表。你可以使用search参数按标题中的字符串搜索 Actor……
tools — 本节介绍的 API 端点提供实用工具,用于编码、签名和验证数据,以及检查 HTTP 请求详情。
apify-pp-cli tools decode-and-verify-post— 解码并验证之前通过 encode-and-sign 端点创建的编码值。返回原始……apify-pp-cli tools encode-and-sign-post— 对任意 JSON 对象进行编码并签名。编码后的值包含与经过身份验证的用户 ID 关联的签名,该签名……
users — 本节介绍的 API 端点用于返回用户帐户信息。
apify-pp-cli users get— 返回特定用户帐户的公开信息,类似于公开个人资料页面上显示的信息(例如……apify-pp-cli users me-get— 返回当前用户帐户的信息,包括公开和私密信息。用户帐户……apify-pp-cli users me-limits-get— 返回帐户限制的完整摘要。与你在帐户的……中看到的信息相同apify-pp-cli users me-limits-put— 更新可在帐户的限制页面管理的帐户限制……apify-pp-cli users me-usage-monthly-get— 返回当前月度用量周期的完整用量摘要、总用量以及每日……
webhook-dispatches — 管理 Webhook 分发
apify-pp-cli webhook-dispatches get— 获取用户拥有的 Webhook 分发列表。该端点支持使用limit和……进行分页apify-pp-cli webhook-dispatches webhook-dispatch-get— 获取包含所有详细信息的 Webhook 分发对象。
webhooks — 用于配置自动通知的 Webhook 相关 API 端点。
apify-pp-cli webhooks delete— 删除 Webhook。apify-pp-cli webhooks get— 获取用户创建的 Webhook 列表。该端点支持使用limit和offset进行分页……apify-pp-cli webhooks get-webhookid— 获取包含所有详细信息的 Webhook 对象。apify-pp-cli webhooks post— 使用请求负载中以 JSON 格式传入的 Webhook 对象所提供的设置创建新的 Webhook。响应为……apify-pp-cli webhooks put— 使用 POST 请求负载中以 JSON 格式传入的 Webhook 对象指定的值更新 Webhook。如果对象……
查找合适的命令
当你知道要做什么,却不知道该用哪个命令时,直接向 CLI 提问:
apify-pp-cli which "<capability in your own words>"
which 会根据自然语言能力查询,从此 CLI 精选的功能索引中找出最匹配的命令。退出代码 0 表示至少有一项匹配;退出代码 2 表示没有可信的匹配项——此时可改用 --help,或缩小查询范围。
示例
每周新闻简报抓取
apify-pp workflow run ./weekly-newsletter.yaml --agent
通过一条由 YAML 声明的链式流程,抓取 Twitter、Reddit、HN 和 News,并生成一份可直接用于新闻简报的摘要。
Xquik 推文调研
使用 Xquik 的 X Tweet Scraper 搜索推文、查看时间线、串文、回复、引用和互动数据。
创建 xquik-tweets.json:
{
"searchTerms": ["from:OpenAI API", "#AI lang:en"],
"maxItems": 100,
"maxItemsPerTarget": 50,
"outputVariant": "rich"
}
apify-pp-cli run xquik/x-tweet-scraper --input @xquik-tweets.json --max-cost 0.50 --wait --agent
maxItems 用于限制单次运行的条目数。maxItemsPerTarget 用于平衡指定目标的数量。
Xquik 受众调研
使用 Xquik 的 X Follower Scraper 抓取关注者、正在关注的账号、已认证关注者、列表和社群。
创建 xquik-followers.json:
{
"twitterHandles": ["OpenAI", "AnthropicAI"],
"relations": ["followers", "verified_followers"],
"maxItems": 100,
"maxItemsPerTarget": 50,
"outputMode": "compact",
"includeTargetMetadata": true,
"dedupeMode": "merge"
}
apify-pp-cli run xquik/x-follower-scraper --input @xquik-followers.json --max-cost 0.50 --wait --agent
在多目标运行时保留目标元数据。使用合并去重来处理受众重叠。
maxItemsPerTarget 可用于平衡各目标的结果数量。
付费运行前,请检查各 Actor 当前的 Store 架构和定价。
CLI 会根据本地历史记录生成投影。--wait 会添加实时监控。
Xquik 是独立的第三方服务,与 X Corp. 无关联。“Twitter”和“X”是 X Corp. 的商标。
跨 Actor 主题搜索(精简)
apify-pp search 'agent' --since 30d --agent --select url,title,source_actor,published_at
对本地存储使用 FTS5;使用带点号路径的 --select,避免拉取完整的规范化条目负载。
计划漂移检查
apify-pp schedule diff --agent
对本地 YAML 与实时 Apify 计划进行 Terraform 风格的差异比较;输出为 JSON 变更集。
对两个 Twitter 抓取器进行 A/B 测试
apify-pp ab run apidojo/tweet-scraper kaitoeasyapi/twitter-x-data-tweet-scraper --input shared.json --judge cost-per-novel --agent
同时运行两者,通过统一架构规范化数据,并报告每个新增条目的成本和重叠百分比。
身份验证设置
设置 APIFY_TOKEN(从 Apify Console → Settings → Integrations 获取),或运行 apify-pp auth set-token。CLI 会在进行任何调用前,通过 /v2/users/me 验证令牌。支持查询参数形式的 ?token=,但不建议使用。
运行 apify-pp-cli doctor 验证设置。
Agent 模式
为任意命令添加 --agent。它会展开为:--json --compact --no-input --no-color --yes。
-
支持管道传输 — JSON 输出到 stdout,错误输出到 stderr
-
支持筛选 —
--select可保留字段子集。带点号的路径可深入嵌套结构;数组会逐个遍历元素。对于输出冗长的 API,此功能对于控制上下文大小至关重要:apify-pp-cli actor-builds get --agent --select id,name,status -
支持预览 —
--dry-run会显示请求,但不会发送 -
支持离线使用 — 有本地 SQLite 存储时,sync/search 命令可以使用该存储
-
非交互式 — 不会提示输入,每项输入都通过标志指定
-
明确的重试行为 — 只有当已存在的对象应视为创建成功时才使用
--idempotent;只有当缺失的删除目标应视为删除成功时才使用--ignore-missing
响应封装
从本地存储或 API 读取数据的命令,会将输出封装在一个来源信息对象中:
{
"meta": {"source": "live" | "local", "synced_at": "...", "reason": "..."},
"results": <data>
}
解析 .results 获取数据,并查看 .meta.source 判断数据来自实时来源还是本地存储。只有当 stdout 指向终端,且未设置机器格式标志(--json、--csv、--compact、--quiet、--plain、--select)时,才会将易读的 N results (live) 摘要打印到 stderr——管道或 Agent 消费者以及显式指定格式的运行会在 stdout 输出纯 JSON。
Agent 反馈
当你(或 Agent)发现此 CLI 有不妥之处时,请记录下来:
apify-pp-cli feedback "the --since flag is inclusive but docs say exclusive"
apify-pp-cli feedback --stdin < notes.txt
apify-pp-cli feedback list --json --limit 10
条目会保存在本地的 ~/.apify-pp-cli/feedback.jsonl 中。除非设置了 APIFY_FEEDBACK_ENDPOINT,且传入了 --send 或设置了 APIFY_FEEDBACK_AUTO_SEND=true,否则不会通过 POST 发送。默认行为仅保存在本地。
写下让你感到意外的地方,而不是提交错误报告。简短、具体、一行即可:这才是会不断积累价值的部分。
输出交付
每个命令都接受 --deliver <sink>。输出会发送到指定的目标,同时输出到 stdout 或替代 stdout,这样 Agent 就能路由命令结果,无需手动通过管道传递。支持三种目标:
| 目标 | 效果 |
|---|---|
stdout | 默认;仅写入 stdout |
file:<path> | 将输出以原子方式写入 <path>(临时文件 + 重命名) |
webhook:<url> | 将输出正文 POST 到该 URL(使用 application/json,或在设置 --compact 时使用 application/x-ndjson) |
对于未知方案,系统会拒绝请求,并返回包含受支持方案列表的结构化错误。Webhook 请求失败时会返回非零状态码,并在 stderr 中记录 URL 和 HTTP 状态码。
命名配置文件
配置文件是一组已保存的标志值,可在多次调用中重复使用。当定时运行的 Agent 每次都以相同配置调用同一命令时,可使用它——这就是 HeyGen 的 “Beacon” 模式。
apify-pp-cli profile save briefing --json
apify-pp-cli --profile briefing actor-builds get
apify-pp-cli profile list --json
apify-pp-cli profile show briefing
apify-pp-cli profile delete briefing --yes
显式标志始终优先于配置文件值;配置文件值优先于默认值。agent-context 会在 available_profiles 下列出所有可用配置文件,方便进行自省的 Agent 在运行时发现它们。
退出代码
| 代码 | 含义 |
|---|---|
| 0 | 成功 |
| 2 | 用法错误(参数错误) |
| 3 | 未找到资源 |
| 4 | 需要身份验证 |
| 5 | API 错误(上游问题) |
| 7 | 请求过于频繁(等待后重试) |
| 10 | 配置错误 |
参数解析
解析 $ARGUMENTS:
- 为空、
help或--help→ 显示apify-pp-cli --help输出 - 以
install开头 → 以mcp结尾 → 安装 MCP;否则 → 参见上文“先决条件” - 其他任何内容 → 直接使用(作为 CLI 命令执行,并带上
--agent)
MCP 服务安装
从此 CLI 发布的 public-library 条目或预构建发行版中安装 MCP 二进制文件,然后进行注册:
claude mcp add apify-pp-mcp -- apify-pp-mcp
验证:claude mcp list
直接使用
- 检查是否已安装:
which apify-pp-cli如果未找到,提示安装(参见本技能顶部的“先决条件”)。 - 将用户查询与上文“独特功能”和“命令参考”中的最佳命令匹配。
- 使用
--agent标志执行:apify-pp-cli <command> [subcommand] [args] --agent - 如果存在歧义,查看子命令帮助:
apify-pp-cli <command> --help。