Skip to content
Agentmart
Submit a tool

x-tweet-by-url

Scrapes tweets from any X (Twitter) URL — search results, user profile, single tweet detail, or list timeline — and returns normalized per-tweet data with…

Skill by browser-act

IndexedMIT★ 6,268
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/browser-act-x-tweet-by-url

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Scrapes tweets from any X (Twitter) URL — search results, user profile, single tweet detail, or list timeline — and returns normalized per-tweet data with text, author, engagement counts, media, hashtags, mentions, and cursor for pagination. Use when user mentions X URL scraper, Twitter URL scraper, scrape from URL, given an X link, given a Twitter link, accept mixed X URLs, accept mixed Twitter URLs, search URL, profile URL, list URL, status URL, tweet detail URL, scrape startUrls Twitter, X startUrls, mixed batch of Twitter links, paste links and scrape, mass URL extraction X, mass URL extraction Twitter, scrape from a list of links, x.com URLs, twitter.com URLs, classify Twitter URLs, auto-detect Twitter URL type, scrape lists on X, scrape Twitter lists, list timeline scraper, list tweet scraper, scrape conversation by URL. Also applies to processing seed URL files, dispatching mixed X URLs through a single workflow, list-based KOL monitoring, batch-collecting tweets from a curated list of profiles, lists, and individual posts.

Use cases: data, productivity

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md and code. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found
Runs as
Python package

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/x-tweet-by-url

What's inside

Skill name
x-tweet-by-url
Description
Scrapes tweets from any X (Twitter) URL — search results, user profile, single tweet detail, or list timeline — and returns normalized per-tweet data with text, author, engagement counts, media, hashtags, mentions, and cursor for pagination. Use when user mentions X URL scraper, Twitter URL scraper, scrape from URL, given an X link, given a Twitter link, accept mixed X URLs, accept mixed Twitter URLs, search URL, profile URL, list URL, status URL, tweet detail URL, scrape startUrls Twitter, X startUrls, mixed batch of Twitter links, paste links and scrape, mass URL extraction X, mass URL extraction Twitter, scrape from a list of links, x.com URLs, twitter.com URLs, classify Twitter URLs, auto-detect Twitter URL type, scrape lists on X, scrape Twitter lists, list timeline scraper, list tweet scraper, scrape conversation by URL. Also applies to processing seed URL files, dispatching mixed X URLs through a single workflow, list-based KOL monitoring, batch-collecting tweets from a curated list of profiles, lists, and individual posts.
License
MIT
Instructions
176 lines in SKILL.md · view on GitHub

Before installing

  • Ships executable scripts

Agent Skills spec issues

  • description: longer than 1024 characters

Files (3)

  • SKILL.md
  • classify-url.py · scripts/
  • parse-tweets.py · scripts/

SKILL.md (first lines)

# X — Tweets by URL

> Any X URL (search, profile, single tweet, list) → normalized list of tweets matching that URL's timeline.

## Language

All process output to user (progress updates, process notifications) follows the user's language.

## Objective

Accept any X URL as input, automatically detect which timeline endpoint it triggers, navigate to it, and return structured per-tweet data with pagination cursors. This unifies search, profile, single-tweet conversation, and list extraction under one entry point.

## Prerequisites

- Active X session in the browser (left sidebar shows logged-in avatar / @handle).
- Network capture is enabled in the browser-act session.

## Pre-execution Checks

### 1. Tool Readiness

If browser-act has been confirmed available in the current session → skip this step.

Invoke `browser-act` via Skill tool to load usage. If installation or configuration issues arise, follow its guidance to resolve then retry.

### 2. Login Verification

If login status for X has been confirmed in the current session → skip this step.

Otherwise: open `https://x.com` and observe the left sidebar:
- User avatar or @handle visible → logged in, continue
- "Sign in" / "Log in" prompt visible → not logged in, inform the user and assist the login flow

User refuses or cannot log in → terminate execution.

## Capability Components

> This Skill's operational boundary = what the user can manually do in their browser. It only reads tweet data already shown to the user, never bypassing authentication. The browser's own JS signs the GraphQL request; the Skill triggers it via URL navigation and reads the response from network traffic. Python scripts under `scripts/` only classify URLs and parse responses — they do not call X directly. Run them through the bash tool.

### Network Capture: tweets via input URL

Step 1 — classify the URL to determine which GraphQL endpoint will be triggered and which `--source` to pass to the parser:

`META=$(python scripts/classify-url.py '{url}')`

`classify-url.py` outputs a JSON object with fields:
- `normalized_url`: the URL with `twitter.com` rewritten to `x.com`.
- `kind`: one of `search`, `user_tweets`, `user_replies`, `user_media`, `tweet_detail`, `list`, `unknown`.
- `endpoint`: the GraphQL endpoint name to filter by (`SearchTimeline` / `UserTweets` / `UserTweetsAndReplies` / `UserMedia` / `TweetDetail` / `ListLatestTweetsTimeline`).
- `extract_source`: the `--source` value to pass to `parse-tweets.py` (`search` / `user_tweets` / `user_replies` / `user_media` / `tweet_detail` / `list`).
- `params`: detected path parameters (`handle`, `tweet_id`, `list_id`) when applicable.

If `kind == "unknown"`, report to the user that the URL is not a supported X timeline type and stop.

Step 2 — navigate and capture the first page:

1. `network requests --clear`
2. `navigate "$(echo "$META" | python -c "import sys,json;print(json.load(sys.stdin)['normalized_url'])")"`
3. `wait stable --timeout 25000` (timeout is normal on X; proceed)
4. Let `EP` = `endpoint` from `$META`. `network requests --type xhr,fetch --filter "$EP"` → take the latest entry's `request_id`.
5. `network request <request_id>` → save to `tmp/x-url-page-1.txt`.
6. Let `SRC` = `extract_source` from `$META`. `python scripts/parse-tweets.py --json-file tmp/x-url-page-1.txt --source "$SRC"`.

Endpoint characteristic: URL contains `/i/api/graphql/<hash>/<endpoint-name>`. The query hash rotates; always filter by name.

Step 3 — paginate via scroll (skip when `kind == "tweet_detail"` and only the focal tweet is required; keep paginating when collecting the full reply thread):

1. `network requests --clear`
2. `scroll down --amount 5000`
3. `wait stable --timeout 10000`
4. `network requests --type xhr,fetch --filter "$EP"` → newest entry's `request_id`
5. `network request <request_id>` → save to `tmp/x-url-page-N.txt`
6. `python scripts/parse-tweets.py --json-file tmp/x-url-page-N.txt --source "$SRC"`

Repeat Step 3 until any termination condition is met:
- Accumulated unique tweet count reaches the user's target.
- `count == 0` on the current page.
- `cursor_bottom` is unchanged across two consecutive pages.

Error handling: if no matching request appears after a scroll, wait 3 s and retry once. If `kind == "search"` and the page shows a captcha challenge (detect via `state` showing an "Authorize access to your account" or "Help us keep X safe" panel), pause and ask the user. If `kind == "list"` and the response's `data.list.tweets_timeline.timeline.instructions` is empty, the list is empty or access-restricted to the owner — terminate and report.

Output example:
```json
{
  "tweets": [
    {
      "type": "tweet",
      "id": "2068333045510291908",
      "url": "https://x.com/NASA/status/2068333045510291908",
      "twitter_url": "https://twitter.com/NASA/status/2068333045510291908",
      "text": "The official FIFA World Cup ball went to space! ...",
      "created_at": "Thu Jun 20 18:30:11 +0000 2026",
      "lang": "en",
      "source": "Twitter Web App",
      "retweet_count": 4586,
      "reply_count": 1812,
      "like_count": 24499,
      "quote_count": 240,
      "bookmark_count": 1730,
      "view_count": 2098235,
      "is_reply": false,
      "is_retweet": false,
      "is_quote": false,
      "quote_id": null,
      "quote_url": null,
      "in_reply_to_id": null,
      "in_reply_to_user": null,
      "in_reply_to_user_id": null,
      "conversation_id": "2068333045510291908",
      "hashtags": ["FIFAWorldCup"],
      "mentions": [],
      "urls": [],
      "media": [
        {"type": "photo", "url": "https://pbs.twimg.com/media/abcd.jpg", "expanded_url": "https://x.com/NASA/status/2068333045510291908/photo/1", "alt_text": null}
      ],
      "card": null,
      "place": null,
      "author": {
        "id": "11348282",

From browser-act/skills, MIT.

More from browser-act/skills

Signals

Stars
6,268
Forks
330
Open issues
9
Last commit (this folder)
Jun 26, 2026 (4 months ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from browser-act

Cite this page

x-tweet-by-url skill. Agent Mart. https://agentmart.dev/skills/browser-act-x-tweet-by-url (last updated 2026-10-24)