1
0
mirror of https://github.com/mikf/gallery-dl.git synced 2024-11-22 02:32:33 +01:00

[gfycat] implement login support (#3770, #4271)

For the record: '/webtoken' and '/weblogin' are not the same ...
This commit is contained in:
Mike Fährmann 2023-07-06 18:56:34 +02:00
parent e9b9f751bf
commit 7444fc125b
No known key found for this signature in database
GPG Key ID: 5680CA389D365A88
5 changed files with 44 additions and 3 deletions

View File

@ -382,6 +382,7 @@ Description
* ``e621`` (*)
* ``e926`` (*)
* ``exhentai``
* ``gfycat``
* ``idolcomplex``
* ``imgbb``
* ``inkbunny``

View File

@ -251,7 +251,7 @@ Consider all sites to be NSFW unless otherwise known.
<td>Gfycat</td>
<td>https://gfycat.com/</td>
<td>Collections, individual Images, Search Results, User Profiles</td>
<td></td>
<td>Supported</td>
</tr>
<tr>
<td>Gofile</td>

View File

@ -10,6 +10,7 @@
from .common import Extractor, Message
from .. import text, exception
from ..cache import cache
class GfycatExtractor(Extractor):
@ -221,6 +222,8 @@ class GfycatAPI():
def __init__(self, extractor):
self.extractor = extractor
self.headers = {}
self.username, self.password = extractor._get_auth_info()
def collection(self, user, collection):
endpoint = "/v1/users/{}/collections/{}/gfycats".format(
@ -252,9 +255,45 @@ class GfycatAPI():
params = {"count": 100}
return self._pagination(endpoint, params)
def authenticate(self):
self.headers["Authorization"] = \
self._authenticate_impl(self.username, self.password)
@cache(maxage=3600, keyarg=1)
def _authenticate_impl(self, username, password):
self.extractor.log.info("Logging in as %s", username)
url = "https://weblogin.gfycat.com/oauth/webtoken"
headers = {"Origin": "https://gfycat.com"}
data = {
"access_key": "Anr96uuqt9EdamSCwK4txKPjMsf2"
"M95Rfa5FLLhPFucu8H5HTzeutyAa",
}
response = self.extractor.request(
url, method="POST", headers=headers, json=data).json()
url = "https://weblogin.gfycat.com/oauth/weblogin"
headers["authorization"] = "Bearer " + response["access_token"]
data = {
"grant_type": "password",
"username" : username,
"password" : password,
}
response = self.extractor.request(
url, method="POST", headers=headers, json=data, fatal=None).json()
if "errorMessage" in response:
raise exception.AuthenticationError(
response["errorMessage"]["description"])
return "Bearer " + response["access_token"]
def _call(self, endpoint, params=None):
if self.username:
self.authenticate()
url = self.API_ROOT + endpoint
return self.extractor.request(url, params=params).json()
return self.extractor.request(
url, params=params, headers=self.headers).json()
def _pagination(self, endpoint, params, key="gfycats"):
while True:

View File

@ -312,6 +312,7 @@ AUTH_MAP = {
"fanbox" : _COOKIES,
"fantia" : _COOKIES,
"flickr" : _OAUTH,
"gfycat" : "Supported",
"furaffinity" : _COOKIES,
"horne" : "Required",
"idolcomplex" : "Supported",

View File

@ -325,7 +325,7 @@ def setup_test_config():
for category in ("danbooru", "atfbooru", "aibooru", "e621", "e926",
"instagram", "twitter", "subscribestar", "deviantart",
"inkbunny", "tapas", "pillowfort", "mangadex",
"vipergirls"):
"vipergirls", "gfycat"):
config.set(("extractor", category), "username", None)
config.set(("extractor", "mastodon.social"), "access-token",