Kimkykie/twitter-image-downloader

GitHub: Kimkykie/twitter-image-downloader

基于 Puppeteer 浏览器自动化的 Twitter/X 时间线图片批量下载工具,支持增量同步与会话持久化。

Stars: 8 | Forks: 4

# Twitter 时间线图片下载器 通过 CLI 从 Twitter/X 个人主页下载图片。专为 OSINT 工作流构建。 Tool Screenshot ## 问题 需要存档 Twitter 个人主页的媒体文件以供研究或备份。手动下载非常繁琐,而且由于 Twitter 的反自动化措施,大多数现有工具经常失效。 ## 解决方案 基于自动化浏览的爬虫,可处理身份验证、无限滚动和批量下载。使用会话持久化来尽量减少登录阻力,并包含智能速率限制以避免被封锁。 ## 快速开始 需要 Node.js 24。如果您使用 `nvm`,请在安装依赖项之前选择固定的 runtime: ``` git clone https://github.com/Kimkykie/twitter-image-downloader.git cd twitter-image-downloader nvm use npm install ``` 设置环境: ``` cp .env.example .env ``` **重要提示**:首次运行时请设置 `PUPPETEER_HEADLESS=false`(用于处理 Twitter CAPTCHA)。 ``` npm start ``` ## 工作原理 1. **身份验证** - 通过 cookie 持久化进行自动登录 2. **时间线解析** - 无限滚动以加载所有媒体帖子 3. **增量下载** - 仅获取自上次运行以来的新推文(通过 SQLite 追踪) 4. **下载队列** - 并行下载并检测重复项 5. **恢复能力** - 从中断处继续未完成的下载 6. **进度追踪** - 实时统计和 CSV 导出 身份验证 cookie 保存在 `cookies.json` 中。删除此文件可强制重新进行身份验证。 ## SQLite 启动故障排除 `better-sqlite3` 包含一个与安装它的 Node.js 主版本号绑定的原生二进制文件。如果自上次安装以来 Node 已升级,请在启动应用程序之前重新构建该 module: ``` nvm use npm rebuild better-sqlite3 ``` 如果重新构建失败,请使用 `npm ci` 重新安装锁定的依赖项。这不会删除 `data/twitter_downloads.db` 或之前下载的图像。 当 SQLite 无法启动时,应用程序会在启动浏览器之前退出,因为增量下载和恢复追踪需要数据库。 ## 登录问题故障排除 如果您在 `onboarding/task.json` 上遇到类似 `"Could not log you in"` 或 `400 Bad Request` 的错误,说明 Twitter 检测到了自动化行为。请改用手动导出 cookie: ### 手动导出 Cookie(推荐) 1. **安装 cookie 导出扩展:** - Chrome:[Cookie-Editor](https://chrome.google.com/webstore/detail/cookie-editor/hlkenndednhfkekhgcdicdfddnkalmdm) - Firefox:[Cookie Quick Manager](https://addons.mozilla.org/en-US/firefox/addon/cookie-quick-manager/) 2. **手动登录 Twitter:** - 打开浏览器并访问 `https://x.com` - 使用您的凭据登录 - 完成任何 CAPTCHA 或验证提示 3. **导出 cookie:** - 在 x.com 上点击 cookie 扩展图标 - 点击“Export”或“Export as JSON” - 复制 JSON 内容 4. **将 cookie 保存到项目中:** # 删除旧的过期 cookie rm cookies.json # 创建新的 cookies.json 并粘贴导出的 JSON nano cookies.json # 或者使用任意文本编辑器 5. **运行工具:** npm start 该工具将使用您的手动会话,无需自动登录。 ### 必要的 Cookie 确保您导出的 cookie 包含: - `auth_token` - 主要身份验证 token - `ct0` - CSRF 保护 token - `twid` - Twitter 用户 ID ### 仍有问题? - 如果受到速率限制,请等待 15-30 分钟 - 尝试更换 IP(VPN) - 先在浏览器中手动登录以清除安全标记 - 检查您的账户是否有任何安全暂停 ## CLI 用法 ``` # 交互模式(提示所有选项) npm start # 从特定账号下载 npm start elonmusk npm start user1 user2 user3 # 控制下载顺序 npm start --newest elonmusk # Download newest tweets first (default) npm start --oldest elonmusk # Download oldest tweets first # 仅检查新推文(遇到已下载的推文时停止) npm start --new-only elonmusk npm start --new-only --stop-after=10 elonmusk # Stop after 10 known tweets # 帮助 npm start --help ``` ## 配置 编辑 `.env`: ``` TWITTER_USERNAME=your_username # Optional - will prompt if missing TWITTER_PASSWORD=your_password # Optional - will prompt if missing PUPPETEER_HEADLESS=false # Keep false until authenticated VIEWPORT_WIDTH=1366 # Browser dimensions VIEWPORT_HEIGHT=768 # 下载行为 DOWNLOAD_ORDER=newest # newest or oldest first # 提前停止 - 遇到已处理的推文时停止 EARLY_STOP_ENABLED=false # Default: scroll entire timeline EARLY_STOP_THRESHOLD=20 # Consecutive known tweets before stopping # 重试设置 MAX_TWEET_RETRIES=3 # Retries for failed tweet pages MAX_IMAGE_RETRIES=3 # Retries for failed image downloads RETRY_BASE_DELAY=2000 # Base delay between retries (ms) ``` ## 项目结构 ``` src/ ├── config/config.js # App configuration ├── db/ # SQLite database layer │ ├── connection.js # Database connection │ ├── migrations.js # Schema migrations │ └── repositories/ # Data access │ ├── accountRepository.js │ ├── tweetRepository.js │ └── imageRepository.js ├── services/ │ ├── authService.js # Login/session handling │ ├── browserService.js # Puppeteer automation │ ├── imageService.js # Download management │ ├── pagePoolManager.js # Parallel browser tabs │ ├── parallelTweetProcessor.js # Concurrent processing │ └── progressTracker.js # Resume capability ├── utils/ │ ├── downloadTracker.js # Progress tracking │ ├── logger.js # Console output │ ├── fileSystem.js # File operations │ ├── errors.js # Custom error types │ └── semaphore.js # Concurrency control └── index.js # CLI entry point data/ └── twitter_downloads.db # SQLite database (auto-created) ``` ## 输出 - **图片**:`./images/{username}/` - **下载日志**:包含元数据和状态的 CSV - **会话数据**:`cookies.json`(自动生成) ## 速率限制 内置节流机制以规避 Twitter 的反机器人措施: - 页面交互之间的请求延迟 - 检测到速率限制时自动退避 - 会话轮换支持 ## 安全提示 - 使用专用的 Twitter 账户进行抓取 - Cookie 包含身份验证 token,请视为凭据妥善保管 - 对于大规模操作,请考虑使用 VPN/代理 ## 路线图 - [x] 增量下载(跳过已处理的推文) - [x] 用于持久状态的 SQLite 追踪 - [x] 恢复中断的下载 - [x] 并行浏览器标签页基础设施 - [ ] 支持 GIF 和 MP4 下载 - [ ] 激活完全并行处理模式 ## 许可证 MIT **免责声明**:请遵守 Twitter 的服务条款和适用法律。此工具仅供研究和存档之用。
标签:GNU通用公共许可证, MITM代理, Node.js, Puppeteer, Twitter, 命令控制, 数据泄露, 数据采集, 自定义脚本