504 字
3 分钟
获取 Pixiv refresh_token
2023-10-03

注意本机需要安装python环境

第一步下载chromedriver#

Chromedriver

如果没有找到对应的版本号,找个相近就可以了下载如果是windows就选择chromedriver_win32.zip

第二步下载脚本#

pixiv_auth.py

下载的文件要放在同一个目录

第三步安装requests模块#

Windows端

Terminal window
pip install requests

其他客服端请参考

https://stackoverflow.com/questions/17309288/importerror-no-module-named-requests

第四步在Python安装selenium#

Terminal window
pip install selenium

不要开代理,如果还是报错建议用手机开热点试试

第五步#

目录下打开cmd输入#
Terminal window
python pixiv_auth.py login

浏览器弹出Pixiv 登录页面

国内用户需要开代理,还需要修改pixiv_auth.py,这里可以直接复制我的,如果代理端口不是7890则需要修改82行端口号

#!/usr/bin/env python
from argparse import ArgumentParser
from base64 import urlsafe_b64encode
from hashlib import sha256
from pprint import pprint
from secrets import token_urlsafe
from sys import exit
from urllib.parse import urlencode
from webbrowser import open as open_url
import requests
# Latest app version can be found using GET /v1/application-info/android
USER_AGENT = "PixivAndroidApp/5.0.234 (Android 11; Pixel 5)"
REDIRECT_URI = "https://app-api.pixiv.net/web/v1/users/auth/pixiv/callback"
LOGIN_URL = "https://app-api.pixiv.net/web/v1/login"
AUTH_TOKEN_URL = "https://oauth.secure.pixiv.net/auth/token"
CLIENT_ID = "MOBrBDS8blbauoSck0ZfDbtuzpyT"
CLIENT_SECRET = "lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj"
def s256(data):
"""S256 transformation method."""
return urlsafe_b64encode(sha256(data).digest()).rstrip(b"=").decode("ascii")
def oauth_pkce(transform):
"""Proof Key for Code Exchange by OAuth Public Clients (RFC7636)."""
code_verifier = token_urlsafe(32)
code_challenge = transform(code_verifier.encode("ascii"))
return code_verifier, code_challenge
def print_auth_token_response(response):
data = response.json()
try:
access_token = data["access_token"]
refresh_token = data["refresh_token"]
except KeyError:
print("error:")
pprint(data)
exit(1)
print("access_token:", access_token)
print("refresh_token:", refresh_token)
print("expires_in:", data.get("expires_in", 0))
def login():
code_verifier, code_challenge = oauth_pkce(s256)
login_params = {
"code_challenge": code_challenge,
"code_challenge_method": "S256",
"client": "pixiv-android",
}
open_url(f"{LOGIN_URL}?{urlencode(login_params)}")
try:
code = input("code: ").strip()
except (EOFError, KeyboardInterrupt):
return
response = requests.post(
AUTH_TOKEN_URL,
data={
"client_id": CLIENT_ID,
"client_secret": CLIENT_SECRET,
"code": code,
"code_verifier": code_verifier,
"grant_type": "authorization_code",
"include_policy": "true",
"redirect_uri": REDIRECT_URI,
},
headers={"User-Agent": USER_AGENT},
proxies={
'https': 'http://127.0.0.1:7890'
}
)
print_auth_token_response(response)
def refresh(refresh_token):
response = requests.post(
AUTH_TOKEN_URL,
data={
"client_id": CLIENT_ID,
"client_secret": CLIENT_SECRET,
"grant_type": "refresh_token",
"include_policy": "true",
"refresh_token": refresh_token,
},
headers={"User-Agent": USER_AGENT},
)
print_auth_token_response(response)
def main():
parser = ArgumentParser()
subparsers = parser.add_subparsers()
parser.set_defaults(func=lambda _: parser.print_usage())
login_parser = subparsers.add_parser("login")
login_parser.set_defaults(func=lambda _: login())
refresh_parser = subparsers.add_parser("refresh")
refresh_parser.add_argument("refresh_token")
refresh_parser.set_defaults(func=lambda ns: refresh(ns.refresh_token))
args = parser.parse_args()
args.func(args)
if __name__ == "__main__":
main()

打开浏览器操作台F12,切换到网络选项卡,勾选“保留日志”,并在过滤文本框中输入 callback?,复制code 如同所示

将code填入终端

image-20230111222354479

返回access_token: xxx refresh_token: xxx

code 的有效期很短,因此请尽快操作。

大功告成

有疑问欢迎到评论区讨论

获取 Pixiv refresh_token
https://adunm.top/posts/pixiv/
作者
Ylan
发布于
2023-10-03
许可协议
CC BY-NC-SA 4.0