ドラえもん
504 字
3 分钟
获取 Pixiv refresh_token
注意本机需要安装python环境
第一步下载chromedriver
如果没有找到对应的版本号,找个相近就可以了下载如果是windows就选择chromedriver_win32.zip
第二步下载脚本
下载的文件要放在同一个目录
第三步安装requests
模块
Windows端
pip install requests
其他客服端请参考
https://stackoverflow.com/questions/17309288/importerror-no-module-named-requests
第四步在Python安装selenium
pip install selenium
不要开代理,如果还是报错建议用手机开热点试试
第五步
目录下打开cmd输入
python pixiv_auth.py login
浏览器弹出Pixiv 登录页面
国内用户需要开代理,还需要修改pixiv_auth.py,这里可以直接复制我的,如果代理端口不是7890则需要修改82
行端口号
#!/usr/bin/env python
from argparse import ArgumentParserfrom base64 import urlsafe_b64encodefrom hashlib import sha256from pprint import pprintfrom secrets import token_urlsafefrom sys import exitfrom urllib.parse import urlencodefrom webbrowser import open as open_url
import requests
# Latest app version can be found using GET /v1/application-info/androidUSER_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填入终端
返回access_token: xxx refresh_token: xxx
code
的有效期很短,因此请尽快操作。
大功告成
有疑问欢迎到评论区讨论