注意本机需要安装python环境

第一步下载chromedriver

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

第二步下载脚本

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

第三步安装requests模块

Windows端

1
pip install requests

其他客服端请参考

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

第四步在Python安装selenium

1
pip install selenium

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

第五步

目录下打开cmd输入
1
python pixiv_auth.py login

浏览器弹出Pixiv 登录页面

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/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 的有效期很短,因此请尽快操作。

大功告成

有疑问欢迎到评论区讨论