Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)