配方 · 产品发布

Sign up and post

以这个环境打开一个论坛并发帖。如果环境已经登录,它就保留那个账号,直接开始写正文;如果没有登录,它就去注册——用你指定的用户名,或者由你的模型想一个,密码用环境自己保存的那个,或者二十位随机字符。它向你的模型要标题和正文,提交帖子,并把账号、凭据和链接记进 Launch posts。每一次运行都以那里的一行结束,失败的也一样:页面打不开、用户名被占用、提交被限流,都会用站点自己的措辞记录下来,而不是抛成一个错误。出厂时指向 Hacker News;网址是参数,表单选择器则是 HN 的。

本页内容

它做什么

一个新账号发布自己产品的链接,正是论坛审核最针对的模式——在 Hacker News 上尤其如此,新账号会被限流,带推广性质的第一帖通常会被举报。在让它提交之前,先读一遍模型写了什么,并且要预料到第一帖多半留不住。

保留这个环境已经登录的账号,或者注册一个新账号——向你的模型要一个标题和一段正文,提交帖子,然后把账号和链接记下来。

它在一个环境上运行,走这个环境自己的代理、带它自己的 Cookie——所以页面加载出来的样子,和那个账号的主人看到的一样。 它会打开页面,所以请给它一个你愿意让其会话被占用的环境。

One profileIts own proxy and cookiesThe Launch posts table6 settings on the run

43 个步骤

这是真实的步骤树,读自启动器随附的那个套件。缩进代表嵌套:循环下面的步骤每行执行一次,分支下面的步骤只在它上方的条件成立时才执行。每一处 {{…}} 都是运行时才填入的值——来自正在遍历的那一行、来自这次运行的某项设置,或者来自环境本身。

setVarStart the row under this profileSet account_name
gotoOpen the submit pageGo to {{vars.submit_url}}失败时:continue
evaluateRead the page: loaded, signed in, whoRun script失败时:continue
ifOnly if nobody has named this account yetIf {{vars.page.needs_name}} equals

Yes

aiPromptAsk the model for a nameAsk AI into ai_handle失败时:continue
ifOnly if the page is actually thereIf {{vars.page.route}} notEquals

Yes

evaluateSettle on the account nameRun script失败时:continue
evaluateSettle on the passwordRun script失败时:continue
ifOnly if it is not signed in yetIf {{vars.page.route}} equals

Yes

gotoOpen the sign-up pageGo to {{vars.signup_url}}失败时:continue
ifOnly if this site shows a captchaIf iframe[src*="recaptcha"], iframe[src*="hcaptcha"], .h-captcha, .g-recap… selectorExists

Yes

solveCaptchaSolve itSolve the captcha on the page失败时:continue
loopTry up to three namesLoop times

Each time

ifOnly while it has not signed upIf {{vars.signup.ok}} equals

Yes

evaluateA different name, if this is a retryRun script失败时:continue
typeType the account nameType into form:has(input[name="creating"]) input[name="acct"]失败时:continue
typeType the passwordType into form:has(input[name="creating"]) input[name="pw"]失败时:continue
clickCreate the accountClick form:has(input[name="creating"]) input[type="submit"]失败时:continue
evaluateDid it take?Run script失败时:continue
gotoBack to the form for another tryGo to {{vars.signup_url}}失败时:continue
ifOnly if the account now existsIf {{vars.signup.ok}} equals

Yes

ifOnly if the site confirms by emailIf {{vars.confirm_email}} equals

Yes

waitForEmailWait for the confirmationWait for mail matching verify|confirm|activate失败时:continue
extractEmailLinkTake the link out of itTake a link from {{vars.mail}} into confirm_link失败时:continue
gotoOpen itGo to {{vars.confirm_link}}失败时:continue
ifReady, because it was already signed inIf {{vars.page.route}} equals

Yes

setVarMark it readySet stage
ifReady, because the sign-up landedIf {{vars.signup.ok}} equals

Yes

setVarMark it readySet stage
ifOnly with an account to post fromIf {{vars.stage}} equals

Yes

aiPromptWrite the postAsk AI into post失败时:continue
ifOnly if the model actually wrote oneIf {{vars.post.title}} exists

Yes

gotoOpen the submit pageGo to {{vars.submit_url}}失败时:continue
typeTitleType into input[name="title"]失败时:continue
typeLinkType into input[name="url"]失败时:continue
typeBodyType into textarea[name="text"]失败时:continue
clickSubmit itClick input[type="submit"]失败时:continue
evaluateDid it go up?Run script失败时:continue
ifOnly if something went upIf {{vars.submitted.ok}} equals

Yes

gotoOpen this account's submissionsGo to https://news.ycombinator.com/submitted?id={{vars.account_name}}失败时:continue
evaluateRead the post linkRun script失败时:continue
evaluateDecide what happenedRun script失败时:continue
saveRowsFile what happenedSave to Launch posts失败时:continue

其中每一个都是自动化参考上的某一种步骤类型,字段与编辑器里显示的一致,也与 Agent 经本地 API 拿到的一致。

它用到的表

它们会随配方一起加载。数据集是一张由你的工作区拥有的、有类型的表——列名和列类型事先定好,步骤才能寻址到它们,而其中每一列日后都可以由你改名、扩展,或者从文件里填充。

Launch posts

写入

One row per post: the site, the account that made it, the link it went to and what became of it.

handle
Handle · text
site
Site · text
password
Password · text
title
Title · text
body
Body · longText
post_url
Post URL · url
posted_at
Posted at · datetime
status
Status · select · Posted | Flagged | Removed | Failed
reason
Reason · longText

重跑会更新它此前写下的那一行,而不是再添一行。保存步骤里的匹配列就是为此存在的,这也正是一次状态检查与一张每跑一遍就翻倍的表之间的区别。

它会问你什么

设置在运行开始时填写,而且每个环境都可以保存自己的一套值——一条流程就是这样服务一整个文件夹的账号的。

handle
Account name · text

Optional. If this profile is already signed in, that account wins whatever you put here. Otherwise this is the name it signs up with — and if you leave it empty, your model invents one that reads like a person and it is filed in Launch posts with its password.

signup_url
Sign-up page · text

The page carrying the create-account form. Only opened when the profile turns out not to be signed in already.

submit_url
Submit page · text

The page carrying the new-post form. Opened first, before anything is typed, because whether it serves that form is how the run knows it is signed in — and whether it loads at all is how the run knows the proxy has a route out.

link
Link to post · text

The URL the post points at.

angle
What it is · textarea

One phrase, in your own words, describing the thing. This is the only input the model gets about the product — a vague phrase here produces a vague post, and no amount of prompt does better than a specific one.

confirm_email
Does the site email a confirmation link? · select

Hacker News does not. Set yes and the run waits for the mail in this profile's own mailbox, opens the link, and carries on.

如何加载

在启动器里打开 Automations,选择 Load a starter pack,然后挑 产品发布。把不想要的取消勾选。先落地的是表,然后是流程,最后是一个叫 Launch 的项目,把它们连在一起。

到手的是一条普通的自动化记录行。在编辑器里打开它、改一个步骤、给它改名、把它删掉都行——此后应用不会把它当作特殊的东西,而且第二次加载这个套件是做一份全新的副本,不会覆盖你改过的那一条。表则相反:同名的表如果已存在,就会被沿用并保留它的数据行。