unnohwn/telegram-scraper
GitHub: unnohwn/telegram-scraper
基于Telethon的Telegram频道爬虫,支持消息与媒体抓取、实时监控和数据导出。
Stars: 728 | Forks: 177
# Telegram 频道爬虫 📱
一个功能强大的 Python 脚本,允许你使用 Telethon 库从 Telegram 频道抓取消息和媒体。功能包括实时连续抓取、媒体下载和数据导出。
```
___________________ _________
\__ ___/ _____/ / _____/
| | / \ ___ \_____ \
| | \ \_\ \/ \
|____| \______ /_______ /
\/ \/
```
## v3.1 版本更新内容 🎉
**增强的消息数据:**
- **消息统计** - 抓取每条消息的浏览量、转发次数和 post_author
- **Reactions 支持** - 记录所有 emoji 反应及其计数(例如 "😀 12 👍 3")
- **自动数据库迁移** - 无缝向现有数据库添加新列
- **更丰富的导出** - CSV/JSON 导出中包含所有新增数据
**改进的频道管理:**
- **显示频道名称** - 在所有位置都显示频道名称及其 ID
- **智能过滤** - 列表选项现在仅显示 Channels 和 Groups(不包含私人聊天)
- **channels_list.csv 导出** - 自动保存包含名称、ID、用户名和类型的频道列表
- **“all” 选择** - 快速一次性添加所有列出的频道
- **更好的导出命名** - 文件现在命名为 `ID_username.csv` 和 `ID_username.json`
**错误修复:**
- **修复频道 ID 解析** - 解决了 fix missing media 中的 "invalid literal for int()" 错误
- **更好的实体解析** - 同时处理数字 ID 和频道用户名
- **改进的错误消息** - 显示频道名称和 ID 以便更清晰地调试
## 功能特性 🚀
- **二维码 & 手机号认证** - 选择你偏好的登录方式
- 抓取包含完整元数据的消息(浏览量、转发次数、reactions、发帖者)
- 通过并行处理和唯一命名下载媒体文件
- 实时连续抓取
- 将数据导出为带有增强元数据的 JSON 和 CSV 格式
- SQLite 数据库存储,支持自动 schema 迁移
- 恢复能力(保存进度)
- 带有频道名称和编号选择的交互式菜单
- 智能频道过滤(仅显示频道/群组)
- 带有可视化进度条的进度跟踪
- 自动将频道列表导出为 CSV
## 前置条件 📋
在运行脚本之前,你需要:
- Python 3.7 或更高版本
- Telegram 账户
- Telegram 的 API 凭证
### 所需 Python 包
```
pip install -r requirements.txt
```
## 获取 Telegram API 凭证 🔑
1. 访问 https://my.telegram.org/auth
2. 使用你的手机号码登录
3. 点击 "API development tools"
4. 填写表单:
- App title:你的应用名称
- Short name:你的应用简称
- Platform:可以保留为 "Desktop"
- Description:你的应用简介
5. 点击 "Create application"
6. 你将收到:
- `api_id`:一个数字
- `api_hash`:一串字母和数字
请妥善保管这些凭证,运行脚本时需要用到它们!
## 设置与运行 🔧
1. 克隆仓库:
```
git clone https://github.com/unnohwn/telegram-scraper.git
cd telegram-scraper
```
2. 安装依赖:
```
pip install -r requirements.txt
```
3. 运行脚本:
```
python telegram-scraper.py
```
4. 首次运行时,系统会提示你输入:
- 你的 API ID(来自 my.telegram.org)
- 你的 API Hash(来自 my.telegram.org)
- **选择认证方式:**
- **QR Code**(推荐)- 使用手机扫描(无需手机号)
- **Phone Number** - 传统的短信验证
## 使用说明 📝
脚本提供了一个清晰的交互式菜单:
```
========================================
TELEGRAM SCRAPER
========================================
[S] Scrape channels
[C] Continuous scraping
[M] Media scraping: ON
[L] List & add channels
[R] Remove channels
[E] Export data
[T] Rescrape media
[Q] Quit
========================================
```
### 简便的频道选择 🔢
无需输入长长的频道 ID,只需使用数字:
**添加频道:**
```
[1] Tech News (ID: -1002116176890, Type: Channel, Username: @technews)
[2] Python Dev (ID: -1001597139842, Type: Group, Username: @pythondev)
[3] Daily Updates (ID: -1002274713954, Type: Channel, Username: @dailyupdates)
Enter: 1,3 (adds channels 1 and 3)
Or: all (adds all listed channels)
```
**查看你的频道:**
```
[1] Tech News (ID: -1002116176890), Last Message ID: 5234, Messages: 12450
[2] Python Dev (ID: -1001597139842), Last Message ID: 8192, Messages: 45782
```
**抓取频道:**
- 单个:`1`
- 多个:`1,3,5`
- 所有:`all`
- 混合格式:`1,-1001597139842,3`
## 数据存储 💾
### 数据库结构
数据存储在 SQLite 数据库中,每个频道一个:
- 位置:`./channelname/channelname.db`
- 通过索引优化以实现快速查询
- WAL 模式以获得更好的性能
- Schema 包括:message_id、date、sender info、message text、media info、reply_to、post_author、views、forwards、reactions
- 自动迁移向现有数据库添加新列
### 媒体存储 📁
媒体文件使用唯一命名方式存储:
- 位置:`./channelname/media/`
- 格式:`{message_id}-{unique_id}-{original_name}.ext`
- **不再覆盖文件** - 每个文件都有一个唯一的名称
### 导出的数据 📊
导出格式:
1. **CSV**: `./channelname/channelid_username.csv`
2. **JSON**: `./channelname/channelid_username.json`
3. **频道列表**: `./channels_list.csv`(使用 [L] 选项时自动创建)
所有导出都包含完整的消息元数据:浏览量、转发次数、reactions 和发帖者信息。
## 性能特性 ⚙️
- **5 个并发下载**,以实现更快的媒体处理
- **批量数据库操作**,以获得最佳速度
- 带有**实时反馈**的**进度条**
- **恢复能力** - 从上次中断的地方继续
- 针对大型数据集的**内存高效**导出
## 错误处理 🛠️
- 带有指数退避的自动重试
- 遵守速率限制
- 网络错误恢复
- 中断期间的状态保存
## 限制 ⚠️
- 遵守 Telegram 的速率限制
- 只能访问公共频道或你是成员的频道
- 媒体下载大小限制遵循 Telegram 的规定
## 许可证 📄
本项目根据 MIT 许可证授权 - 详情请参阅 LICENSE 文件。
## 免责声明 ⚖️
此工具仅供教育目的。请务必:
- 尊重 Telegram 的服务条款
- 在抓取前获得必要的许可
- 负责任且合乎道德地使用
- 遵守数据保护法规
标签:BeEF, CSV, DFIR, ESC4, Homebrew安装, JSON, OSINT, Python, SQLite, Telegram, Telethon, URL抓取, WSL, 命令控制, 媒体下载, 数据导出, 数据抓取, 数据采集, 无后门, 消息抓取, 爬虫, 社交媒体监控, 脚本, 逆向工具, 频道管理