mirror of
https://github.com/instaloader/instaloader.git
synced 2026-10-16 21:52:17 -07:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bfc882306b | ||
|
|
14e9cf435e | ||
|
|
83b31175df | ||
|
|
92114f9018 |
Vendored
+3
@@ -0,0 +1,3 @@
|
||||
<h3>New Documentation URL</h3>
|
||||
<div class="danger"><p style="margin-left: 1em"><b>Instaloader's Documentation has been moved to
|
||||
<a class="reference external" href="https://instaloader.github.io/">https://instaloader.github.io</a>.</b></p></div>
|
||||
+2
-1
@@ -37,7 +37,8 @@ certain source::
|
||||
L.download_post(post, target='#cat')
|
||||
|
||||
Besides :func:`Instaloader.get_hashtag_posts`, there is
|
||||
:func:`Instaloader.get_feed_posts` and :func:`Instaloader.get_profile_posts`.
|
||||
:func:`Instaloader.get_feed_posts`, :func:`Instaloader.get_profile_posts` and
|
||||
:func:`Instaloader.get_saved_posts`.
|
||||
Also, :class:`Post` instances can be created with :func:`Post.from_shortcode`
|
||||
and :func:`Post.from_mediaid`.
|
||||
|
||||
|
||||
+4
-1
@@ -191,7 +191,10 @@ html_static_path = ['_static']
|
||||
|
||||
# Custom sidebar templates, maps document names to template names.
|
||||
#
|
||||
html_sidebars = {'**': ["caption.html", "globaltoc.html", "relations.html", "links.html"] }
|
||||
if not os.environ.get("READTHEDOCS"):
|
||||
html_sidebars = {'**': ["caption.html", "globaltoc.html", "relations.html", "links.html"] }
|
||||
else:
|
||||
html_sidebars = {'**': ["caption.html", "rtdmessage.html", "globaltoc.html", "relations.html", "links.html"] }
|
||||
|
||||
# Additional templates that should be rendered to pages, maps page names to
|
||||
# template names.
|
||||
|
||||
+24
-18
@@ -29,7 +29,7 @@ import requests.utils
|
||||
import urllib3
|
||||
|
||||
|
||||
__version__ = '3.3'
|
||||
__version__ = '3.3.1'
|
||||
|
||||
|
||||
try:
|
||||
@@ -169,7 +169,8 @@ class Post:
|
||||
"""
|
||||
Structure containing information about an Instagram post.
|
||||
|
||||
Created by Instaloader methods :meth:`.get_profile_posts`, :meth:`.get_hashtag_posts`, :meth:`.get_feed_posts`.
|
||||
Created by Instaloader methods :meth:`.get_profile_posts`, :meth:`.get_hashtag_posts`, :meth:`.get_feed_posts` and
|
||||
:meth:`.get_saved_posts`.
|
||||
Posts are linked to an :class:`Instaloader` instance which is used for error logging and obtaining of additional
|
||||
metadata, if required. This class unifies access to the properties associated with a post. It implements == and is
|
||||
hashable.
|
||||
@@ -1247,12 +1248,9 @@ class Instaloader:
|
||||
user_id = data["user"]["id"]
|
||||
|
||||
while True:
|
||||
if "graphql" in data:
|
||||
if "edge_saved_media" in data["user"]:
|
||||
is_edge = True
|
||||
saved_media = data["graphql"]["user"]["edge_saved_media"]
|
||||
elif "data" in data:
|
||||
is_edge = True
|
||||
saved_media = data["data"]["user"]["edge_saved_media"]
|
||||
saved_media = data["user"]["edge_saved_media"]
|
||||
else:
|
||||
is_edge = False
|
||||
saved_media = data["user"]["saved_media"]
|
||||
@@ -1266,7 +1264,7 @@ class Instaloader:
|
||||
break
|
||||
data = self.graphql_query("f883d95537fbcd400f466f63d42bd8a1",
|
||||
{'id': user_id, 'first': Instaloader.GRAPHQL_PAGE_LENGTH,
|
||||
'after': saved_media["page_info"]["end_cursor"]})
|
||||
'after': saved_media["page_info"]["end_cursor"]})['data']
|
||||
|
||||
def download_saved_posts(self, max_count: int = None, fast_update: bool = False,
|
||||
filter_func: Optional[Callable[[Post], bool]] = None) -> None:
|
||||
@@ -1383,7 +1381,8 @@ class Instaloader:
|
||||
def get_profile_metadata(self, profile_name: str) -> Dict[str, Any]:
|
||||
"""Retrieves a profile's metadata, for use with e.g. :meth:`get_profile_posts` and :meth:`check_profile_id`."""
|
||||
try:
|
||||
return self.get_json('{}/'.format(profile_name), params={'__a': 1})
|
||||
metadata = self.get_json('{}/'.format(profile_name), params={'__a': 1})
|
||||
return metadata['graphql'] if 'graphql' in metadata else metadata
|
||||
except QueryReturnedNotFoundException:
|
||||
raise ProfileNotExistsException('Profile {} does not exist.'.format(profile_name))
|
||||
|
||||
@@ -1391,10 +1390,17 @@ class Instaloader:
|
||||
"""Retrieve all posts from a profile."""
|
||||
profile_name = profile_metadata['user']['username']
|
||||
profile_id = int(profile_metadata['user']['id'])
|
||||
yield from (Post(self, node, profile=profile_name, profile_id=profile_id)
|
||||
for node in profile_metadata['user']['media']['nodes'])
|
||||
has_next_page = profile_metadata['user']['media']['page_info']['has_next_page']
|
||||
end_cursor = profile_metadata['user']['media']['page_info']['end_cursor']
|
||||
if 'media' in profile_metadata['user']:
|
||||
# backwards compatibility with old non-graphql structure
|
||||
yield from (Post(self, node, profile=profile_name, profile_id=profile_id)
|
||||
for node in profile_metadata['user']['media']['nodes'])
|
||||
has_next_page = profile_metadata['user']['media']['page_info']['has_next_page']
|
||||
end_cursor = profile_metadata['user']['media']['page_info']['end_cursor']
|
||||
else:
|
||||
yield from (Post(self, edge['node'], profile=profile_name, profile_id=profile_id)
|
||||
for edge in profile_metadata['user']['edge_owner_to_timeline_media']['edges'])
|
||||
has_next_page = profile_metadata['user']['edge_owner_to_timeline_media']['page_info']['has_next_page']
|
||||
end_cursor = profile_metadata['user']['edge_owner_to_timeline_media']['page_info']['end_cursor']
|
||||
while has_next_page:
|
||||
# We do not use self.graphql_node_list() here, because profile_metadata
|
||||
# lets us obtain the first 12 nodes 'for free'
|
||||
@@ -1455,13 +1461,13 @@ class Instaloader:
|
||||
if download_stories_only:
|
||||
return
|
||||
|
||||
if ("nodes" not in profile_metadata["user"]["media"] or
|
||||
not profile_metadata["user"]["media"]["nodes"]):
|
||||
raise ProfileHasNoPicsException("Profile %s: no pics found." % name)
|
||||
|
||||
# Iterate over pictures and download them
|
||||
self._log("Retrieving posts from profile {}.".format(name))
|
||||
totalcount = profile_metadata["user"]["media"]["count"]
|
||||
if "media" in profile_metadata["user"]:
|
||||
# backwards compatibility with old non-graphql structure
|
||||
totalcount = profile_metadata["user"]["media"]["count"]
|
||||
else:
|
||||
totalcount = profile_metadata["user"]["edge_owner_to_timeline_media"]["count"]
|
||||
count = 1
|
||||
for post in self.get_profile_posts(profile_metadata):
|
||||
self._log("[%3i/%3i] " % (count, totalcount), end="", flush=True)
|
||||
|
||||
Reference in New Issue
Block a user