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.
This commit is contained in:
André Koch-Kramer 2018-03-18 17:42:47 +01:00
parent f55334cd5b
commit af1ec22d41

View File

@ -1185,30 +1185,22 @@ class Instaloader:
def get_feed_posts(self) -> Iterator[Post]: def get_feed_posts(self) -> Iterator[Post]:
"""Get Posts of the user's feed.""" """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: while True:
if "graphql" in data: feed = data["user"]["edge_web_feed_timeline"]
is_edge = True yield from (Post(self, edge["node"]) for edge in feed["edges"]
feed = data["graphql"]["user"]["edge_web_feed_timeline"] if not edge["node"]["__typename"] == "GraphSuggestedUserFeedUnit")
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"])
if not feed["page_info"]["has_next_page"]: if not feed["page_info"]["has_next_page"]:
break break
data = self.graphql_query(17863003771166879, {'fetch_media_item_count': 12, data = self.graphql_query("d6f4427fbe92d846298cf93df0b937d3",
'fetch_media_item_cursor': feed["page_info"]["end_cursor"], {'fetch_media_item_count': 12,
'fetch_comment_count': 4, 'fetch_media_item_cursor': feed["page_info"]["end_cursor"],
'fetch_like': 10}) 'fetch_comment_count': 4,
'fetch_like': 10,
'has_stories': False})["data"]
def download_feed_posts(self, max_count: int = None, fast_update: bool = False, def download_feed_posts(self, max_count: int = None, fast_update: bool = False,
filter_func: Optional[Callable[[Post], bool]] = None) -> None: filter_func: Optional[Callable[[Post], bool]] = None) -> None:
@ -1244,6 +1236,8 @@ class Instaloader:
def get_saved_posts(self) -> Iterator[Post]: def get_saved_posts(self) -> Iterator[Post]:
"""Get Posts that are marked as saved by the user.""" """Get Posts that are marked as saved by the user."""
if not self.is_logged_in:
return
data = self.get_profile_metadata(self.username) data = self.get_profile_metadata(self.username)
user_id = data["user"]["id"] user_id = data["user"]["id"]