From f55334cd5b9e9a587b645b0a09c6ee81aa6025a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Koch-Kramer?= Date: Sun, 18 Mar 2018 17:41:03 +0100 Subject: [PATCH 1/2] Fix KeyError on login attempt with wrong password --- instaloader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instaloader.py b/instaloader.py index 7df7799..87a79e6 100755 --- a/instaloader.py +++ b/instaloader.py @@ -947,7 +947,7 @@ class Instaloader: def test_login(self) -> Optional[str]: """Returns the Instagram username to which given :class:`requests.Session` object belongs, or None.""" data = self.graphql_query("d6f4427fbe92d846298cf93df0b937d3", {}) - return data["data"]["user"]["username"] if "username" in data["data"]["user"] else None + return data["data"]["user"]["username"] if data["data"]["user"] is not None else None def login(self, user: str, passwd: str) -> None: """Log in to instagram with given username and password and internally store session object""" From af1ec22d41d5bbf7f7375b5103975c36321d74a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Koch-Kramer?= Date: Sun, 18 Mar 2018 17:42:47 +0100 Subject: [PATCH 2/2] Fix get_feed_posts() using graphql queries Due to changes at Instagram's API, it seems like it is no longer possible to get users' feeds without usage of graphql queries on some accounts. --- instaloader.py | 34 ++++++++++++++-------------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/instaloader.py b/instaloader.py index 87a79e6..5258f89 100755 --- a/instaloader.py +++ b/instaloader.py @@ -1185,30 +1185,22 @@ class Instaloader: def get_feed_posts(self) -> Iterator[Post]: """Get Posts of the user's feed.""" - data = self.get_json('', params={'__a': 1}) + if not self.is_logged_in: + return + data = self.graphql_query("d6f4427fbe92d846298cf93df0b937d3", {})["data"] while True: - if "graphql" in data: - is_edge = True - feed = data["graphql"]["user"]["edge_web_feed_timeline"] - elif "data" in data: - is_edge = True - feed = data["data"]["user"]["edge_web_feed_timeline"] - else: - is_edge = False - feed = data["feed"]["media"] - - if is_edge: - yield from (Post(self, edge["node"]) for edge in feed["edges"]) - else: - yield from (Post(self, node) for node in feed["nodes"]) - + feed = data["user"]["edge_web_feed_timeline"] + yield from (Post(self, edge["node"]) for edge in feed["edges"] + if not edge["node"]["__typename"] == "GraphSuggestedUserFeedUnit") if not feed["page_info"]["has_next_page"]: break - data = self.graphql_query(17863003771166879, {'fetch_media_item_count': 12, - 'fetch_media_item_cursor': feed["page_info"]["end_cursor"], - 'fetch_comment_count': 4, - 'fetch_like': 10}) + data = self.graphql_query("d6f4427fbe92d846298cf93df0b937d3", + {'fetch_media_item_count': 12, + 'fetch_media_item_cursor': feed["page_info"]["end_cursor"], + 'fetch_comment_count': 4, + 'fetch_like': 10, + 'has_stories': False})["data"] def download_feed_posts(self, max_count: int = None, fast_update: bool = False, filter_func: Optional[Callable[[Post], bool]] = None) -> None: @@ -1244,6 +1236,8 @@ class Instaloader: def get_saved_posts(self) -> Iterator[Post]: """Get Posts that are marked as saved by the user.""" + if not self.is_logged_in: + return data = self.get_profile_metadata(self.username) user_id = data["user"]["id"]