def get_media(self, obj, pointer=None, count=12, settings={}, limit=50): if not isinstance(obj, HasMediaElement): raise TypeError("'obj' must be HasMediaElement type") if not isinstance(count, int): raise TypeError("'count' must be int type") if not isinstance(settings, dict): raise TypeError("'settings' must be dict type") if not isinstance(limit, int): raise TypeError("'limit' must be int type") data = self.update(obj, settings) variables_string = '{{"{name}":"{name_value}","first":{first},"after":"{after}"}}' medias = [] if pointer is None: try: data = data[obj._media_path[-1]] page_info = data["page_info"] edges = data["edges"] for index in range(min(len(edges), count)): node = edges[index]["node"] m = Media(node["shortcode"]) m._set_data(node) if isinstance(obj, Account): m.likes_count = node["edge_media_preview_like"][ "count"] m.owner = obj else: m.likes_count = node["edge_liked_by"] obj.media.add(m) medias.append(m) if page_info["has_next_page"]: pointer = page_info["end_cursor"] if len(edges) < count and page_info["has_next_page"]: count = count - len(edges) else: return medias, pointer except (ValueError, KeyError) as exception: raise UnexpectedResponse( exception, "https://www.instagram.com/" + obj._base_url + getattr(obj, obj._primary_key), data, ) while True: data = {"after": pointer, "first": min(limit, count)} if isinstance(obj, Tag): data["name"] = "tag_name" data["name_value"] = obj.name else: data["name"] = "id" data["name_value"] = obj.id response = self._graphql_request( query_hash=obj._media_query_hash, variables=variables_string.format(**data), settings=settings, ) try: data = response.json()["data"] for key in obj._media_path: data = data[key] page_info = data["page_info"] edges = data["edges"] for index in range(min(len(edges), count)): node = edges[index]["node"] m = Media(node["shortcode"]) m._set_data(node) if isinstance(obj, Account): m.likes_count = node["edge_media_preview_like"][ "count"] m.owner = obj else: m.likes_count = node["edge_liked_by"] obj.media.add(m) medias.append(m) if page_info["has_next_page"]: pointer = page_info["end_cursor"] else: pointer = None if len(edges) < count and page_info["has_next_page"]: count = count - len(edges) else: return medias, pointer except (ValueError, KeyError) as exception: raise UnexpectedResponse(exception, response.url, response.text)
def get_media(self, obj, pointer=None, count=12, settings={}, limit=50): if not isinstance(obj, HasMediaElement): raise TypeError("'obj' must be HasMediaElement type") if not isinstance(count, int): raise TypeError("'count' must be int type") if not isinstance(settings, dict): raise TypeError("'settings' must be dict type") if not isinstance(limit, int): raise TypeError("'limit' must be int type") data = self.update(obj, settings) variables_string = '{{"{name}":"{name_value}","first":{first},"after":"{after}"}}' medias = [] if pointer is None: try: data = data[obj._media_path[-1]] page_info = data["page_info"] edges = data["edges"] for index in range(min(len(edges), count)): node = edges[index]["node"] m = Media(node["shortcode"]) m._set_data(node) if isinstance(obj, Account): m.likes_count = node["edge_media_preview_like"]["count"] m.owner = obj else: m.likes_count = node["edge_liked_by"] obj.media.add(m) medias.append(m) if page_info["has_next_page"]: pointer = page_info["end_cursor"] if len(edges) < count and page_info["has_next_page"]: count = count - len(edges) else: return medias, pointer except (ValueError, KeyError): raise UnexpectedResponse( "https://www.instagram.com/" + obj._base_url + getattr(obj, obj._primary_key), data, ) if not "params" in settings: settings["params"] = {"query_hash": obj._media_query_hash} else: settings['params']['query_hash'] = obj._media_query_hash while True: data = {"after": pointer, "first": min(limit, count)} if isinstance(obj, Tag): data["name"] = "tag_name" data["name_value"] = obj.name else: data["name"] = "id" data["name_value"] = obj.id settings["params"]["variables"] = variables_string.format(**data) if not "headers" in settings: settings["headers"] = { "X-Instagram-GIS": "%s:%s" % (self._rhx_gis, settings["params"]["variables"]), } else: settings["headers"]["X-Instagram-GIS"] = \ "%s:%s" % (self._rhx_gis, settings["params"]["variables"]) settings["headers"]["X-Instagram-GIS"] = \ hashlib.md5(settings["headers"]["X-Instagram-GIS"].encode("utf-8")).hexdigest() settings["headers"]["X-Requested-With"] = "XMLHttpRequest" response = self._get_request("https://www.instagram.com/graphql/query/", **settings) try: data = response.json()["data"] for key in obj._media_path: data = data[key] page_info = data["page_info"] edges = data["edges"] for index in range(min(len(edges), count)): node = edges[index]["node"] m = Media(node["shortcode"]) m._set_data(node) if isinstance(obj, Account): m.likes_count = node["edge_media_preview_like"]["count"] m.owner = obj else: m.likes_count = node["edge_liked_by"] obj.media.add(m) medias.append(m) if page_info["has_next_page"]: pointer = page_info["end_cursor"] else: pointer = None if len(edges) < count and page_info["has_next_page"]: count = count-len(edges) else: return medias, pointer except (ValueError, KeyError): raise UnexpectedResponse(response.url, response.text)