[pixiv] use refresh_token based authentication
The first login will still use username and password, but everything afterwards will use the refresh_token obtained from that. This will prevent pixiv from sending a "New login to pixiv" email every time a new access_token is requested.
This commit is contained in:
parent
2221cf97ff
commit
8faf03ed84
@ -432,23 +432,31 @@ class PixivAppAPI():
|
||||
|
||||
@cache(maxage=3590, keyarg=1)
|
||||
def _login_impl(self, username, password):
|
||||
self.log.info("Logging in as %s", username)
|
||||
|
||||
url = "https://oauth.secure.pixiv.net/auth/token"
|
||||
data = {
|
||||
"client_id": self.client_id,
|
||||
"client_secret": self.client_secret,
|
||||
"grant_type": "password",
|
||||
"username": username,
|
||||
"password": password,
|
||||
"get_secure_url": 1,
|
||||
}
|
||||
refresh_token = _refresh_token_cache(username)
|
||||
|
||||
if refresh_token:
|
||||
self.log.info("Refreshing access token")
|
||||
data["grant_type"] = "refresh_token"
|
||||
data["refresh_token"] = refresh_token
|
||||
else:
|
||||
self.log.info("Logging in as %s", username)
|
||||
data["grant_type"] = "password"
|
||||
data["username"] = username
|
||||
data["password"] = password
|
||||
|
||||
response = self.session.post(url, data=data)
|
||||
if response.status_code >= 400:
|
||||
raise exception.AuthenticationError()
|
||||
|
||||
data = response.json()["response"]
|
||||
if not refresh_token:
|
||||
_refresh_token_cache.update(username, data["refresh_token"])
|
||||
return data["user"], "Bearer " + data["access_token"]
|
||||
|
||||
def illust_detail(self, illust_id):
|
||||
@ -506,3 +514,8 @@ class PixivAppAPI():
|
||||
return
|
||||
query = data["next_url"].rpartition("?")[2]
|
||||
params = text.parse_query(query)
|
||||
|
||||
|
||||
@cache(maxage=365*24*60*60, keyarg=0)
|
||||
def _refresh_token_cache(username):
|
||||
return None
|
||||
|
Loading…
x
Reference in New Issue
Block a user