К основному содержанию
скилл CX Codex

twitter-reader · daymade — скилл для Claude Code: что делает и как установить

Выгружает посты и статьи из Twitter/X в Markdown вместе с метаданными и скачанными картинками. Пригодится для сохранения архивов в базу знаний.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add daymade/claude-code-skills --skill twitter-reader -a claude-code
Открыть на GitHub

Что делает twitter-reader

Скилл сохраняет публикации и длинные статьи X Articles в виде готовых Markdown-файлов. Для коротких постов утилита обращается к API fxtwitter без авторизации. При обработке полных статей скрипт scripts/fetch_article.py собирает метаданные через twitter-cli, а текст и ссылки на медиа запрашивает через Jina API.

Картинки загружаются в отдельную папку attachments/, а в Markdown-документ прописываются локальные пути и YAML frontmatter с метриками вовлечённости. Если анонимный доступ к Jina временно заблокирован, скрипт сохранит текст без изображений и предупредит об этом. Без установленного пакетного менеджера uv запустить режим выгрузки статей не получится.

Какие задачи решает

  • сохранить длинную статью X Article в Markdown с локальными картинками
  • выгрузить текст поста и счётчики реакций без авторизации в X
  • подготовить заметку с YAML frontmatter для личной базы знаний
  • пакетно выгрузить тексты нескольких твитов через скрипт

Примеры запросов агенту

  • Выгрузи статью https://x.com/HiTw93/status/2040047268221608281 в папку ./Clippings
  • Сохрани текст и метрики поста https://x.com/USER/status/ID
  • Скачай твит с картинками и добавь YAML frontmatter

Как установить twitter-reader

1Через Skills CLI (Vercel)

npx skills add daymade/claude-code-skills --skill twitter-reader -a claude-code

2Вручную: положить файлы

~/.claude/skills/twitter-reader/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/twitter-reader/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора64

i18n-expert Настраивает и проверяет локализацию интерфейса: заменяет строки ключами, сверяет локали и форматирование. Нужен при работе с React, Next.js или Vue. CX Codex +1 2 700установок prompt-optimizer Превращает расплывчатый запрос или фичу в проверяемую спецификацию по EARS. Пригодится, когда в задаче нет триггеров и измеримых критериев. CX Codex +1 2 100установок qa-expert Разворачивает в проекте структуру QA: тест-стратегию, тест-кейсы по AAA, трекинг багов P0–P4 и отчёты о прогрессе. CX Codex +1 2 000установок ppt-creator Уведомление об устаревании пакета для создания слайдов. Скилл сообщает о статусе вывода из эксплуатации и не создаёт файлы PPTX. CX Codex +1 2 000установок deep-research Создаёт исследовательские отчёты с привязкой выводов к первоисточникам. Нужен для обзоров литературы, компаний и спорных вопросов с несколькими маршрутами поиска. CX Codex +1 1 800установок macos-cleaner Скилл для ИИ-агента, который находит реальную причину нехватки места на диске Mac и удаляет только согласованное. Пригодится, когда система пишет «Caching needs more space». CX Codex +1 1 800установок ima-copilot Обёртка для официального ima-skill от Tencent: ставит утилиту, настраивает ключи API, чинит битый frontmatter в SKILL.md и ищет по базам знаний. CX Codex +1 1 600установок ui-designer Извлекает дизайн-систему из скриншотов интерфейса и готовит промпт для реализации UI в React. Нужен, когда новый экран должен повторять стиль референсов. CX Codex +1 1 600установок

Другие версии twitter-reader

Похожие

agent-browser vercel-labs Скилл управляет браузером через CLI: открывает страницы, заполняет формы, нажимает кнопки и проверяет веб-приложения. Подходит для задач, где агенту нужно действовать в интерфейсе. CX Codex +1 1 200 000установок webapp-testing официальный anthropics Скилл запускает проверки локальных веб-приложений через Playwright: помогает отлаживать UI, делать скриншоты и смотреть логи браузера. 186 758установок computer-use stablyai Скилл ведёт видимое окно приложения через orca computer: читает дерево доступности, кликает, печатает и снимает скриншоты. Нужен, когда задача упирается в интерфейс. CX Codex +1 239 400установок browser-use browser-use Даёт агенту живой Chrome через CDP: клики, ввод, скриншоты и страницы, которым нужен JS или ваша логин-сессия. CX Codex +1 98 200установок playwright-cli microsoft Скилл, который даёт агенту браузер: открыть страницу, кликнуть по элементу, снять снимок и разобрать тесты Playwright. CX Codex +1 195 700установок last30days mvanhorn Собирает посты и реакции по любой теме за последние 30 дней из Reddit, X, YouTube, TikTok, Hacker News, Polymarket, GitHub и веба. Пригодится, когда нужно понять, что реально говорят люди, а не что пишут в обзорах. CX Codex +1 53 000установок

Рядом в теме «Браузер и парсинг»

Все скиллы по теме «Браузер и парсинг» →

Вопросы о twitter-reader

Как установить twitter-reader в Claude Code?

Выполните команду npx skills add daymade/claude-code-skills --skill twitter-reader -a claude-code. Конфигурация запишется в файл ~/.claude/skills/twitter-reader/SKILL.md.

Что нужно для скачивания статей с иллюстрациями?

Требуется пакетный менеджер uv. Утилита twitter-cli ставится автоматически при первом запуске scripts/fetch_article.py.

Зачем нужен ключ JINA_API_KEY?

Он нужен вспомогательным скриптам fetch_tweet.py и fetch_tweets.sh. Без этого ключа запросы к Jina на чтение постов блокируются при превышении лимитов анонимного доступа.

Исходный текст

SKILL.md · MIT
---
name: twitter-reader
description: >-
  Fetches Twitter/X post and Article content — text, author, engagement metrics and embedded media —
  downloading images locally and generating complete Markdown with image references. Use when
  retrieving a tweet's text or an X Article with images, or pulling post metadata for a Markdown/PKM
  record. Preferred over Jina alone for X Articles with images.
---

# Twitter Reader

Fetch Twitter/X post and article content with full media support.

## Reading a single post's text: fxtwitter first (2026-08-30)

For plain post text, prefer the fxtwitter mirror API — login-free, key-free,
works direct, and returns the **full note_tweet body in `tweet.text`** (the
`full_text` key does not exist; a 2,324-char long-form announcement came back
complete):

```bash
curl -sS --max-time 20 "https://api.fxtwitter.com/<user>/status/<id>" \
  | python3 -c "import json,sys; t=json.load(sys.stdin)['tweet']; print(t['created_at']); print(t['text'])"
```

`replies` is a count, not the reply thread. For X Articles with images, use
`fetch_article.py` below — fxtwitter does not carry article bodies.

## X Articles with images: fetch_article.py

```bash
uv run --with pyyaml python scripts/fetch_article.py <article_url> [output_dir]
```

Example:
```bash
uv run --with pyyaml python scripts/fetch_article.py \
  https://x.com/HiTw93/status/2040047268221608281 \
  ./Clippings
```

This will:
- Fetch structured data via `twitter-cli` (likes, retweets, bookmarks)
- Fetch content with images via `jina.ai` API
- Download all images to `attachments/YYYY-MM-DD-AUTHOR-TITLE/`
- Generate complete Markdown with embedded image references
- Include YAML frontmatter with metadata

Metadata and plain article text come from `twitter-cli`; the image URLs ride in
the markdown Jina's reader returns. When Jina refuses (see the section below),
the script warns on stderr, keeps the twitter-cli text, and reports `Images: 0`.
The Markdown is still correct; it simply has no pictures. `Images: 0` on an
article that visibly contains images is the signature of a Jina refusal.

### Example Output

```
Fetching: https://x.com/HiTw93/status/2040047268221608281
--------------------------------------------------
Getting metadata...
Title: 你不知道的大模型训练:原理、路径与新实践
Author: Tw93
Likes: 1648

Getting content and images...
Images: 15

Downloading 15 images...
  ✓ 01-image.jpg
  ✓ 02-image.jpg
  ...

✓ Saved: ./Clippings/2026-04-03-文章标题.md
✓ Images: ./Clippings/attachments/2026-04-03-HiTw93-.../ (15 downloaded)
```

## Jina's reader is intermittent, and its refusals look like success

Anonymous `r.jina.ai` access to x.com gets blocked for hours at a time when
third-party callers abuse the domain. The block hits every anonymous caller and
then expires on its own. Both states showed up minutes apart on 2026-09-12.

A refusal does not look like a failure. `curl` exits 0 and the body is a JSON
envelope:

```json
{"data":null,"code":403,"name":"AbuseAlleviationError","status":40305,
 "message":"Anonymous access to domain x.com blocked until <date> ..."}
```

A lapsed or unfunded key returns the same shape with `"code":402,
"name":"InsufficientBalanceError"`. `curl --fail` catches neither: this endpoint
answered HTTP 200 with the envelope in the body. The one signal that holds is
the `Markdown Content:` marker that Jina's reader puts in front of the article
body: no marker, no article. `fetch_article.py` tests for that marker before
accepting a response, which keeps a refusal envelope out of the generated
Markdown.

`scripts/fetch_tweets.sh` and `scripts/fetch_tweet.py` both require
`JINA_API_KEY` and have no second source to fall back to, so they stop working
whenever that key lapses. Both check the same marker and fail loudly on a
refusal — the Python one raises without writing the output file, the shell one
reports the URL on stderr and exits non-zero — rather than handing back an
envelope dressed up as a post. No key ships with this repository.

For simple text-only fetching:

```bash
# Single tweet
curl "https://r.jina.ai/https://x.com/USER/status/TWEET_ID" \
  -H "Authorization: Bearer ${JINA_API_KEY}"

# Batch fetching
scripts/fetch_tweets.sh url1 url2 url3
```

## Features

### Full Article Mode (fetch_article.py)
- ✅ Structured metadata (author, date, engagement metrics)
- ✅ Automatic image download (all embedded media)
- ✅ Complete Markdown with local image references
- ✅ YAML frontmatter for PKM systems
- ✅ Handles X Articles (long-form content)

### Simple Mode (Jina API)
- Text-only content
- Intermittent availability (see the section above); both scripts require
  `JINA_API_KEY` and have no fallback
- Usable for quick text extraction while Jina is answering

## Prerequisites

### For Full Article Mode
- `uv` (Python package manager)
- No additional setup (twitter-cli auto-installed)

### For Simple Mode (Jina)
```bash
export JINA_API_KEY="your_api_key_here"
# Get from https://jina.ai/
```

## Output Structure

```
output_dir/
├── YYYY-MM-DD-article-title.md       # Main Markdown file
└── attachments/
    └── YYYY-MM-DD-author-title/
        ├── 01-image.jpg
        ├── 02-image.jpg
        └── ...
```

## What Gets Returned

### Full Article Mode
- **YAML Frontmatter**: source, author, date, likes, retweets, bookmarks
- **Markdown Content**: Full article text with local image references
- **Attachments**: All downloaded images in dedicated folder

### Simple Mode
- **Title**: Post author and content preview
- **URL Source**: Original tweet link
- **Published Time**: GMT timestamp
- **Markdown Content**: Text with remote media URLs

## URL Formats Supported

- `https://x.com/USER/status/ID` (posts)
- `https://x.com/USER/article/ID` (long-form articles)
- `https://twitter.com/USER/status/ID` (legacy)

## Scripts

### fetch_article.py
Full-featured article fetcher with image download:
```bash
uv run --with pyyaml python scripts/fetch_article.py <url> [output_dir]
```

### fetch_tweet.py
Simple text-only fetcher using Jina API:
```bash
python scripts/fetch_tweet.py <tweet_url> [output_file]
```

### fetch_tweets.sh
Batch fetch multiple tweets (Jina API):
```bash
scripts/fetch_tweets.sh <url1> <url2> ...
```

## twitter-cli's 500-item ceiling belongs to the tool, not to X

This skill reads metadata through `twitter-cli`, so the tool's own limits apply.
`twitter bookmarks` and the other timeline commands stop at 500 items however
the config is written. That ceiling is a module constant in the client:
`_ABSOLUTE_MAX_COUNT = 500` in `twitter_cli/client.py`, applied as
`min(maxCount, 500)` when the client is constructed. Both lines read from
version 0.8.5. X's own bookmark timeline goes far deeper than that.

Two consequences are easy to get wrong:

- A run that stops at exactly 500 stopped on its own counter and never reached
  the point of reading the next cursor. "The platform gave no further page" and
  "my loop finished" are different claims, and only the first one is evidence.
  A round number is a reason to look closer, not a boundary.
- `maxCount` has to sit under the `rateLimit:` section of the config. Put it
  under `fetch:` and the client ignores it without any message, falling back to
  200.

Going deeper means calling the GraphQL endpoint directly: the `Bookmarks`
operation with the client's own feature flags, parsed by
`twitter_cli.parser.parse_timeline_response`, paging until the platform stops
returning a cursor or returns the same cursor twice. Stop on the platform's
signal rather than on a count.

## Migration from Jina API

Old workflow:
```bash
curl "https://r.jina.ai/https://x.com/..."
# Manual image extraction and download
```

New workflow:
```bash
uv run --with pyyaml python scripts/fetch_article.py <url>
# Automatic image download, complete Markdown
```

© daymade · MIT · daymade/claude-code-skills

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой