| name | telegram-scraper |
| description | Extract TEXT content from Telegram channels (public, private, paywalled). Use this skill when the user wants to scrape Telegram channels, extract chat history, download messages from Telegram, or says "scrape Telegram", "get Telegram content", "extract from t.me". Focus on text extraction - OCR/vision only for browser automation (clicking, searching). |
| license | Complete terms in LICENSE.txt |
Telegram Channel Scraper
Extract TEXT content from Telegram channels (public, private, paywalled).
Important: Always extract text via DOM/JSON. OCR/vision is ONLY for browser automation (clicking buttons, entering search queries), never for content extraction.
Channel Types
| Type | Method | Requirements |
|---|
| Public | Web fetch / Playwright | Available fetch tool or npx playwright-cli |
| Private/Closed | Playwright headed + user login | User logs in once, session persists |
| Any | Desktop Export + Script | Telegram Desktop, then run script |
Web Fetch (Simplest - Try First)
Before Playwright, try available web fetch tools (order: free → paid):
curl -X POST "http://localhost:8000/search" \
-H "Content-Type: application/json" \
-d '{"query": "site:t.me/s/CHANNEL_NAME", "max_results": 1, "include_raw_content": true}'
tvly extract "https://t.me/s/CHANNEL_NAME" --format markdown
curl "https://t.me/s/CHANNEL_NAME"
Comparison:
| Tool | Cost | Limits | JS Rendering |
|---|
| searxng-extract | Free | 2500 chars/page | No |
| tavily-extract | Paid | API limits | Yes (--extract-depth advanced) |
| webfetch | Varies | Varies | Varies |
Limitations: Telegram may block/rate-limit direct fetch requests. If blocked or garbled output, escalate to Playwright.
OCR/Vision Usage
Only for browser automation:
- Clicking buttons (login, search, navigate)
- Entering text in search fields
- Finding elements by visual reference
Never for content extraction:
- Message text → Use DOM selectors
- Message metadata → Use DOM selectors
- Export data → Use JSON parsing
Method 1: Public Channels (Playwright Preview)
For public channels, use the preview URL (no login needed):
npx playwright-cli open "https://t.me/s/CHANNEL_NAME"
npx playwright-cli eval "document.querySelectorAll('.tgme_widget_message_text').length"
npx playwright-cli eval "document.querySelector('.tgme_widget_message_text').innerText"
npx playwright-cli eval "Array.from(document.querySelectorAll('.tgme_widget_message_text')).slice(0,5).map(el => el.innerText).join('\\n---\\n')"
URL Pattern:
- Preview:
https://t.me/s/CHANNEL_NAME (public, no login)
- Full:
https://t.me/CHANNEL_NAME (may require login)
DOM Selectors:
.tgme_widget_message_text
.tgme_widget_message
.tgme_widget_message_views
.time
Method 2: Private/Closed Channels (Playwright Headed + Login)
For private/closed channels, start a headed browser session and ask user to log in:
npx playwright-cli open "https://web.telegram.org/" --headed
npx playwright-cli snapshot
npx playwright-cli click eREF
npx playwright-cli type "CHANNEL_NAME"
npx playwright-cli click eREF
npx playwright-cli eval "document.querySelectorAll('.message').length"
npx playwright-cli go-back
Key Points:
- User logs in ONCE - session persists
- Browser stays open - no need to re-login
- Use DOM for text extraction - never OCR
- Use OCR/vision only for clicking buttons/inputs
DOM Selectors for Telegram Web:
.message
.text-content
.chat-list-item
.time
Method 3: Telegram Desktop Export (Any Channel)
For any channel, export via Telegram Desktop:
Steps:
- Open Telegram Desktop
- Settings → Advanced → Export Telegram data
- Select channel/chat to export
- Choose format: JSON (preferred for text extraction)
- Select: messages (skip media for speed)
- Export to directory
Output:
ChatExport_YYYY-MM-DD/
├── result.json # All messages in JSON
├── video_files/ # Downloaded videos
├── stickers/ # Sticker files
└── files/ # Other files
Process exports:
python scripts/extract_all_chats.py
Script: extract_all_chats.py
Location: scripts/extract_all_chats.py
Purpose: Parse Telegram Desktop JSON exports into markdown.
Usage:
python scripts/extract_all_chats.py
What it does:
- Scans export directories for
result.json files
- Extracts: message text, sender, date, media type, forwarded info
- Handles corrupted JSON with partial parsing
- Outputs:
CHANNEL_NAME_full.md files
Output Location
Save extracted content to:
D:/Documents/cmw-rag-channel-extractions/CHANNEL_NAME.md
Workflow Summary
Extract text from channel?
→ Try available web fetch tools (tavily-extract, webfetch, curl)
→ Failed or blocked? → Method 1: Playwright preview
→ Private/closed? → Method 2: Playwright headed + user login
→ Have Desktop export? → Method 3: Run extract_all_chats.py
Escalation order:
- Web fetch - Use available tools (tavily-extract, webfetch, HTTP clients)
- Playwright headless - For public channels when web fetch fails/blocking
- Playwright headed - For private channels, user logs in once
- Desktop export - When all else fails or for complete history
See Also