Pixiv API for Python (with 6.x AppAPI supported)
Project description
PixivPy
Due to #158 reason, password login no longer exist. Please use
api.auth(refresh_token=REFRESH_TOKEN)
insteadTo get
refresh_token
, see @ZipFile Pixiv OAuth Flow or OAuth with Selenium/ChromeDriver
Pixiv API for Python (with Auth supported)
- [2021/03/02] Add user
follow/unfollow
, addnovel
API, see !161 (thanks @y-young, @invobzvr) - [2020/10/17] Use cloudscraper to bypass Cloudflare, fixed issue #140 (thanks @lllusion3469)
- [2020/07/19] Add date specification for
search_illust()
(thanks Xdynix) - [2020/06/06] Add
AppPixivAPI().search_novel()
for novel search - [2019/09/23] 增加大陆地区AppAPI的免翻墙访问支持, release v3.5 (See example_bypass_sni.py, thanks @Notsfsssf)
- [2019/09/03] Support new auth() check
X-Client-Time/X-Client-Hash
(thanks DaRealFreak, #83) - [2019/04/27] Support hosts proxy for AppAPI, which can use behind the Great Wall (See example_api_proxy.py)
- [2017/04/18] Fix encoder BUG for
illust_bookmark_add()/illust_bookmark_delete()
params (thanks naplings) - [2017/01/05] Add
PixivAPI().works()
liked APIillust_detail()
for App-API (thanks Mapaler), release v3.3 - [2016/12/17] Fixed encoding BUG for Public-API, see #26 (thanks Xdynix)
- [2016/07/27] Now
AppPixivAPI()
can call without auth (thanks zzycami), check demo.py - [2016/07/20] New App-API (Experimental) for
PixivIOSApp/6.0.9
- [2016/07/11] Add new iOS 6.x API reference to Wiki
- [2015/12/02] Add write API for favorite an user / illust, release v3.1
- [2015/08/11] Remove SPAI and release v3.0 (pixivpy3) (Public-API with Search API)
- [2015/05/16] As Pixiv deprecated SAPI in recent days, push new Public-API ranking_all
- [2014/10/07] New framework, SAPI / Public-API supported (requests needed)
Use pip for installing:
pip install pixivpy --upgrade
Requirements: requests
Mikubill/PixivPy-Async: Async Pixiv API for Python 3
性能对比(需要高性能访问场景,可以参考这个脚本)
@Mikubill: 简单进行了一下并发测试。(撞了N次Rate Limit...)
sg -> Singapore, jp -> Japan, unit -> second
Method | Sync(10,sg) | Async(10,sg) | Sync(200,sg) | Async(200,sg) |
---|---|---|---|---|
illust_detail | 1.1209 | 0.8641 | 31.7041 | 2.4580 |
illust_ranking | 1.0697 | 0.7936 | 28.4539 | 2.0693 |
user_illusts | 0.8824 | 0.7505 | 28.3981 | 1.8199 |
user_detail | 0.9628 | 0.7550 | 28.3055 | 1.7738 |
ugoira_metadata | 0.8509 | 0.7459 | 29.5566 | 2.2331 |
works | 1.1204 | 0.8912 | 32.2068 | 2.8513 |
me_following_works | 1.1253 | 0.7845 | 39.3142 | 2.2785 |
ranking | 1.0946 | 0.7944 | 39.6509 | 2.6548 |
latest_works | 1.0483 | 0.8667 | 36.1992 | 2.5066 |
Method | Sync(500,jp) | Async(500,jp) |
---|---|---|
illust_detail | 6.2178 | 0.6400 |
illust_ranking | 6.4046 | 0.6119 |
user_illusts | 7.6093 | 1.5266 |
user_detail | 6.6759 | 0.5952 |
ugoira_metadata | 6.5155 | 0.7577 |
works | 13.3074 | 0.8619 |
me_following_works | 24.2693 | 2.0835 |
ranking | 21.4119 | 3.2805 |
latest_works | 17.3502 | 2.7029 |
Projects base on pixivpy
- Xdynix/PixivPixie: User-friendly Pixiv API based on PixivPy
- Mikubill/PixivPy-Async: Async Pixiv API for Python 3
Example:
from pixivpy3 import *
api = AppPixivAPI()
# api.login("username", "password") # Not required
# get origin url
json_result = api.illust_detail(59580629)
illust = json_result.illust
print(">>> origin url: %s" % illust.image_urls['large'])
# get ranking: 1-30
# mode: [day, week, month, day_male, day_female, week_original, week_rookie, day_manga]
json_result = api.illust_ranking('day')
for illust in json_result.illusts:
print(" p1 [%s] %s" % (illust.title, illust.image_urls.medium))
# next page: 31-60
next_qs = api.parse_qs(json_result.next_url)
json_result = api.illust_ranking(**next_qs)
for illust in json_result.illusts:
print(" p2 [%s] %s" % (illust.title, illust.image_urls.medium))
Sniffer - App API
Sniffer - Public API
Using API proxy behind the Great Wall See detail in Issue#73
- Upgrade pixivpy >= v3.2.0:
pip install pixivpy --upgrade
- Call
api.download()
like the below:
aapi = AppPixivAPI()
json_result = aapi.illust_ranking()
for illust in json_result.illusts[:3]:
aapi.download(illust.image_urls.large)
Migrate pixivpy2 to pixivpy3
- Replace
api.papi.*
toapi.*
- Change deprecated SPAI call to Public-API call
print(">>> new ranking_all(mode='daily', page=1, per_page=50)")
#rank_list = api.sapi.ranking("all", 'day', 1)
rank_list = api.ranking_all('daily', 1, 50)
print(rank_list)
# more fields about response: https://github.com/upbit/pixivpy/wiki/sniffer
ranking = rank_list.response[0]
for img in ranking.works:
#print img.work
print("[%s/%s(id=%s)] %s" % (img.work.user.name, img.work.title, img.work.id, img.work.image_urls.px_480mw))
About
If you have any questions, please feel free to contact me: rmusique@gmail.com
Find Pixiv API in Objective-C? You might also like PixivAPI_iOS
API functions
App-API (6.0 - app-api.pixiv.net)
class AppPixivAPI(BasePixivAPI):
# 返回翻页用参数
def parse_qs(self, next_url):
# 用户详情
def user_detail(self, user_id):
# 用户作品列表
def user_illusts(self, user_id, type='illust'):
# 用户收藏作品列表
def user_bookmarks_illust(self, user_id, restrict='public'):
# 关注用户的新作
# restrict: [public, private]
def illust_follow(self, restrict='public'):
# 作品详情 (无需登录,同PAPI.works)
def illust_detail(self, illust_id):
# 相关作品列表
def illust_related(self, illust_id):
# 插画推荐 (Home - Main)
# content_type: [illust, manga]
def illust_recommended(self, content_type='illust'):
# 作品排行
# mode: [day, week, month, day_male, day_female, week_original, week_rookie, day_manga]
# date: '2016-08-01'
# mode(r18榜单需登录): [day_r18, day_male_r18, day_female_r18, week_r18, week_r18g]
def illust_ranking(self, mode='day', date=None, offset=None):
# 趋势标签 (Search - tags)
def trending_tags_illust(self):
# 搜索 (Search)
# search_target - 搜索类型
# partial_match_for_tags - 标签部分一致
# exact_match_for_tags - 标签完全一致
# title_and_caption - 标题说明文
# sort: [date_desc, date_asc, popular_desc] - popular_desc为会员的热门排序
# duration: [within_last_day, within_last_week, within_last_month]
# start_date, end_date: '2020-07-01'
def search_illust(self, word, search_target='partial_match_for_tags', sort='date_desc', duration=None):
# 搜索小说 (Search Novel)
# search_target - 搜索类型
# partial_match_for_tags - 标签部分一致
# exact_match_for_tags - 标签完全一致
# text - 正文
# keyword - 关键词
# sort: [date_desc, date_asc]
# start_date/end_date: 2020-06-01 (最长1年)
def search_novel(self, word, search_target='partial_match_for_tags', sort='date_desc', start_date=None, end_date=None):
# 用户搜索
def search_user(self, word, sort='date_desc', duration=None):
# 作品收藏详情
def illust_bookmark_detail(self, illust_id):
# 新增收藏
def illust_bookmark_add(self, illust_id, restrict='public', tags=None):
# 删除收藏
def illust_bookmark_delete(self, illust_id):
# 关注用户
def user_follow_add(self, user_id, restrict='public'):
# 取消关注用户
def user_follow_delete(self, user_id):
# 用户收藏标签列表
def user_bookmark_tags_illust(self, restrict='public', offset=None):
# Following用户列表
def user_following(self, user_id, restrict='public', offset=None):
# Followers用户列表
def user_follower(self, user_id, filter='for_ios', offset=None):
# 好P友
def user_mypixiv(self, user_id, offset=None):
# 黑名单用户
def user_list(self, user_id, filter='for_ios', offset=None):
# 获取ugoira信息
def ugoira_metadata(self, illust_id):
aapi = AppPixivAPI()
# 作品推荐
json_result = aapi.illust_recommended()
print(json_result)
illust = json_result.illusts[0]
print(">>> %s, origin url: %s" % (illust.title, illust.image_urls['large']))
# 作品相关推荐
json_result = aapi.illust_related(57065990)
print(json_result)
illust = json_result.illusts[0]
print(">>> %s, origin url: %s" % (illust.title, illust.image_urls['large']))
# 作品相关推荐-下一页 (.parse_qs(next_url) 用法)
next_qs = aapi.parse_qs(json_result.next_url)
json_result = aapi.illust_related(**next_qs)
print(json_result)
illust = json_result.illusts[0]
print(">>> %s, origin url: %s" % (illust.title, illust.image_urls['large']))
# 用户详情
json_result = aapi.user_detail(660788)
print(json_result)
user = json_result.user
print("%s(@%s) region=%s" % (user.name, user.account, json_result.profile.region))
# 用户作品列表
json_result = aapi.user_illusts(660788)
print(json_result)
illust = json_result.illusts[0]
print(">>> %s, origin url: %s" % (illust.title, illust.image_urls['large']))
# 用户收藏列表
json_result = aapi.user_bookmarks_illust(2088434)
print(json_result)
illust = json_result.illusts[0]
print(">>> %s, origin url: %s" % (illust.title, illust.image_urls['large']))
# 2016-07-15 日的过去一周排行
json_result = aapi.illust_ranking('week', date='2016-07-15')
print(json_result)
illust = json_result.illusts[0]
print(">>> %s, origin url: %s" % (illust.title, illust.image_urls['large']))
# 关注用户的新作 (需要login)
json_result = aapi.illust_follow(req_auth=True)
print(json_result)
illust = json_result.illusts[0]
print(">>> %s, origin url: %s" % (illust.title, illust.image_urls['large']))
# 标签 "水着" 搜索
json_result = aapi.search_illust('水着', search_target='partial_match_for_tags')
print(json_result)
illust = json_result.illusts[0]
print(">>> %s, origin url: %s" % (illust.title, illust.image_urls['large']))
# 用户 "gomzi" 搜索
json_result = aapi.search_user("gomzi")
print(json_result)
illust = json_result.user_previews[0].illusts[0]
print(">>> %s, origin url: %s" % (illust.title, illust.image_urls['large']))
Public-API
PAPI.*
class PixivAPI(BasePixivAPI):
# 作品详细
def works(self, illust_id):
# 用户资料
def users(self, author_id):
# 我的订阅
def me_feeds(self, show_r18=1):
# 获取收藏夹
def me_favorite_works(self,page=1,per_page=50,image_sizes=['px_128x128', 'px_480mw', 'large']):
# 添加收藏
# publicity: public, private
def me_favorite_works_add(self, work_id, publicity='public'):
# 删除收藏
def me_favorite_works_delete(self, ids):
# 关注用户
# publicity: public, private
def me_favorite_users_follow(self, user_id, publicity='public'):
# 用户作品
# publicity: public, private
def users_works(self, author_id, page=1, per_page=30, publicity='public'):
# 用户收藏
# publicity: public, private
def users_favorite_works(self, author_id, page=1, per_page=30, publicity='public'):
# 排行榜/过去排行榜
# mode:
# daily - 每日
# weekly - 每周
# monthly - 每月
# male - 男性热门
# female - 女性热门
# original - 原创
# rookie - Rookie
# daily_r18 - R18每日
# weekly_r18 - R18每周
# male_r18
# female_r18
# r18g
# page: 1-n
# date: '2015-04-01' (仅过去排行榜)
def ranking_all(self, mode='daily', page=1, per_page=50, date=None):
# 搜索
# query: 搜索的文字
# page: 1-n
# mode:
# text - 标题/描述
# tag - 非精确标签
# exact_tag - 精确标签
# caption - 描述
# period (only applies to asc order):
# all - 所有
# day - 一天之内
# week - 一周之内
# month - 一月之内
# order:
# desc - 新顺序
# asc - 旧顺序
def search_works(self, query, page=1, per_page=30, mode='text',
period='all', order='desc', sort='date'):
# 作品详细 PAPI.works
json_result = api.works(46363414)
print(json_result)
illust = json_result.response[0]
print( ">>> %s, origin url: %s" % (illust.caption, illust.image_urls['large']))
# 用户资料 PAPI.users
json_result = api.users(1184799)
print(json_result)
user = json_result.response[0]
print(user.profile.introduction)
# 我的订阅 PAPI.me_feeds
json_result = api.me_feeds(show_r18=0)
print(json_result)
ref_work = json_result.response[0].ref_work
print(ref_work.title)
# 我的收藏列表(private) PAPI.me_favorite_works
json_result = api.me_favorite_works(publicity='private')
print(json_result)
illust = json_result.response[0].work
print("[%s] %s: %s" % (illust.user.name, illust.title, illust.image_urls.px_480mw))
# 关注的新作品[New -> Follow] PAPI.me_following_works
json_result = api.me_following_works()
print(json_result)
illust = json_result.response[0]
print(">>> %s, origin url: %s" % (illust.caption, illust.image_urls['large']))
# 我关注的用户 PAPI.me_following
json_result = api.me_following()
print(json_result)
user = json_result.response[0]
print(user.name)
# 用户作品 PAPI.users_works
json_result = api.users_works(1184799)
print(json_result)
illust = json_result.response[0]
print(">>> %s, origin url: %s" % (illust.caption, illust.image_urls['large']))
# 用户收藏 PAPI.users_favorite_works
json_result = api.users_favorite_works(1184799)
print(json_result)
illust = json_result.response[0].work
print(">>> %s origin url: %s" % (illust.caption, illust.image_urls['large']))
# 获取收藏夹 PAPI.me_favorite_works
json_result = api.me_favorite_works()
print(json_result)
ids = json_result.response[0].id
# 添加收藏 PAPI.me_favorite_works_add
json_result = api.me_favorite_works_add(46363414)
print(json_result)
# 删除收藏 PAPI.me_favorite_works_delete
json_result = api.me_favorite_works_delete(ids)
print(json_result)
# 关注用户 PAPI.me_favorite_users_follow
json_result = api.me_favorite_users_follow(1184799)
print(json_result)
# 排行榜 PAPI.ranking(illust)
json_result = api.ranking('illust', 'weekly', 1)
print(json_result)
illust = json_result.response[0].works[0].work
print(">>> %s origin url: %s" % (illust.title, illust.image_urls['large']))
# 过去排行榜 PAPI.ranking(all, 2015-05-01)
json_result = api.ranking(ranking_type='all', mode='daily', page=1, date='2015-05-01')
print(json_result)
illust = json_result.response[0].works[0].work
print(">>> %s origin url: %s" % (illust.title, illust.image_urls['large']))
# 标题(text)/标签(exact_tag)搜索 PAPI.search_works
#json_result = api.search_works("五航戦 姉妹", page=1, mode='text')
json_result = api.search_works("水遊び", page=1, mode='exact_tag')
print(json_result)
illust = json_result.response[0]
print(">>> %s origin url: %s" % (illust.title, illust.image_urls['large']))
# 最新作品列表[New -> Everyone] PAPI.latest_works
json_result = api.latest_works()
print(json_result)
illust = json_result.response[0]
print(">>> %s url: %s" % (illust.title, illust.image_urls.px_480mw))
Make a release
Bump version in
pixivpy3/__init__.py
, rebuild dist/*
python3 setup.py sdist bdist_wheel
python2 setup.py bdist_wheel
twine upload dist/*
License
Feel free to use, reuse and abuse the code in this project.
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 Distributions
File details
Details for the file PixivPy-3.5.11.tar.gz
.
File metadata
- Download URL: PixivPy-3.5.11.tar.gz
- Upload date:
- Size: 15.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/46.0.0.post20200309 requests-toolbelt/0.9.1 tqdm/4.42.1 CPython/3.7.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e3df51ce5c2c49ef4838e95d75d259f7e77567820117e63c4972e98bf22c5394 |
|
MD5 | ca5dc1478f705133d2be302f424e4ec1 |
|
BLAKE2b-256 | 401b579454763d6b70f9955a9545aad8e9813bd67bb2da1a4e4d9acba839dcf1 |
File details
Details for the file PixivPy-3.5.11-py3-none-any.whl
.
File metadata
- Download URL: PixivPy-3.5.11-py3-none-any.whl
- Upload date:
- Size: 17.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/46.0.0.post20200309 requests-toolbelt/0.9.1 tqdm/4.42.1 CPython/3.7.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a7b1e322625d1d8b4eff0a1554208284e267819c03663f59a85f3a067643c053 |
|
MD5 | 02aa3be788bac44ea7db11ae2973e391 |
|
BLAKE2b-256 | c76f3054e4e2a544095de204d4f2bb60bb7d640461f570e1af2f23a469d328cc |
File details
Details for the file PixivPy-3.5.11-py2-none-any.whl
.
File metadata
- Download URL: PixivPy-3.5.11-py2-none-any.whl
- Upload date:
- Size: 17.6 kB
- Tags: Python 2
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.22.0 setuptools/46.0.0.post20200309 requests-toolbelt/0.9.1 tqdm/4.42.1 CPython/3.7.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | c9f9a3507c9fe07e3190050da9173ca4041dd878e7fbed6d902cfb75c4cbe2e0 |
|
MD5 | 5e1ed6a8710ffa9cf66863410ef2c0c7 |
|
BLAKE2b-256 | 50e959d03b98f15e18a0cc3d6798dcc704a6323bbae5edc281723770a4adf95e |