Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Instagram graph api media posts between dates

I'm trying to retrieve last month's media posts from an Instagram Business profile I manage, by using 'since' and 'until', but it doesn't seem to work properly as the API returns posts which are out of the time range I selected.

I'm using the following string to call the API:

business_profile_id/media?fields=timestamp&since=2018-04-01&until=2018-04-30

while the Python snippet would be this (using the same init script from the facebook-python-sdk)

import facebook

graph = facebook.GraphAPI(access_token)
profile = graph.get_object(user)    
posts = graph.get_connections(profile['id'], 'media?fields=caption,permalink,timestamp&since=2018-04-01&until=2018-04-30')

where get.connections is

def get_connections(self, id, connection_name, **args):
    """Fetches the connections for given object."""
    return self.request(
        "{0}/{1}/{2}".format(self.version, id, connection_name), args)

and request is

def request(
        self, path, args=None, post_args=None, files=None, method=None):
    """Fetches the given path in the Graph API.
    We translate args to a valid query string. If post_args is
    given, we send a POST request to the given path with the given
    arguments.
    """
    if args is None:
        args = dict()
    if post_args is not None:
        method = "POST"

    # Add `access_token` to post_args or args if it has not already been
    # included.
    if self.access_token:
        # If post_args exists, we assume that args either does not exists
        # or it does not need `access_token`.
        if post_args and "access_token" not in post_args:
            post_args["access_token"] = self.access_token
        elif "access_token" not in args:
            args["access_token"] = self.access_token

    try:
        response = self.session.request(
            method or "GET",
            FACEBOOK_GRAPH_URL + path,
            timeout=self.timeout,
            params=args,
            data=post_args,
            proxies=self.proxies,
            files=files)
    except requests.HTTPError as e:
        response = json.loads(e.read())
        raise GraphAPIError(response)

    headers = response.headers
    if 'json' in headers['content-type']:
        result = response.json()
    elif 'image/' in headers['content-type']:
        mimetype = headers['content-type']
        result = {"data": response.content,
                  "mime-type": mimetype,
                  "url": response.url}
    elif "access_token" in parse_qs(response.text):
        query_str = parse_qs(response.text)
        if "access_token" in query_str:
            result = {"access_token": query_str["access_token"][0]}
            if "expires" in query_str:
                result["expires"] = query_str["expires"][0]
        else:
            raise GraphAPIError(response.json())
    else:
        raise GraphAPIError('Maintype was not text, image, or querystring')

    if result and isinstance(result, dict) and result.get("error"):
        raise GraphAPIError(result)
    return result

Basically I'd like to get posts for a certain period and then get insights for each one.

Has anyone encountered this problem before?

like image 858
Dan Avatar asked May 21 '18 11:05

Dan


People also ask

Does Instagram have an API for posting?

Today, we are launching a new feature on the Instagram Graph API Platform to make it easier for businesses to publish content. With this feature, Instagram Business accounts can schedule and publish posts to their Instagram Feeds from third-party platforms.

What are some of the limitations with Instagram's API?

Instagram gives every third-party application connected to its API a limit of how many times it can call their data. They have now reduced their API limit from 5,000 calls per hour to 200 calls per hour.


1 Answers

Unfortunately the since and until parameters are not supported on this endpoint and this endpoint has only support cursor based pagination. The only way to do what I wish to do is to load each page of results individually using the before and after cursors provided in the API response.

like image 108
Dan Avatar answered Oct 21 '22 10:10

Dan