[instagram] fix errors for missing user profiles
This commit is contained in:
@@ -869,43 +869,22 @@ class InstagramRestAPI():
|
|||||||
}
|
}
|
||||||
return self._pagination_sections(endpoint, data)
|
return self._pagination_sections(endpoint, data)
|
||||||
|
|
||||||
@cache(maxage=36500*86400, keyarg=1)
|
|
||||||
def user_by_name(self, screen_name):
|
|
||||||
endpoint = "/v1/users/web_profile_info/"
|
|
||||||
params = {"username": screen_name}
|
|
||||||
try:
|
|
||||||
return self._call(
|
|
||||||
endpoint, params=params, notfound="user")["data"]["user"]
|
|
||||||
except KeyError:
|
|
||||||
raise exception.NotFoundError("user")
|
|
||||||
|
|
||||||
@cache(maxage=36500*86400, keyarg=1)
|
|
||||||
def user_by_search(self, screen_name):
|
|
||||||
url = "https://www.instagram.com/web/search/topsearch/"
|
|
||||||
params = {"query": screen_name}
|
|
||||||
|
|
||||||
name = screen_name.lower()
|
|
||||||
for result in self._call(url, params=params)["users"]:
|
|
||||||
user = result["user"]
|
|
||||||
if user["username"].lower() == name:
|
|
||||||
return user
|
|
||||||
|
|
||||||
@cache(maxage=36500*86400, keyarg=1)
|
@cache(maxage=36500*86400, keyarg=1)
|
||||||
def user_by_id(self, user_id):
|
def user_by_id(self, user_id):
|
||||||
endpoint = f"/v1/users/{user_id}/info/"
|
endpoint = f"/v1/users/{user_id}/info/"
|
||||||
return self._call(endpoint)["user"]
|
return self._call(endpoint)["user"]
|
||||||
|
|
||||||
def user_by_screen_name(self, screen_name):
|
def user_by_screen_name(self, screen_name):
|
||||||
user = self.user_by_search(screen_name)
|
user = user_by_search(self, screen_name)
|
||||||
if user is None:
|
if user is None:
|
||||||
self.user_by_search.invalidate(screen_name)
|
user_by_search.invalidate(screen_name)
|
||||||
self.log.warning("Failed to find profile '%s' via search. "
|
self.extractor.log.warning(
|
||||||
|
"Failed to find profile '%s' via search. "
|
||||||
"Trying 'web_profile_info' fallback", screen_name)
|
"Trying 'web_profile_info' fallback", screen_name)
|
||||||
user = self.user_by_name(screen_name)
|
user = user_by_name(self, screen_name)
|
||||||
if user is None:
|
if user is None:
|
||||||
self.user_by_name.invalidate(screen_name)
|
user_by_name.invalidate(screen_name)
|
||||||
raise exception.AuthorizationError(
|
raise exception.NotFoundError("user")
|
||||||
"Login required to access this profile")
|
|
||||||
return user
|
return user
|
||||||
|
|
||||||
def user_id(self, screen_name, check_private=True):
|
def user_id(self, screen_name, check_private=True):
|
||||||
@@ -914,7 +893,7 @@ class InstagramRestAPI():
|
|||||||
self.extractor._user = self.user_by_id(screen_name[3:])
|
self.extractor._user = self.user_by_id(screen_name[3:])
|
||||||
return screen_name[3:]
|
return screen_name[3:]
|
||||||
|
|
||||||
user = self.user_by_search(screen_name)
|
user = self.user_by_screen_name(screen_name)
|
||||||
if check_private and user.get("is_private") and \
|
if check_private and user.get("is_private") and \
|
||||||
not user.get("followed_by_viewer", True):
|
not user.get("followed_by_viewer", True):
|
||||||
name = user["username"]
|
name = user["username"]
|
||||||
@@ -1075,8 +1054,6 @@ class InstagramGraphqlAPI():
|
|||||||
|
|
||||||
api = InstagramRestAPI(extractor)
|
api = InstagramRestAPI(extractor)
|
||||||
self.user_by_screen_name = api.user_by_screen_name
|
self.user_by_screen_name = api.user_by_screen_name
|
||||||
self.user_by_search = api.user_by_search
|
|
||||||
self.user_by_name = api.user_by_name
|
|
||||||
self.user_by_id = api.user_by_id
|
self.user_by_id = api.user_by_id
|
||||||
self.user_id = api.user_id
|
self.user_id = api.user_id
|
||||||
|
|
||||||
@@ -1182,6 +1159,29 @@ def _login_impl(extr, username, password):
|
|||||||
return {}
|
return {}
|
||||||
|
|
||||||
|
|
||||||
|
@cache(maxage=36500*86400, keyarg=1)
|
||||||
|
def user_by_name(self, screen_name):
|
||||||
|
endpoint = "/v1/users/web_profile_info/"
|
||||||
|
params = {"username": screen_name}
|
||||||
|
try:
|
||||||
|
return self._call(
|
||||||
|
endpoint, params=params, notfound="user")["data"]["user"]
|
||||||
|
except KeyError:
|
||||||
|
raise exception.NotFoundError("user")
|
||||||
|
|
||||||
|
|
||||||
|
@cache(maxage=36500*86400, keyarg=1)
|
||||||
|
def user_by_search(self, screen_name):
|
||||||
|
url = "https://www.instagram.com/web/search/topsearch/"
|
||||||
|
params = {"query": screen_name}
|
||||||
|
|
||||||
|
name = screen_name.lower()
|
||||||
|
for result in self._call(url, params=params)["users"]:
|
||||||
|
user = result["user"]
|
||||||
|
if user["username"].lower() == name:
|
||||||
|
return user
|
||||||
|
|
||||||
|
|
||||||
def id_from_shortcode(shortcode):
|
def id_from_shortcode(shortcode):
|
||||||
return util.bdecode(shortcode, _ALPHABET)
|
return util.bdecode(shortcode, _ALPHABET)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user