Work on 𝕏 (Twitter) with a Dataset › Account of platform X.
Generated from the node definitions in
src/lib/flow/node/x/and the English labels (component.flow.node.x). Every node also has the common settings.
Contents
- Collect posts —
x/collect - 𝕏 selector health —
x/health - Reply —
x/reply - Delete reply —
x/reply/delete - Sign in to 𝕏 —
x/signin - Open timeline —
x/timeline - Like —
x/like - Read posts —
x/trend - Post —
x/post - Quote —
x/quote - Delete stale replies —
x/prune
Collect posts
x/collect · icon list-plus
Scrolls and collects posts from the timeline
Never your own posts: posts by the account its browser is signed in as (read once per run from the nav's Profile link) are skipped, so no reply, quote or like ever goes to yourself.
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
max | Maximum posts | number | 20 | |
scroll | Maximum scrolls | number | 30 | |
language | Language (e.g. id, en; empty: any) | text | ||
minView | Minimum views | number | 0 | |
maxView | Maximum views (0: any) | number | 0 | |
minLike | Minimum likes | number | 0 | |
maxLike | Maximum likes (0: any) | number | 0 | |
minReply | Minimum replies | number | 0 | |
skipReply | Skip replies | boolean | true | |
skipAd | Skip ads | boolean | true | |
maxReply | Maximum replies (0: any) | number | 0 | |
skipMarket | Skip posts that mention a marketplace | boolean | false | |
refreshAfter | Refresh the timeline after this many posts, in a fresh tab so a long run's memory stays flat (0: never) | number | 50 | |
repeat.post | repeat.post | select: never, allow | "never" | |
repeat.author | repeat.author | select: never, day, allow | "day" | |
queue | Searches to go through, in order (from the timeline's queue) | json | ||
claimMs | Hold collected posts for (ms) so no other campaign of the group takes them | number | 900000 |
Several searches
With a queue of more than one search, Collect posts reads the one on screen; when it has nothing more (8 screens without a new post, or Maximum scrolls) it opens the next and goes on, until Maximum posts is reached or the last search is dry. A later call (an endless flow) goes on where it stopped, and starts again from the first search once a call went through all of them.
Group memory, claims and the stack
Collect posts remembers in its campaign's group (tables x/collect/post and x/collect/author, see ):
- Posts the group already has (taken, replied, removed) are skipped; with
repeat.post: allowonly removed ones are. - Authors replied to within the rule are skipped (
day: in the last 24 hours,never: ever). - What it returns is claimed for
claimMs(with the post's text, time and counts instat: view, like, reply, repost, shown on the campaign's Records once replied): another campaign of the group claiming first wins, so two accounts never pick the same post. Its earlier claims still unreplied are let go first. itemsis its stack on the : reorder or remove posts until AI pick reads them.
Studio runs use group default; test runs keep their own rows (marked test).
Output dots
next— Nextempty— Empty
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"items": [
{
"id": "string",
"author": "string",
"url": "string",
"name": "string",
"text": "string",
"lang": "string",
"time": "string",
"reply": "number",
"repost": "number",
"like": "number",
"view": "number",
"media": "boolean"
}
]
}
Default settings
timeout 10 minutes; the rest are the .
Example node
{
"id": "collect",
"type": "x/collect",
"name": "Collect posts",
"field": {
"max": 20,
"scroll": 30,
"language": "",
"minView": 0,
"skipReply": true,
"skipAd": true,
"maxReply": 0,
"skipMarket": false,
"refreshAfter": 50
},
"setting": {
"retry": {
"count": 0,
"waitMs": 1000,
"backoff": "fixed"
},
"error": { "mode": "stop", "fallback": null, "break": { "count": 3, "waitMs": 600000 } },
"timeoutMs": 600000,
"disabled": false
},
"pin": null
}
𝕏 selector health
x/health · icon heart-pulse
Checks the 𝕏 page parts the 𝕏 nodes rely on still exist
| Field | Label | Kind | Default | Shown for |
|---|
No fields.
Output dots
ok— All goodbroken— Something's missing
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"ok": "boolean",
"signedIn": "boolean",
"checks": [
{
"name": "string",
"ok": "boolean"
}
],
"missing": [
"string"
],
"url": "string"
}
Default settings
timeout 2 minutes; the rest are the .
Example node
{
"id": "health",
"type": "x/health",
"name": "𝕏 selector health",
"field": {},
"setting": {
"retry": {
"count": 0,
"waitMs": 1000,
"backoff": "fixed"
},
"error": { "mode": "stop", "fallback": null, "break": { "count": 3, "waitMs": 600000 } },
"timeoutMs": 120000,
"disabled": false
},
"pin": null
}
Reply
x/reply · icon message-circle-reply · effect: publish (simulated in test runs)
Replies to a post. Give it a (e.g. 30 a day per account) in its settings
Sent: the post is labelled replied in the group's x/collect/post (with your reply's link and text) and the author's time, reply count and last reply (post link, reply link, text) are kept in x/collect/author, so no campaign of the group replies to them again; its queue item is done. Replies turned off: labelled failed. Quote labels the post quoted.
preview removes the link card 𝕏 draws for a link in the text before it sends: its remove button (Hapus pratinjau kartu), which sits next to the card, not inside it. Without a link nothing waits; when no button shows, it sends with the card.
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
account | Account | dataset.account | ||
url | Post URL | text | ||
text | Reply | textarea | ||
preview | Remove the link preview | boolean | true |
Output dots
next— Nextclosed— Replies off
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"url": "string",
"text": "string",
"reply": "string"
}
Default settings
timeout 5 minutes, on error human; the rest are the .
Example node
{
"id": "reply",
"type": "x/reply",
"name": "Reply",
"field": {
"cap": 30
},
"setting": {
"retry": {
"count": 0,
"waitMs": 1000,
"backoff": "fixed"
},
"error": { "mode": "human", "fallback": null, "break": { "count": 3, "waitMs": 600000 } },
"timeoutMs": 300000,
"disabled": false
},
"pin": null
}
Delete reply
x/reply/delete · icon message-circle-x · effect: act (simulated in test runs)
Deletes one of your replies and checks it's gone. It's the Delete reply row action on a campaign's replied posts: run beside the campaign's run in the campaign's x browser, then the row is labelled deleted.
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
account | Account | dataset.account | ||
reply | Reply URL | text |
Output dots
next— Next
Output shape
{
"reply": "string",
"deleted": "boolean"
}
Default settings
timeout 2 minutes; the rest are the .
Sign in to 𝕏
x/signin · icon log-in
Signs in with an account (2FA included)
Session: it runs in the campaign's browser (or the one of the campaign it runs in; a Studio test's own). Already signed in, it goes on; with a stored password it signs in by itself; without one (or at a check only a person can pass) it waits for you in the live view, up to 6 hours, then the run fails. Then it reads who it is (the twid cookie, the handle in the side nav) and checks it with mooflair: the first sign-in binds the account's user id, later ones must match it. See . Sign-ins take turns per browser: when two campaigns start together, the second finds it signed in.
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
account | Account | dataset.account |
Output dots
next— Next
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"username": "string",
"already": "boolean"
}
Default settings
timeout 10 minutes, on error human; the rest are the .
Example node
{
"id": "signin",
"type": "x/signin",
"name": "Sign in to 𝕏",
"field": {},
"setting": {
"retry": {
"count": 0,
"waitMs": 1000,
"backoff": "fixed"
},
"error": { "mode": "human", "fallback": null, "break": { "count": 3, "waitMs": 600000 } },
"timeoutMs": 600000,
"disabled": false
},
"pin": null
}
Open timeline
x/timeline · icon newspaper
Opens For you, Following, a List, a search or a profile
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
source | Timeline | select: home (For you), following, list, search, profile | "home" | |
query | Search, @profile, or List link or id (a list runs one by one) | text | ||
latest | Latest first (search) | boolean | true |
Output dots
next— Next
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"url": "string",
"queue": [
"string"
]
}
query can be a list (an option of kind List, {{ option.collect.query }}): the timeline opens the first and hands every search on as queue (links), so Collect posts can go through them one by one.
Default settings
timeout 2 minutes, on error human; the rest are the .
Example node
{
"id": "timeline",
"type": "x/timeline",
"name": "Open timeline",
"field": {
"source": "home",
"latest": true
},
"setting": {
"retry": {
"count": 0,
"waitMs": 1000,
"backoff": "fixed"
},
"error": { "mode": "human", "fallback": null, "break": { "count": 3, "waitMs": 600000 } },
"timeoutMs": 120000,
"disabled": false
},
"pin": null
}
Like
x/like · icon heart · effect: act (simulated in test runs)
Likes like a reader: a post on screen, the open post or a few of its replies
Off when enabled is false: templates set each like step to its own option: {{ option.like.timeline }}, {{ option.like.post }}, {{ option.like.reply }} (tab Behaviour). Only unliked posts are clicked (never ads). comments skips the post itself and likes up to max replies across a few scrolls.
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
enabled | On (off: passes straight through) | boolean | true | |
target | What to like | select: timeline (A post on screen), post (The open post), comments (A few of its replies) | "timeline" | |
chance | Chance per call (%) | number | 30 | |
max | Up to (replies) | number | 3 |
Output dots
next— Next
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"liked": "number"
}
Default settings
timeout 2 minutes, on error continue; the rest are the .
Read posts
x/trend · icon trending-up
Reads what people post now on the page Open timeline opened, for an AI, with your last posts
Reads up to max posts (one per author, no ads) from the page Open timeline opened (For you, Following, a List, a search or a profile) and returns recent: your last posts from x/post/post. Put Open timeline right before it.
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
account | Account | dataset.account | ||
max | Maximum posts | number | 35 | |
scroll | Maximum scrolls | number | 15 | |
language | Language (e.g. id, en; empty: any) | text | ||
recent | Your last posts to return | number | 10 |
Output dots
next— Next
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"items": [
{
"author": "string",
"url": "string",
"text": "string",
"like": "number",
"view": "number"
}
],
"recent": [
{
"text": "string",
"product": "string"
}
]
}
Default settings
timeout 5 minutes; the rest are the .
Post
x/post · icon square-pen · effect: publish (simulated in test runs)
Posts your own tweet (removes the link preview)
Types into the home composer and presses Post. Media goes in through the photo button's Upload (Unggah) menu and its file chooser. With preview, the link card 𝕏 draws for a link is removed first (its remove button sits next to the card, not inside it; when none shows, it posts with the card). Posted: kept in x/post/post with label posted, the product and how many media it had.
Media: Drive file ids (for example {{ nodes.next.output.media }} from ), copied into the run by the engine (see ) and uploaded with the composer's file input. 𝕏 takes up to 4 photos, or one video or GIF on its own; anything else fails the step before it types. Post waits until 𝕏 has processed them: a minute plus 3 seconds a megabyte, 25 minutes at most (the step's timeout is 30 minutes). With media, there is no link card to remove. A post can be media only (no text).
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
account | Account | dataset.account | ||
text | Text | textarea | ||
media | Media (Drive file ids, e.g. Next post's media: 4 photos, or one video or GIF) | drive | ||
product | Product (kept with the post) | text | ||
preview | Remove the link preview | boolean | true |
Output dots
next— Next
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"url": "string",
"text": "string"
}
Default settings
timeout 30 minutes, on error human; the rest are the .
Quote
x/quote · icon quote · effect: publish (simulated in test runs)
Quote-posts a post with your text (removes the link preview)
Repost › Quote, then your text in the quote dialog (link card removed with preview). The post is labelled quoted in x/collect/post (so the group doesn't take it again) and your quote is kept in x/post/post.
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
account | Account | dataset.account | ||
url | Post URL | text | ||
text | Quote | textarea | ||
product | Product (kept with the quote) | text | ||
preview | Remove the link preview | boolean | true |
Output dots
next— Next
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"url": "string",
"text": "string",
"quote": "string"
}
Default settings
timeout 5 minutes, on error human; the rest are the .
Delete stale replies
x/prune · icon eraser · effect: act (simulated in test runs)
Deletes your own old, barely seen replies or posts
Opens your profile in a tab of its own (reply: the Replies tab, only Replying to entries; post: the Posts tab) and deletes your own entries older than minAgeMs with at most maxView views, up to max. Defaults are the research's reply remover (10 hours, 2 views); its post remover used 3 hours and 1 view. Deleted replies mark their post removed in x/collect/post. Off when enabled is false (option Tidy up stale replies).
Fields
| Field | Label | Kind | Default | Shown for |
|---|---|---|---|---|
account | Account | dataset.account | ||
enabled | On (off: passes straight through) | boolean | true | |
target | What to delete | select: reply (Replies), post (Posts) | "reply" | |
minAgeMs | Older than (ms) | number | 36000000 | |
maxView | Views at most | number | 2 | |
max | Up to | number | 10 | |
scroll | Maximum scrolls | number | 10 |
Output dots
next— Next
Output shape
Later nodes read it as {{ nodes.<id>.output… }}.
{
"removed": [
"string"
]
}
Default settings
timeout 10 minutes, on error continue; the rest are the .