{"id":13622846,"url":"https://github.com/upbit/pixivpy","last_synced_at":"2025-05-13T18:09:33.194Z","repository":{"id":37385066,"uuid":"10865487","full_name":"upbit/pixivpy","owner":"upbit","description":"Pixiv API for Python","archived":false,"fork":false,"pushed_at":"2025-04-11T11:49:47.000Z","size":714,"stargazers_count":1876,"open_issues_count":47,"forks_count":148,"subscribers_count":39,"default_branch":"master","last_synced_at":"2025-04-25T17:59:10.133Z","etag":null,"topics":["pixiv","pixiv-api","pypi"],"latest_commit_sha":null,"homepage":"https://pypi.org/project/PixivPy3/#files","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/upbit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2013-06-22T13:26:50.000Z","updated_at":"2025-04-22T10:57:54.000Z","dependencies_parsed_at":"2023-10-02T12:39:34.858Z","dependency_job_id":"4b4bcbfa-a2b8-4ede-ace7-f7a4b36b4ea6","html_url":"https://github.com/upbit/pixivpy","commit_stats":{"total_commits":277,"total_committers":36,"mean_commits":7.694444444444445,"dds":0.5018050541516246,"last_synced_commit":"b06c06ff9138d589f7c9e3ff4242723587418c41"},"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/upbit%2Fpixivpy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/upbit%2Fpixivpy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/upbit%2Fpixivpy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/upbit%2Fpixivpy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/upbit","download_url":"https://codeload.github.com/upbit/pixivpy/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254000851,"owners_count":21997441,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["pixiv","pixiv-api","pypi"],"created_at":"2024-08-01T21:01:24.909Z","updated_at":"2025-05-13T18:09:33.172Z","avatar_url":"https://github.com/upbit.png","language":"Python","funding_links":[],"categories":["Python","Data Sources"],"sub_categories":[],"readme":"# PixivPy3 ![Build Status](https://github.com/upbit/pixivpy/workflows/pixivpy/badge.svg?branch=master) [![PyPI version](https://badge.fury.io/py/PixivPy3.svg)](https://badge.fury.io/py/PixivPy3)\n\n\u003e Due to [#158](https://github.com/upbit/pixivpy/issues/158) reason, password\n\u003e login no longer exist. Please use `api.auth(refresh_token=REFRESH_TOKEN)`\n\u003e instead.\n\u003e\n\u003e To get `refresh_token`, see\n\u003e [@ZipFile Pixiv OAuth Flow](https://gist.github.com/ZipFile/c9ebedb224406f4f11845ab700124362)\n\u003e / [gppt: get-pixivpy-token](https://github.com/eggplants/get-pixivpy-token)\n\u003e (Easy to use 👍 base on selenium) /\n\u003e [OAuth with Selenium/ChromeDriver](https://gist.github.com/upbit/6edda27cb1644e94183291109b8a5fde)\n\n_Pixiv API for Python (with Auth supported)_\n\n- [2025/02/09] Add `pydantic` models for App-API (thanks\n  [@Danipulok](https://github.com/Danipulok))\n- [2024/03/03] _v3.7.5_ Fix `novel_text()` BUG, add `webview_novel()`, see\n  [#337](https://github.com/upbit/pixivpy/issues/337) (thanks\n  [@xiyihan](https://github.com/xiyihan0))\n- [2023/09/18] _v3.7.3_ Add `novel_follow()`, fix ByPassSniApi() host BUG, see\n  [#279](https://github.com/upbit/pixivpy/issues/279) (thanks\n  [@Solomon](https://github.com/Solomon-Edwards),\n  [@rhyryy](https://github.com/rhyryy))\n- [2023/09/17] Move to new PEP 517 standard with poetry, and upgrade deps, see\n  [#270](https://github.com/upbit/pixivpy/pull/270) (thanks\n  [@Nachtalb](https://github.com/Nachtalb))\n- [2022/02/04] Remove Public-API support as it's deprecated by Pixiv, see\n  [#201](https://github.com/upbit/pixivpy/commit/74e114e1cfe51e6c0e8c30c2024bcfcf0bae7ccc)\n- [2021/11/23] Add `illust_new` for get latest works, see\n  [#189](https://github.com/upbit/pixivpy/commit/024d4e7212582ca6f31ef5592b4b5b46cb351cbc)\n- [2021/03/02] Add user `follow/unfollow`, add `novel` API, see\n  [#161](https://github.com/upbit/pixivpy/pull/161/files) (thanks\n  [@y-young](https://github.com/y-young),\n  [@invobzvr](https://github.com/invobzvr))\n- [2020/10/17] Use [cloudscraper](https://github.com/VeNoMouS/cloudscraper) to\n  bypass Cloudflare, fixed issue #140 (thanks\n  [@lllusion3469](https://github.com/lllusion3469))\n- [2020/07/19] Add date specification for `search_illust()` (thanks\n  [Xdynix](https://github.com/Xdynix))\n- [2020/06/06] Add `AppPixivAPI().search_novel()` for novel search\n- [2019/09/23] 增加大陆地区 AppAPI 的免翻墙访问支持, release v3.5 (See\n  [example_bypass_sni.py](https://github.com/upbit/pixivpy/blob/master/example_bypass_sni.py),\n  thanks [@Notsfsssf](https://github.com/Notsfsssf))\n- [2019/09/03] Support new auth() check `X-Client-Time/X-Client-Hash` (thanks\n  [DaRealFreak](https://github.com/DaRealFreak),\n  [#83](https://github.com/upbit/pixivpy/issues/83))\n- [2019/04/27] Support hosts proxy for AppAPI, which can use behind the Great\n  Wall (See\n  [example_api_proxy.py](https://github.com/upbit/pixivpy/blob/master/example_api_proxy.py))\n- [2017/04/18] Fix encoder BUG for\n  `illust_bookmark_add()/illust_bookmark_delete()` params (thanks\n  [naplings](https://github.com/naplings))\n- [2017/01/05] Add `PixivAPI().works()` liked API `illust_detail()` for App-API\n  (thanks [Mapaler](https://github.com/Mapaler)), release v3.3\n- [2016/12/17] Fixed encoding BUG for Public-API, see #26 (thanks\n  [Xdynix](https://github.com/Xdynix))\n- [2016/07/27] Now `AppPixivAPI()` can call **without auth** (thanks\n  [zzycami](https://github.com/zzycami)), check\n  [demo.py](https://github.com/upbit/pixivpy/blob/b83578e066ddcba86295676d931ff3313d138b22/demo.py#L268)\n- [2016/07/20] New **App-API** (Experimental) for `PixivIOSApp/6.0.9`\n- [2016/07/11] Add new\n  [iOS 6.x API](https://github.com/upbit/pixivpy/wiki#6x-api) reference to Wiki\n- [2015/12/02] Add write API for favorite an user / illust, release v3.1\n- [2015/08/11] Remove SPAI and release v3.0 (pixivpy3) (Public-API with Search\n  API)\n- [2015/05/16] As Pixiv **deprecated** SAPI in recent days, push new Public-API\n  **ranking_all**\n- [2014/10/07] New framework, **SAPI / Public-API** supported (requests needed)\n\nUse pip for installing:\n\n```bash\n# for Python3\npip install pixivpy3 --upgrade\n\n# for Python2\npip install pixivpy --upgrade\n```\n\nRequirements: [requests](https://pypi.python.org/pypi/requests)\n\n### [Mikubill/PixivPy-Async](https://github.com/Mikubill/pixivpy-async): Async Pixiv API for Python 3\n\n\u003e 性能对比（需要高性能访问场景,可以参\n\u003e 考[这个脚本](https://github.com/Mikubill/pixivpy-async/blob/master/Perf.py)）\n\n\u003e Warning: The rate limit was hit multiple times during the test, so the result\n\u003e may not be informative. Script:\n\u003e https://github.com/Mikubill/pixivpy-async/blob/master/Perf.py\n\n`sg -\u003e Singapore, jp -\u003e Japan, unit -\u003e second`\n\n| Method             | Sync(10,sg) | Async(10,sg) | Sync(200,sg) | Async(200,sg) |\n| ------------------ | ----------- | ------------ | ------------ | ------------- |\n| illust_detail      | 1.1209      | 0.8641       | 31.7041      | 2.4580        |\n| illust_ranking     | 1.0697      | 0.7936       | 28.4539      | 2.0693        |\n| user_illusts       | 0.8824      | 0.7505       | 28.3981      | 1.8199        |\n| user_detail        | 0.9628      | 0.7550       | 28.3055      | 1.7738        |\n| ugoira_metadata    | 0.8509      | 0.7459       | 29.5566      | 2.2331        |\n| works              | 1.1204      | 0.8912       | 32.2068      | 2.8513        |\n| me_following_works | 1.1253      | 0.7845       | 39.3142      | 2.2785        |\n| ranking            | 1.0946      | 0.7944       | 39.6509      | 2.6548        |\n| latest_works       | 1.0483      | 0.8667       | 36.1992      | 2.5066        |\n\n| Method             | Sync(500,jp) | Async(500,jp) |\n| ------------------ | ------------ | ------------- |\n| illust_detail      | 6.2178       | 0.6400        |\n| illust_ranking     | 6.4046       | 0.6119        |\n| user_illusts       | 7.6093       | 1.5266        |\n| user_detail        | 6.6759       | 0.5952        |\n| ugoira_metadata    | 6.5155       | 0.7577        |\n| works              | 13.3074      | 0.8619        |\n| me_following_works | 24.2693      | 2.0835        |\n| ranking            | 21.4119      | 3.2805        |\n| latest_works       | 17.3502      | 2.7029        |\n\n### Projects base on pixivpy\n\n1. [Mikubill/PixivPy-Async](https://github.com/Mikubill/pixivpy-async): Async\n   Pixiv API for Python 3\n\n### Example:\n\n```python\nfrom pixivpy3 import AppPixivAPI\n\naccess_token = \"...\"\nrefresh_token = \"...\"\n\napi = AppPixivAPI()\napi.set_auth(access_token, refresh_token)\n\n# get origin url\njson_result = api.illust_detail(59580629)\nillust = json_result.illust\nprint(f\"\u003e\u003e\u003e origin url: {illust.image_urls.large}\")\n\n# get ranking: 1-30\n# mode: [day, week, month, day_male, day_female, week_original, week_rookie, day_manga]\njson_result = api.illust_ranking('day')\nfor illust in json_result.illusts:\n    print(f\" p1 [{illust.title}] {illust.image_urls.medium}\")\n\n# next page: 31-60\nnext_qs = api.parse_qs(json_result.next_url)\njson_result = api.illust_ranking(**next_qs)\nfor illust in json_result.illusts:\n    print(f\" p2 [{illust.title}] {illust.image_urls.medium}\")\n\n# get all page:\nnext_qs = {\"mode\": \"day\"}\nwhile next_qs:\n    json_result = api.illust_ranking(**next_qs)\n    for illust in json_result.illusts:\n        print(f\"[{illust.title}] {illust.image_urls.medium}\")\n    next_qs = api.parse_qs(json_result.next_url)\n```\n\n### [Sniffer - App API](https://github.com/upbit/pixivpy/wiki#6x-api)\n\n### [Sniffer - Public API (deprecated)](https://github.com/upbit/pixivpy/wiki/sniffer)\n\n### [Using API proxy behind the Great Wall](https://github.com/upbit/pixivpy/blob/aec177aa7a1979f7ec4c5bbbeed9085cc256bdbd/example_bypass_sni.py#L17) See detail in [Issue#73](https://github.com/upbit/pixivpy/issues/73)\n\n1. Upgrade pixivpy \u003e= **v3.2.0**: `pip install pixivpy --upgrade`\n2. Call `api.download()` like the below:\n\n```python\nfrom pixivpy3 import AppPixivAPI\naapi = AppPixivAPI()\njson_result = aapi.illust_ranking()\nfor illust in json_result.illusts[:3]:\n    aapi.download(illust.image_urls.large)\n```\n\n### [Migrate pixivpy2 to pixivpy3](https://github.com/upbit/pixivpy/blob/b1ad6b98/demo.py#L15-L25)\n\n1. Replace `api.papi.*` to `api.*`\n2. Change deprecated SPAI call to Public-API call\n\n```python\nfrom pixivpy3 import AppPixivAPI\napi = AppPixivAPI()\nrank_list = api.illust_ranking('day')\nprint(rank_list)\n\n# more fields about response: https://github.com/upbit/pixivpy/wiki/sniffer\nranking = rank_list.response[0]\nfor img in ranking.works:\n    # print(img.work)\n    print(f\"[{img.work.user.name}/{img.work.title}(id={img.work.id})] {img.work.image_urls.px_480mw}\")\n```\n\n### About\n\n1. Blog:\n   [Pixiv Public-API (OAuth)分析](http://blog.imaou.com/opensource/2014/10/09/pixiv_api_for_ios_update.html)\n\nIf you have any questions, please feel free to contact me: rmusique@gmail.com\n\nFind Pixiv API in **Objective-C**? You might also like\n[**PixivAPI_iOS**](https://github.com/upbit/PixivAPI_iOS)\n\n## API functions\n\n### App-API (6.0 - app-api.pixiv.net)\n\n```python\nfrom __future__ import annotations\nfrom typing import Any\nfrom pixivpy3.utils import ParsedJson\n\nfrom pixivpy3.api import BasePixivAPI\n\n\nclass AppPixivAPI(BasePixivAPI):\n\n    # 返回翻页用参数\n    def parse_qs(cls, next_url: str | None) -\u003e dict[str, Any] | None: ...\n\n    # 用户详情\n    def user_detail(self, user_id: int | str) -\u003e ParsedJson: ...\n\n    # 用户作品列表\n    ## type: [illust, manga]\n    def user_illusts(self, user_id: int | str, type=\"illust\") -\u003e ParsedJson: ...\n\n    # 用户收藏作品列表\n    # tag: 从 user_bookmark_tags_illust 获取的收藏标签\n    def user_bookmarks_illust(self, user_id: int | str, restrict=\"public\") -\u003e ParsedJson: ...\n\n    # 用户收藏作品列表中的小说\n    def user_bookmarks_novel(self, user_id: int | str, restrict=\"public\") -\u003e ParsedJson: ...\n\n    def user_related(self, seed_user_id: int | str) -\u003e ParsedJson: ...\n\n    # 关注用户的新作\n    # restrict: [public, private]\n    def illust_follow(self, restrict=\"public\") -\u003e ParsedJson: ...\n\n    # 作品详情 (类似PAPI.works(),iOS中未使用)\n    def illust_detail(self, illust_id: int | str) -\u003e ParsedJson: ...\n\n    # 作品评论\n    def illust_comments(self, illust_id: int | str, include_total_comments=None) -\u003e ParsedJson: ...\n\n    # 相关作品列表\n    def illust_related(self, illust_id: int | str) -\u003e ParsedJson: ...\n\n    # 插画推荐 (Home - Main)\n    # content_type: [illust, manga]\n    def illust_recommended(self, content_type=\"illust\") -\u003e ParsedJson: ...\n\n    # 小说推荐\n    def novel_recommended(self) -\u003e ParsedJson: ...\n\n    # 作品排行\n    # mode: [day, week, month, day_male, day_female, week_original, week_rookie, day_manga]\n    # date: '2016-08-01'\n    # mode (Past): [day, week, month, day_male, day_female, week_original, week_rookie,\n    #               day_r18, day_male_r18, day_female_r18, week_r18, week_r18g]\n    def illust_ranking(self, mode=\"day\", date=None) -\u003e ParsedJson: ...\n\n    # 趋势标签 (Search - tags)\n    def trending_tags_illust(self) -\u003e ParsedJson: ...\n\n    # 搜索 (Search)\n    # search_target - 搜索类型\n    #   partial_match_for_tags  - 标签部分一致\n    #   exact_match_for_tags    - 标签完全一致\n    #   title_and_caption       - 标题说明文\n    # sort: [date_desc, date_asc, popular_desc] - popular_desc为会员的热门排序\n    # duration: [within_last_day, within_last_week, within_last_month]\n    # start_date, end_date: '2020-07-01'\n    def search_illust(\n            self,\n            word: str,\n            search_target=\"partial_match_for_tags\",\n            sort=\"date_desc\",\n            duration=None,\n            start_date=None,\n            end_date=None,\n    ) -\u003e ParsedJson: ...\n\n    # 搜索小说 (Search Novel)\n    # search_target - 搜索类型\n    #   partial_match_for_tags  - 标签部分一致\n    #   exact_match_for_tags    - 标签完全一致\n    #   text                    - 正文\n    #   keyword                 - 关键词\n    # sort: [date_desc, date_asc]\n    # start_date/end_date: 2020-06-01\n    def search_novel(\n            self,\n            word: str,\n            search_target=\"partial_match_for_tags\",\n            sort=\"date_desc\",\n            start_date=None,\n            end_date=None,\n    ) -\u003e ParsedJson: ...\n\n    def search_user(self, word: str, sort='date_desc', duration=None) -\u003e ParsedJson: ...\n\n    # 作品收藏详情\n    def illust_bookmark_detail(self, illust_id: int | str) -\u003e ParsedJson: ...\n\n    # 新增收藏\n    def illust_bookmark_add(self, illust_id: int | str, restrict=\"public\", tags=None) -\u003e ParsedJson: ...\n\n    # 删除收藏\n    def illust_bookmark_delete(self, illust_id: int | str) -\u003e ParsedJson: ...\n\n    # 关注用户\n    def user_follow_add(self, user_id: int | str, restrict=\"public\") -\u003e ParsedJson: ...\n\n    # 取消关注用户\n    def user_follow_delete(self, user_id: int | str) -\u003e ParsedJson: ...\n\n    # 用户收藏标签列表\n    def user_bookmark_tags_illust(self, restrict=\"public\") -\u003e ParsedJson: ...\n\n    # Following用户列表\n    def user_following(self, user_id: int | str, restrict=\"public\") -\u003e ParsedJson: ...\n\n    # Followers用户列表\n    def user_follower(self, user_id: int | str) -\u003e ParsedJson: ...\n\n    # 好P友\n    def user_mypixiv(self, user_id: int | str) -\u003e ParsedJson: ...\n\n    # 黑名单用户\n    def user_list(self, user_id: int | str) -\u003e ParsedJson: ...\n\n    # 获取ugoira信息\n    def ugoira_metadata(self, illust_id: int | str) -\u003e ParsedJson: ...\n\n    # 用户小说列表\n    def user_novels(self, user_id: int | str) -\u003e ParsedJson: ...\n\n    # 小说系列详情\n    def novel_series(self, series_id: int | str, last_order=None) -\u003e ParsedJson: ...\n\n    # 小说详情\n    def novel_detail(self, novel_id: int | str) -\u003e ParsedJson: ...\n\n    # 小说 (包含正文)\n    def webview_novel(self, novel_id: int | str) -\u003e ParsedJson: ...\n\n    # 小说评论\n    def novel_comments(self, novel_id: int | str) -\u003e ParsedJson: ...\n\n    # 大家的新作\n    # content_type: [illust, manga]\n    def illust_new(self, content_type=\"illust\", max_illust_id=None) -\u003e ParsedJson: ...\n\n    def novel_new(self, max_novel_id=None) -\u003e ParsedJson: ...\n\n    # 特辑详情 (无需登录,调用Web API)\n    def showcase_article(self, showcase_id) -\u003e ParsedJson: ...\n```\n\n[Usage](https://github.com/upbit/pixivpy/blob/aec177aa7a1979f7ec4c5bbbeed9085cc256bdbd/demo.py#L306):\n\n```python\nfrom pixivpy3 import AppPixivAPI\napi = AppPixivAPI()\n\n# 作品推荐\njson_result = api.illust_recommended()\nprint(json_result)\nillust = json_result.illusts[0]\nprint(f\"\u003e\u003e\u003e {illust.title}, origin url: {illust.image_urls.large}\")\n\n# 作品相关推荐\njson_result = api.illust_related(57065990)\nprint(json_result)\nillust = json_result.illusts[0]\nprint(f\"\u003e\u003e\u003e {illust.title}, origin url: {illust.image_urls.large}\")\n\n# 作品相关推荐-下一页 (.parse_qs(next_url) 用法)\nnext_qs = api.parse_qs(json_result.next_url)\njson_result = api.illust_related(**next_qs)\nprint(json_result)\nillust = json_result.illusts[0]\nprint(f\"\u003e\u003e\u003e {illust.title}, origin url: {illust.image_urls.large}\")\n\n# 用户详情\njson_result = api.user_detail(660788)\nprint(json_result)\nuser = json_result.user\nprint(f\"{user.name}(@{user.account}) region={json_result.profile.region}\")\n\n# 用户作品列表\njson_result = api.user_illusts(660788)\nprint(json_result)\nillust = json_result.illusts[0]\nprint(f\"\u003e\u003e\u003e {illust.title}, origin url: {illust.image_urls.large}\")\n\n# 用户收藏列表\njson_result = api.user_bookmarks_illust(2088434)\nprint(json_result)\nillust = json_result.illusts[0]\nprint(f\"\u003e\u003e\u003e {illust.title}, origin url: {illust.image_urls.large}\")\n\n# 用户收藏列表中的小说\njson_result = api.user_bookmarks_novel(42862448)\nprint(json_result)\nnovel = json_result.novels[0]\nprint(f\"\u003e\u003e\u003e {novel.title}, text_length: {novel.text_length}, series: {novel.series}\")\n\n# 2016-07-15 日的过去一周排行\njson_result = api.illust_ranking('week', date='2016-07-15')\nprint(json_result)\nillust = json_result.illusts[0]\nprint(f\"\u003e\u003e\u003e {illust.title}, origin url: {illust.image_urls.large}\")\n\n# 关注用户的新作 (需要login)\njson_result = api.illust_follow(req_auth=True)\nprint(json_result)\nillust = json_result.illusts[0]\nprint(f\"\u003e\u003e\u003e {illust.title}, origin url: {illust.image_urls.large}\")\n\n# 标签 \"水着\" 搜索\njson_result = api.search_illust('水着', search_target='partial_match_for_tags')\nprint(json_result)\nillust = json_result.illusts[0]\nprint(f\"\u003e\u003e\u003e {illust.title}, origin url: {illust.image_urls.large}\")\n\n# 用户 \"gomzi\" 搜索\njson_result = api.search_user(\"gomzi\")\nprint(json_result)\nillust = json_result.user_previews[0].illusts[0]\nprint(f\"\u003e\u003e\u003e {illust.title}, origin url: {illust.image_urls.large}\")\n\n# 展示小说评论区\njson_result = api.novel_comments(16509454, include_total_comments=True)\nprint(f\"Total comments = {json_result.total_comments}\")\nfor comment in json_result.comments:\n    if comment.parent_comment:\n        print(f\"{comment.user.name} replied to {comment.parent_comment.user.name} at {comment.date} : {comment.comment}\")\n    else:\n        print(f\"{comment.user.name} at {comment.date} : {comment.comment}\")\n```\n\n## Develop Instructions\n\n```sh\n# Updating dependencies\n$ poetry update --with=dev,test\n```\n\nFork this project and create a new branch for your changes. Push your changes to\nyour fork and create a pull request.\n\n```sh\npoetry run pytest\n```\n\n## Package Publishing Instructions\n\nFollow these simple steps to publish your Poetry package. We recommend\npublishing to the [test.pypi.org](https://test.pypi.org/) instance first, to\nverify everything is working as expected.\n\nThis step only has to be done once:\n\n```sh\n# Configure test.pypi.org\npoetry config repositories.testpypi https://test.pypi.org/legacy/\n# Configure API Keys for both PyPI and TestPyPY\npoetry config pypi-token.testpypi \u003ctestpypi_api_key\u003e\npoetry config pypi-token.pypi \u003cpypi_api_key\u003e\n```\n\nNow publish the new version:\n\n```sh\n# Adjust the package version at the top of the \"pyproject.toml\" file\nvim pyproject.toml\n# Build python packages to dist/ folder\npoetry build\n# Publish package to TestPyPi\npoetry publish -r testpypi\n# Checkout published package in a different environment\npip install --index-url https://test.pypi.org/simple/ \u003cyour_package_name\u003e\n# Once confirmed that everything works, publish to the real PyPi\npoetry publish\n```\n\n## License\n\nFeel free to use, reuse and abuse the code in this project.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fupbit%2Fpixivpy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fupbit%2Fpixivpy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fupbit%2Fpixivpy/lists"}