From 3a271504791f99786e980d3677fca4a79ebea524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20F=C3=A4hrmann?= Date: Wed, 23 Aug 2023 23:55:39 +0200 Subject: [PATCH] [instagram] add 'following' extractor (#1848) --- gallery_dl/extractor/instagram.py | 36 +++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/gallery_dl/extractor/instagram.py b/gallery_dl/extractor/instagram.py index db9333fd..d9049678 100644 --- a/gallery_dl/extractor/instagram.py +++ b/gallery_dl/extractor/instagram.py @@ -594,6 +594,23 @@ class InstagramHighlightsExtractor(InstagramExtractor): return self.api.highlights_media(uid) +class InstagramFollowingExtractor(InstagramExtractor): + """Extractor for an Instagram user's followed users""" + subcategory = "following" + pattern = USER_PATTERN + r"/following" + test = ("https://www.instagram.com/instagram/following", { + "range": "1-16", + "count": ">= 16", + }) + + def items(self): + uid = self.api.user_id(self.item) + for user in self.api.user_following(uid): + user["_extractor"] = InstagramUserExtractor + url = "{}/{}".format(self.root, user["username"]) + yield Message.Queue, url, user + + class InstagramTagExtractor(InstagramExtractor): """Extractor for Instagram tags""" subcategory = "tag" @@ -871,6 +888,11 @@ class InstagramRestAPI(): params = {"count": 30} return self._pagination(endpoint, params) + def user_following(self, user_id): + endpoint = "/v1/friendships/{}/following/".format(user_id) + params = {"count": 12} + return self._pagination_following(endpoint, params) + def user_saved(self): endpoint = "/v1/feed/saved/posts/" params = {"count": 50} @@ -960,6 +982,20 @@ class InstagramRestAPI(): return extr._update_cursor(None) params["max_id"] = extr._update_cursor(data["next_max_id"]) + def _pagination_following(self, endpoint, params): + extr = self.extractor + params["max_id"] = text.parse_int(extr._init_cursor()) + + while True: + data = self._call(endpoint, params=params) + + yield from data["users"] + + if len(data["users"]) < params["count"]: + return extr._update_cursor(None) + params["max_id"] = extr._update_cursor( + params["max_id"] + params["count"]) + class InstagramGraphqlAPI():