From ee7cea888ebf2ff390a401f1916cc0e21d6a3edc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Thu, 2 Jun 2022 21:49:09 +0200 Subject: [PATCH] [instagram] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit it is now possible to use 'id:…' instead of a user's screen name: - https://www.instagram.com/instagram/ - https://www.instagram.com/id:25025320/ similar to the same functionality for twitter: a3b473bd2f675b6f07da730aacce67f3e7998a00 for /tagged/ URLs, using a user ID will only have 'tagged_owner_id' defined. 'tagged_username' and 'tagged_full_name', which are available when using a screen name, will not be defined. --- gallery_dl/extractor/instagram.py | 44 +++++++++++++++++++------------ 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/gallery_dl/extractor/instagram.py b/gallery_dl/extractor/instagram.py index 2f713eea..815892a7 100644 --- a/gallery_dl/extractor/instagram.py +++ b/gallery_dl/extractor/instagram.py @@ -140,10 +140,21 @@ class InstagramExtractor(Extractor): screen_name) headers = { "Referer": "https://www.instagram.com/{}/".format(screen_name), + "X-CSRFToken" : self.csrf_token, "X-IG-App-ID" : "936619743392459", + "X-IG-WWW-Claim" : self.www_claim, "X-Requested-With": "XMLHttpRequest", } - return self.request(url, headers=headers).json()["graphql"]["user"] + cookies = { + "csrftoken": self.csrf_token, + } + return self.request( + url, headers=headers, cookies=cookies).json()["graphql"]["user"] + + def _uid_by_screen_name(self, screen_name): + if screen_name.startswith("id:"): + return screen_name[3:] + return self._user_by_screen_name(screen_name)["id"] def _media_by_id(self, post_id): endpoint = "/v1/media/{}/info/".format(post_id) @@ -450,6 +461,7 @@ class InstagramUserExtractor(InstagramExtractor): test = ( ("https://www.instagram.com/instagram/"), ("https://www.instagram.com/instagram/?hl=en"), + ("https://www.instagram.com/id:25025320/"), ) def items(self): @@ -475,10 +487,8 @@ class InstagramPostsExtractor(InstagramExtractor): }) def posts(self): - user = self._user_by_screen_name(self.item) - query_hash = "69cba40317214236af40e7efa697781d" - variables = {"id": user["id"], "first": 50} + variables = {"id": self._uid_by_screen_name(self.item), "first": 50} return self._pagination_graphql(query_hash, variables) @@ -497,7 +507,12 @@ class InstagramTaggedExtractor(InstagramExtractor): }) def metadata(self): - self.user = user = self._user_by_screen_name(self.item) + if self.item.startswith("id:"): + self.user_id = self.item[3:] + return {"tagged_owner_id": self.user_id} + + user = self._user_by_screen_name(self.item) + self.user_id = user["id"] return { "tagged_owner_id" : user["id"], @@ -506,7 +521,7 @@ class InstagramTaggedExtractor(InstagramExtractor): } def posts(self): - endpoint = "/v1/usertags/{}/feed/".format(self.user["id"]) + endpoint = "/v1/usertags/{}/feed/".format(self.user_id) params = {"count": 50} return self._pagination_api(endpoint, params) @@ -521,10 +536,8 @@ class InstagramChannelExtractor(InstagramExtractor): }) def posts(self): - user = self._user_by_screen_name(self.item) - query_hash = "bc78b344a68ed16dd5d7f264681c4c76" - variables = {"id": user["id"], "first": 50} + variables = {"id": self._uid_by_screen_name(self.item), "first": 50} return self._pagination_graphql(query_hash, variables) @@ -535,10 +548,8 @@ class InstagramSavedExtractor(InstagramExtractor): test = ("https://www.instagram.com/instagram/saved/",) def posts(self): - user = self._user_by_screen_name(self.item) - query_hash = "2ce1d673055b99250e93b6f88f878fde" - variables = {"id": user["id"], "first": 50} + variables = {"id": self._uid_by_screen_name(self.item), "first": 50} return self._pagination_graphql(query_hash, variables) @@ -739,7 +750,7 @@ class InstagramStoriesExtractor(InstagramExtractor): if self.highlight_id: reel_id = "highlight:" + self.highlight_id else: - reel_id = self._user_by_screen_name(self.user)["id"] + reel_id = self._uid_by_screen_name(self.item) endpoint = "/v1/feed/reels_media/" params = {"reel_ids": reel_id} @@ -764,9 +775,8 @@ class InstagramHighlightsExtractor(InstagramExtractor): test = ("https://www.instagram.com/instagram/highlights",) def posts(self): - user = self._user_by_screen_name(self.item) - - endpoint = "/v1/highlights/{}/highlights_tray/".format(user["id"]) + endpoint = "/v1/highlights/{}/highlights_tray/".format( + self._uid_by_screen_name(self.item)) tray = self._request_api(endpoint)["tray"] reel_ids = [highlight["id"] for highlight in tray] @@ -795,7 +805,7 @@ class InstagramReelsExtractor(InstagramExtractor): def posts(self): endpoint = "/v1/clips/user/" data = { - "target_user_id": self._user_by_screen_name(self.item)["id"], + "target_user_id": self._uid_by_screen_name(self.item), "page_size" : "50", }