[instagram] add 'avatar' extractor (#929, #1097, #2992)

This commit is contained in:
Mike Fährmann
2022-10-19 10:58:42 +02:00
parent ea8113ff36
commit cf86f68864
3 changed files with 59 additions and 6 deletions

View File

@@ -361,6 +361,7 @@ class InstagramUserExtractor(InstagramExtractor):
base = "{}/{}/".format(self.root, self.item)
stories = "{}/stories/{}/".format(self.root, self.item)
return self._dispatch_extractors((
(InstagramAvatarExtractor , base + "avatar/"),
(InstagramStoriesExtractor , stories),
(InstagramHighlightsExtractor, base + "highlights/"),
(InstagramPostsExtractor , base + "posts/"),
@@ -417,7 +418,7 @@ class InstagramTaggedExtractor(InstagramExtractor):
return {"tagged_owner_id": self.user_id}
self.user_id = self.api.user_id(self.item)
user = self.api.user(self.item)
user = self.api.user_by_name(self.item)
return {
"tagged_owner_id" : user["id"],
@@ -529,6 +530,48 @@ class InstagramTagExtractor(InstagramExtractor):
return self.api.tags_media(self.item)
class InstagramAvatarExtractor(InstagramExtractor):
"""Extractor for an Instagram user's avatar"""
subcategory = "avatar"
pattern = USER_PATTERN + r"/avatar"
test = ("https://www.instagram.com/instagram/avatar", {
"pattern": r"https://instagram\.[\w.-]+\.fbcdn\.net/v/t51\.2885-19"
r"/281440578_1088265838702675_6233856337905829714_n\.jpg",
})
def posts(self):
if self._logged_in:
user_id = self.api.user_id(self.item)
user = self.api.user_by_id(user_id)
avatar = (user.get("hd_profile_pic_url_info") or
user["hd_profile_pic_versions"][-1])
else:
user = self.item
if user.startswith("id:"):
user = self.api.user_by_id(user[3:])
else:
user = self.api.user_by_name(user)
user["pk"] = user["id"]
url = user.get("profile_pic_url_hd") or user["profile_pic_url"]
avatar = {"url": url, "width": 0, "height": 0}
pk = user.get("profile_pic_id")
if pk:
pk = pk.partition("_")[0]
code = shortcode_from_id(pk)
else:
pk = code = "avatar:" + str(user["pk"])
return ({
"pk" : pk,
"code" : code,
"user" : user,
"caption" : None,
"like_count": 0,
"image_versions2": {"candidates": (avatar,)},
},)
class InstagramPostExtractor(InstagramExtractor):
"""Extractor for an Instagram post"""
subcategory = "post"
@@ -678,15 +721,19 @@ class InstagramRestAPI():
return self._pagination_sections(endpoint, data)
@memcache(keyarg=1)
def user(self, screen_name):
def user_by_name(self, screen_name):
endpoint = "/v1/users/web_profile_info/"
params = {"username": screen_name}
return self._call(endpoint, params=params)["data"]["user"]
def user_by_id(self, user_id):
endpoint = "/v1/users/{}/info/".format(user_id)
return self._call(endpoint)["user"]
def user_id(self, screen_name):
if screen_name.startswith("id:"):
return screen_name[3:]
user = self.user(screen_name)
user = self.user_by_name(screen_name)
if user is None:
raise exception.AuthorizationError(
"Login required to access this profile")
@@ -797,7 +844,8 @@ class InstagramGraphqlAPI():
self._json_dumps = json.JSONEncoder(separators=(",", ":")).encode
api = InstagramRestAPI(extractor)
self.user = api.user
self.user_by_name = api.user_by_name
self.user_by_id = api.user_by_id
self.user_id = api.user_id
@staticmethod