sametcn99/instaloader-api
GitHub: sametcn99/instaloader-api
基于 FastAPI 的 Instagram 内容下载 API 服务,将 Instaloader 封装为支持速率限制和自动清理的 Web 接口。
Stars: 0 | Forks: 0
# Instaloader API
一个基于 FastAPI 的 [Instaloader](https://github.com/instaloader/instaloader) 封装工具,用于下载 Instagram 个人主页内容(帖子和头像)并以 ZIP 压缩包形式提供。包含可选的身份验证、简单的速率控制以及临时下载文件的自动清理功能。
## 功能
- 以 ZIP 格式下载主页帖子和头像
- 通过链接/短代码下载单个帖子(如果是一项内容则返回原始文件,如果是轮播内容则返回 ZIP)
- 主页信息查询,包含粉丝数和认证标志
- 导出帖子元数据(文案、标签、点赞、评论、位置)
- 每个请求的临时下载隔离,并带有计划清理功能
- 可配置的帖子数量和请求频率限制
## 环境要求
- Python 3.11+
- `instaloader` 下载前提条件(具有访问 Instagram 的网络权限)
## 快速开始(本地)
```
python -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -e .
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
```
交互式文档位于 `/` (Swagger) 和 `/redoc` (ReDoc)。
## 配置说明
设置环境变量或 `.env` 文件(会自动加载)。主要选项:
| 名称 | 默认值 | 描述 |
|----------------------------|----------------------|-------------------------------------------------|
| `APP_NAME` | Instaloader API | 文档中使用的 API 标题 |
| `APP_VERSION` | 1.0.0 | 版本号 |
| `DEBUG` | false | 启用调试日志和自动重载 |
| `DOWNLOAD_DIR` | /tmp/insta_downloads | 临时下载的基础目录 |
| `MAX_CONCURRENT_DOWNLOADS` | 3 | 为未来的并发控制保留 |
| `DOWNLOAD_TIMEOUT` | 300 | 下载超时前的秒数(服务级别) |
| `INSTAGRAM_USERNAME` | None | 用于登录的 Instagram 用户名 |
| `INSTAGRAM_PASSWORD` | None | 用于登录的 Instagram 密码 |
| `INSTAGRAM_SESSION_FILE` | None | 已保存的 Instaloader session 文件路径 |
| `RATE_LIMIT_REQUESTS` | 10 | 每个周期允许的请求数(按客户端 IP) |
| `RATE_LIMIT_PERIOD` | 60 | 速率限制窗口时间(秒)(按客户端 IP) |
| `AUTO_CLEANUP` | true | 启用临时文件夹的后台清理 |
| `CLEANUP_AFTER_SECONDS` | 300 | 删除临时文件夹前的延迟时间 |
`.env` 示例:
```
DEBUG=true
INSTAGRAM_USERNAME=your_username
INSTAGRAM_PASSWORD=your_password
# 或使用 session 文件代替凭据
INSTAGRAM_SESSION_FILE=/path/to/session
```
## 速率限制
- 限制按每个客户端 IP 强制执行,不在服务器上共享。
- 在反向代理/负载均衡器后,使用 `X-Forwarded-For` 中的第一条记录来识别客户端;否则使用 `request.client.host`。
- 通过 `RATE_LIMIT_REQUESTS` 和 `RATE_LIMIT_PERIOD`(秒)调整限制。
## 使用 Docker 运行
```
docker build -t instaloader-api .
docker run -p 8000:8000 \
-e DEBUG=true \
-e INSTAGRAM_SESSION_FILE=/sessions/sessionfile \
-v $(pwd)/sessions:/sessions \
-v $(pwd)/downloads:/tmp/insta_downloads \
instaloader-api
```
挂载 `/tmp/insta_downloads` 是可选的,但在清理运行前,可以使 ZIP 文件在容器外部保持可访问。
## API Endpoints
Base URL: `http://localhost:8000`
| Method | Path | Description |
| --- | --- | --- |
| GET | `/health` | 健康检查 |
| GET | `/profile/{username}` | 主页信息(公开;私密主页需要登录) |
| GET | `/profile/{username}/posts` | 列出最近的帖子及其元数据和缩略图 |
| GET | `/proxy/thumbnail` | 用于 Instagram CDN 缩略图的后端代理 |
| GET | `/download/all/{username}` | 将头像和帖子作为一个 ZIP 下载 |
| GET | `/download/posts/{username}` | 仅下载帖子 (ZIP) |
| GET | `/download/profile-pic/{username}` | 下载头像或返回 URL |
| GET | `/download/post` | 通过链接/短代码下载单个帖子(文件或 ZIP) |
常用的 query 参数:
- `max_posts` (int, 1-1000):限制帖子数量(在支持的情况下)
- `include_metadata` (bool):为每个帖子保存 `metadata.txt`(默认为 `true`)
- `url_only` (bool):对于头像 endpoint,返回图片 URL 而不是文件
## 使用示例
健康检查:
```
curl http://localhost:8000/health
```
主页信息:
```
curl http://localhost:8000/profile/instagram
```
下载所有内容:
```
curl -L -o instagram.zip \
"http://localhost:8000/download/all/instagram?max_posts=50&include_metadata=true"
```
仅下载帖子:
```
curl -L -o instagram_posts.zip \
"http://localhost:8000/download/posts/instagram?max_posts=25"
```
下载头像文件:
```
curl -L -o profile.jpg \
"http://localhost:8000/download/profile-pic/instagram"
```
仅获取头像 URL:
```
curl "http://localhost:8000/download/profile-pic/instagram?url_only=true"
```
通过链接下载单个帖子(如果是一项媒体则返回文件,如果是多项则返回 ZIP):
```
curl -L -o post.bin \
"http://localhost:8000/download/post?url=https://www.instagram.com/p/POSTCODE/"
```
标签:AV绕过, FastAPI, Instagram, Python, RESTful API, URL抓取, 提示词优化, 数据抓取, 文件下载, 无后门, 请求拦截, 逆向工具