From 4b855b1565091afd8f0a1c17bf71ac92936fc352 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Tue, 22 Apr 2025 21:58:29 +0200 Subject: [PATCH] [scrolller] retrieve data of single posts via GraphQL --- gallery_dl/extractor/scrolller.py | 44 ++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/gallery_dl/extractor/scrolller.py b/gallery_dl/extractor/scrolller.py index c818c98c..56cd7689 100644 --- a/gallery_dl/extractor/scrolller.py +++ b/gallery_dl/extractor/scrolller.py @@ -71,7 +71,7 @@ class ScrolllerExtractor(Extractor): return data["login"]["token"] - def _request_graphql(self, opname, variables): + def _request_graphql(self, opname, variables, admin=False): url = "https://api.scrolller.com/api/v2/graphql" headers = { "Content-Type" : "text/plain;charset=UTF-8", @@ -85,6 +85,11 @@ class ScrolllerExtractor(Extractor): "variables" : variables, "authorization": self.auth_token, } + + if admin: + url = "https://api.scrolller.com/admin" + headers["Content-Type"] = "application/json" + return self.request( url, method="POST", headers=headers, data=util.json_dumps(data), ).json()["data"] @@ -159,12 +164,9 @@ class ScrolllerPostExtractor(ScrolllerExtractor): example = "https://scrolller.com/title-slug-a1b2c3d4f5" def posts(self): - url = "{}/{}".format(self.root, self.groups[0]) - page = self.request(url).text - data = util.json_loads(text.extr( - page, '') - .replace('\\"', '"')) - return (data["item"],) + variables = {"url": "/" + self.groups[0]} + data = self._request_graphql("SubredditPostQuery", variables, True) + return (data["getPost"],) QUERIES = { @@ -227,6 +229,34 @@ query LoginQuery( username token expiresAt isAdmin status isPremium } } +""", + + "ItemTypeQuery": """\ +query ItemTypeQuery( + $url: String! +) { + getItemType( + url: $url + ) +} +""", + + "SubredditPostQuery": """\ +query SubredditPostQuery( + $url: String! +) { + getPost( + data: { url: $url } + ) { + __typename id url title subredditId subredditTitle subredditUrl + redditPath isNsfw hasAudio fullLengthSource gfycatSource redgifsSource + ownerAvatar username displayName favoriteCount isPaid tags + commentsCount commentsRepliesCount isFavorite + albumContent { mediaSources { url width height isOptimized } } + mediaSources { url width height isOptimized } + blurredMediaSources { url width height isOptimized } + } +} """, }