Async Pixiv API wrapper for Python3.14+
Project description
async-pixiv-api ✨
一个面向异步编程的 Pixiv API Python 客户端库,基于 httpx、pydantic 和 pyrate-limiter 构建。
🚧 正在开发中,API 可能随时变动,请勿用于生产环境。
特性
- ✅ 全异步支持 - 基于
asyncio+aiohttp,高并发友好 - ✅ 类型安全 - 完整的类型提示,
pydantic数据模型校验 - ✅ 双 API 支持 - APP API (OAuth Refresh Token) 和 Web API (Cookie)
- ✅ 内置速率限制 - 基于
pyrate-limiter,防止请求过于频繁 - ✅ DNS 绕过 (DoH) - 内置
ByPassResolver,绕过 DNS 劫持 - ✅ 代理支持 - 支持 SOCKS 和 HTTP 代理
- ✅ 环境变量配置 - 基于
pydantic-settings,支持.env文件
安装
使用 pip
# 基础安装
pip install async-pixiv-api
# 启用 speedups 优化(推荐)
pip install "async-pixiv-api[speedups]"
使用 Poetry
poetry add async-pixiv-api
从源码安装
git clone https://github.com/PyreZ/async-pixiv-api.git
cd async-pixiv-api
pip install -e .
快速开始
环境变量配置
APP API 配置(OAuth 认证)
# Pixiv APP API 设置(前缀: pixiv_app_)
pixiv_app_refresh_token=your_refresh_token_here
pixiv_app_proxy=http://127.0.0.1:7890
pixiv_app_bypass=true
pixiv_app_timeout=30
Web API 配置(Cookie 认证)
# Pixiv Web API 设置(前缀: pixiv_web_)
pixiv_web_cookie=your_cookie_string_here
pixiv_web_proxy=http://127.0.0.1:7890
pixiv_web_timeout=30
基础使用示例
import asyncio
from pixiv.app import PixivAPPClient, PixivAPPAPISettings
async def main():
# 方式 1: 从环境变量加载配置
client = PixivAPPClient()
# 方式 2: 代码中直接配置
settings = PixivAPPAPISettings(
refresh_token="your_refresh_token",
bypass=True,
timeout=60.0,
)
client = PixivAPPClient(settings=settings)
# 认证
await client.auth()
# 使用 session 发起请求
response = await client.request_client.get(
"https://app-api.pixiv.net/v1/illust/ranking"
)
data = await response.json()
print(data)
# 关闭会话
await client.request_client.close()
if __name__ == "__main__":
asyncio.run(main())
Web API 使用
from pixiv.web import PixivWebClient, PixivWebAPISettings
async def main():
settings = PixivWebAPISettings(
cookie="your_cookie_string",
)
client = PixivWebClient(settings=settings)
response = await client.request_client.get(
"https://www.pixiv.net/ajax/user/123456/profile"
)
data = await response.json()
print(data)
await client.request_client.close()
Web API 配置(Cookie 认证)
# Pixiv Web API 设置(前缀: pixiv_web_)
pixiv_web_cookie=your_cookie_string_here
pixiv_web_proxy=http://127.0.0.1:7890
pixiv_web_timeout=30
基础使用示例
import asyncio
from pixiv.app import PixivAPPClient
from pixiv.web import PixivWebClient
async def app_api_example():
"""使用 APP API(推荐)- 支持 refresh_token 自动刷新"""
async with PixivAPPClient() as client:
# 链式调用: client.app.user().illusts()
illusts = await client.app.user().illusts()
print(illusts)
async def web_api_example():
"""使用 Web API - 需要手动提供 cookie"""
async with PixivWebClient() as client:
# 链式调用: client.web.user().bookmarks()
bookmarks = await client.web.user().bookmarks()
print(bookmarks)
async def main():
await app_api_example()
await web_api_example()
if __name__ == "__main__":
asyncio.run(main())
链式 API 调用
项目采用链式调用风格设计 API:
# APP API 链式调用
client.app.user().illusts()
client.app.illust().details(illust_id=123456)
client.app.search().illust(word="星空")
# Web API 链式调用
client.web.user().bookmarks(user_id=123456)
client.web.illust().details(illust_id=123456)
配置说明
APP API 环境变量(前缀: pixiv_app_)
| 变量名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
pixiv_app_api_host |
str |
https://app-api.pixiv.net/ |
API 基础地址 |
pixiv_app_proxy |
str |
None |
代理服务器 |
pixiv_app_bypass |
bool |
False |
是否启用 DoH 绕过 |
pixiv_app_timeout |
float |
30.0 |
请求超时时间(秒) |
pixiv_app_refresh_token |
str |
None |
Refresh Token |
Web API 环境变量(前缀: pixiv_web_)
| 变量名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
pixiv_web_api_host |
str |
https://www.pixiv.net/ajax/ |
API 基础地址 |
pixiv_web_proxy |
str |
None |
代理服务器 |
pixiv_web_bypass |
bool |
False |
是否启用 DoH 绕过 |
pixiv_web_timeout |
float |
30.0 |
请求超时时间(秒) |
pixiv_web_cookie |
str |
None |
Cookie 字符串 |
代码中直接配置
from pixiv.app import PixivAPPClient
from pixiv.app.config import PixivAPPAPISettings
# 方式 1: 直接传入设置
settings = PixivAPPAPISettings(
refresh_token="your_token",
bypass=True,
timeout=60.0,
)
client = PixivAPPClient(settings=settings)
# 方式 2: 从环境变量加载
settings = PixivAPPAPISettings() # 自动从环境变量读取
client = PixivAPPClient(settings=settings)
API 参考
客户端类
PixivAPPClient
APP API 客户端,支持 OAuth Refresh Token 认证。
from pixiv.app import PixivAPPClient
client = PixivAPPClient(settings=None) # settings 可选,默认从环境变量加载
PixivWebClient
Web API 客户端,支持 Cookie 认证。
from pixiv.web import PixivWebClient
client = PixivWebClient(settings=None) # settings 可选,默认从环境变量加载
速率限制设置
| 变量名 | 类型 | APP API 默认值 | Web API 默认值 | 说明 |
|---|---|---|---|---|
rate_limit.max_rate |
int |
5 | 9 | 每时间周期最大请求数 |
rate_limit.time_period |
int |
1 秒 | 2 秒 | 时间周期(秒) |
核心组件
ByPassResolver
DNS-over-HTTPS (DoH) 解析器,用于绕过 DNS 劫持。
- 使用 Cloudflare/Google 公共 DoH 端点
- 自动将 Pixiv 相关域名解析到替代域名
- 支持并行查询多个 DoH 端点
from pixiv._utils.net import ByPassResolver
resolver = ByPassResolver()
PixivClientSession
扩展的 aiohttp.ClientSession,内置请求速率限制。
from pixiv._utils.net import PixivRequestClient
from pyrate_limiter import Duration
session = PixivRequestClient(
"https://api.example.com/",
rate_limiter=create_inmemory_limiter(rate_per_duration=10, duration=Duration.SECOND),
)
认证指南
APP API 认证(推荐)
使用 Refresh Token 进行 OAuth 认证:
- 从 Pixiv OAuth 工具 获取 Refresh Token
- 配置环境变量
pixiv_app_refresh_token - 调用
await client.auth()获取访问令牌
from pixiv.app import PixivAPPClient
client = PixivAPPClient()
await client.auth() # 自动获取并存储 access_token
Web API 认证
使用浏览器 Cookie 进行认证:
- 登录 Pixiv 网站
- 从开发者工具复制 Cookie 字符串
- 配置环境变量
pixiv_web_cookie
from pixiv.web import PixivWebClient
client = PixivWebClient()
# 直接使用 session 发起请求
response = await client.request_client.get("https://www.pixiv.net/ajax/user/123456/profile")
⚠️ 安全提示: 永远不要将 Token 或 Cookie 硬编码在代码中!
项目结构
async-pixiv-api/
├── src/
│ └── pixiv/
│ ├── __init__.py # dotenv 加载
│ ├── exceptions.py # 异常类定义(待实现)
│ ├── _abc/ # 抽象基类
│ │ ├── _client.py # PixivClient 抽象类
│ │ └── _config.py # 基础配置模型
│ ├── _utils/ # 工具模块
│ │ ├── net.py # ByPassResolver + PixivClientSession
│ │ └── net.pyi # 类型存根
│ ├── app/ # APP API 模块
│ │ ├── client.py # PixivAPPClient (OAuth)
│ │ └── config.py # PixivAPPAPISettings
│ └── web/ # Web API 模块
│ ├── client.py # PixivWebClient
│ └── config.py # PixivWebAPISettings
├── tests/
│ └── test_limiter.py # 速率限制测试
├── pyproject.toml # 项目配置
├── uv.lock # 依赖锁定
├── main.py # 示例代码
└── README.md # 项目文档
依赖说明
| 依赖 | 版本 | 说明 |
|---|---|---|
aiohttp |
>=3.13.5 | 异步 HTTP 客户端 |
aiohttp-socks |
>=0.11.0 | SOCKS 代理支持 |
pydantic-settings |
>=2.14.0 | 配置管理 |
pydantic |
>=2.13.3 | 数据验证 |
pyrate-limiter |
>=4.1.0 | 速率限制 |
开发指南
开发环境设置
# 克隆仓库
git clone https://github.com/PyreZ/async-pixiv-api.git
cd async-pixiv-api
# 安装依赖
pip install -e .
# 运行测试
python -m tests.test_limiter
贡献指南
欢迎贡献代码!请遵循以下步骤:
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/amazing-feature) - 提交更改 (
git commit -m 'Add some amazing feature') - 推送到分支 (
git push origin feature/amazing-feature) - 开启 Pull Request
路线图
- 核心客户端架构 (PixivClient ABC)
- 双 API 支持 (APP API + Web API)
- DoH 绕过解析器 (ByPassResolver)
- 内置速率限制 (pyrate-limiter)
- 代理支持 (SOCKS + HTTP)
- 完整的异常类体系
- 公开 API 方法封装
- 数据模型 (Pydantic)
- 完整单元测试
- CLI 工具
许可证
本项目采用 MIT License 许可证。
如果这个项目对你有帮助,请给一个 ⭐!
欢迎开启 Issue 讨论!
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file async_pixiv_api-0.0.1a1.tar.gz.
File metadata
- Download URL: async_pixiv_api-0.0.1a1.tar.gz
- Upload date:
- Size: 48.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.10 {"installer":{"name":"uv","version":"0.11.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b9f2a6c907542b9f60ec8d8f8b09c1dd734012d5f68809a779cf1d3d613e1193
|
|
| MD5 |
4db421d504eac2917a9e5e2385d49ba2
|
|
| BLAKE2b-256 |
90604d3d4cccf518a8363828d09a2621c95777d4221c8bc44a568f7ee25874ab
|
File details
Details for the file async_pixiv_api-0.0.1a1-py3-none-any.whl.
File metadata
- Download URL: async_pixiv_api-0.0.1a1-py3-none-any.whl
- Upload date:
- Size: 29.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.10 {"installer":{"name":"uv","version":"0.11.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be0323df0a18a813939d669ba2147b6f45cdb844e32fddc9877c19fb675d7376
|
|
| MD5 |
e8ee3634d0c21ca8857f6f33cf66136d
|
|
| BLAKE2b-256 |
4eae0c9b143286ca84e72a2797bbcaa227f1d8171c4a0b1d7f0a33a3c02dd559
|