Use more reliable query for own profile for :saved
Adds a method Profile.own_profile() which uses the test_login() query for obtaining the own profile. This method is used for accesssing saved posts (Profile.get_saved_posts() on own profile). Also removes the now-unneeded self._obtain_metadata() call in Profile.get_saved_posts(), and changes the NodeIterator such that data is never None and the count property is more likely available. Fixes #563.
This commit is contained in:
parent
3a6ba6485e
commit
13612c606e
@ -856,7 +856,7 @@ class Instaloader:
|
|||||||
"""
|
"""
|
||||||
self.context.log("Retrieving saved posts...")
|
self.context.log("Retrieving saved posts...")
|
||||||
assert self.context.username is not None # safe due to @_requires_login; required by typechecker
|
assert self.context.username is not None # safe due to @_requires_login; required by typechecker
|
||||||
node_iterator = Profile.from_username(self.context, self.context.username).get_saved_posts()
|
node_iterator = Profile.own_profile(self.context).get_saved_posts()
|
||||||
self.posts_download_loop(node_iterator, ":saved",
|
self.posts_download_loop(node_iterator, ":saved",
|
||||||
fast_update, post_filter,
|
fast_update, post_filter,
|
||||||
max_count=max_count, total_count=node_iterator.count)
|
max_count=max_count, total_count=node_iterator.count)
|
||||||
|
@ -81,11 +81,13 @@ class NodeIterator(Iterator[T]):
|
|||||||
self._node_wrapper = node_wrapper
|
self._node_wrapper = node_wrapper
|
||||||
self._query_variables = query_variables if query_variables is not None else {}
|
self._query_variables = query_variables if query_variables is not None else {}
|
||||||
self._query_referer = query_referer
|
self._query_referer = query_referer
|
||||||
self._data = first_data
|
|
||||||
self._page_index = 0
|
self._page_index = 0
|
||||||
self._total_index = 0
|
self._total_index = 0
|
||||||
self._best_before = (None if first_data is None else
|
if first_data is not None:
|
||||||
datetime.now() + NodeIterator._shelf_life)
|
self._data = first_data
|
||||||
|
self._best_before = datetime.now() + NodeIterator._shelf_life
|
||||||
|
else:
|
||||||
|
self._data = self._query()
|
||||||
|
|
||||||
def _query(self, after: Optional[str] = None) -> Dict:
|
def _query(self, after: Optional[str] = None) -> Dict:
|
||||||
pagination_variables = {'first': NodeIterator._graphql_page_length} # type: Dict[str, Any]
|
pagination_variables = {'first': NodeIterator._graphql_page_length} # type: Dict[str, Any]
|
||||||
@ -113,8 +115,6 @@ class NodeIterator(Iterator[T]):
|
|||||||
return self
|
return self
|
||||||
|
|
||||||
def __next__(self) -> T:
|
def __next__(self) -> T:
|
||||||
if self._data is None:
|
|
||||||
self._data = self._query()
|
|
||||||
if self._page_index < len(self._data['edges']):
|
if self._page_index < len(self._data['edges']):
|
||||||
node = self._data['edges'][self._page_index]['node']
|
node = self._data['edges'][self._page_index]['node']
|
||||||
page_index, total_index = self._page_index, self._total_index
|
page_index, total_index = self._page_index, self._total_index
|
||||||
@ -193,8 +193,12 @@ class NodeIterator(Iterator[T]):
|
|||||||
self._query_referer != frozen.query_referer or
|
self._query_referer != frozen.query_referer or
|
||||||
self._context.username != frozen.context_username):
|
self._context.username != frozen.context_username):
|
||||||
raise InvalidArgumentException("Mismatching resume information.")
|
raise InvalidArgumentException("Mismatching resume information.")
|
||||||
|
if not frozen.best_before:
|
||||||
|
raise InvalidArgumentException("\"best before\" date missing.")
|
||||||
|
if frozen.remaining_data is None:
|
||||||
|
raise InvalidArgumentException("\"remaining_data\" missing.")
|
||||||
self._total_index = frozen.total_index
|
self._total_index = frozen.total_index
|
||||||
self._best_before = datetime.fromtimestamp(frozen.best_before) if frozen.best_before else None
|
self._best_before = datetime.fromtimestamp(frozen.best_before)
|
||||||
self._data = frozen.remaining_data
|
self._data = frozen.remaining_data
|
||||||
|
|
||||||
|
|
||||||
|
@ -579,6 +579,17 @@ class Profile:
|
|||||||
context.profile_id_cache[profile_id] = profile
|
context.profile_id_cache[profile_id] = profile
|
||||||
return profile
|
return profile
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def own_profile(cls, context: InstaloaderContext):
|
||||||
|
"""Return own profile if logged-in.
|
||||||
|
|
||||||
|
:param context: :attr:`Instaloader.context`
|
||||||
|
|
||||||
|
.. versionadded:: 4.5.2"""
|
||||||
|
if not context.is_logged_in:
|
||||||
|
raise LoginRequiredException("--login required to access own profile.")
|
||||||
|
return cls(context, context.graphql_query("d6f4427fbe92d846298cf93df0b937d3", {})["data"]["user"])
|
||||||
|
|
||||||
def _asdict(self):
|
def _asdict(self):
|
||||||
json_node = self._node.copy()
|
json_node = self._node.copy()
|
||||||
# remove posts to avoid "Circular reference detected" exception
|
# remove posts to avoid "Circular reference detected" exception
|
||||||
@ -802,7 +813,6 @@ class Profile:
|
|||||||
if self.username != self._context.username:
|
if self.username != self._context.username:
|
||||||
raise LoginRequiredException("--login={} required to get that profile's saved posts.".format(self.username))
|
raise LoginRequiredException("--login={} required to get that profile's saved posts.".format(self.username))
|
||||||
|
|
||||||
self._obtain_metadata()
|
|
||||||
return NodeIterator(
|
return NodeIterator(
|
||||||
self._context,
|
self._context,
|
||||||
'f883d95537fbcd400f466f63d42bd8a1',
|
'f883d95537fbcd400f466f63d42bd8a1',
|
||||||
@ -810,7 +820,6 @@ class Profile:
|
|||||||
lambda n: Post(self._context, n),
|
lambda n: Post(self._context, n),
|
||||||
{'id': self.userid},
|
{'id': self.userid},
|
||||||
'https://www.instagram.com/{0}/'.format(self.username),
|
'https://www.instagram.com/{0}/'.format(self.username),
|
||||||
self._metadata('edge_saved_media'),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def get_tagged_posts(self) -> NodeIterator[Post]:
|
def get_tagged_posts(self) -> NodeIterator[Post]:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user