Медиа-посты Instagram Graph API между датами

Я пытаюсь получить сообщения СМИ за последний месяц из профиля Instagram Business, которым я управляю, используя 'since' и 'until', но, похоже, это не работает должным образом, поскольку API возвращает сообщения, которые выходят за выбранный мной временной диапазон.

Я использую следующую строку для вызова API:

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

в то время как фрагмент Python будет таким (с использованием того же init скрипт из 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')

где get.connections

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)

и запрос

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

По сути, я хотел бы получать сообщения за определенный период, а затем получать информацию для каждого из них.

Кто-нибудь сталкивался с этой проблемой раньше?


person Dan    schedule 21.05.2018    source источник
comment
Я столкнулся с той же проблемой. До сих пор я пытался использовать «с» и «до» с отметкой времени UNIX, поскольку похоже, что они используют этот формат для фильтрации данных на уровне учетной записи, но безуспешно. Вы нашли решение, так как вы опубликовали это?   -  person Flavien    schedule 20.06.2018
comment
Привет Флавиен, я разместил обновление ниже.   -  person Dan    schedule 20.06.2018
comment
Этому посту 1 год. Есть ли известные обновления?   -  person Amit    schedule 06.04.2019


Ответы (2)


К сожалению, параметры since и until не поддерживаются на этой конечной точке, и эта конечная точка поддерживает только разбиение на страницы на основе курсора. Единственный способ сделать то, что я хочу сделать, это загрузить каждую страницу результатов по отдельности, используя курсоры before и after, представленные в ответе API.

person Dan    schedule 20.06.2018

Для вашей задачи я бы рекомендовал вам не использовать библиотеку InstagramAPI. Я покажу вам простое решение для этого с использованием библиотеки instabot. Для установки pip этой библиотеки используйте эту команду:

pip install instabot

Используйте следующий код Python, чтобы получить медиа в указанном диапазоне дат.

import datetime
from instabot import Bot
bot = Bot()
bot.login(username="YOUR USERNAME", password="YOUR PASSWORD")

def get_media_posts(start_date, end_date):
   all_posts = bot.get_your_medias()
   filtered_posts = []

    for post in all_posts:
        post_info = bot.get_media_info(post) #the media info for the post
        post_timestamp = post_info[0].get('taken_at') #get the timestamp of the post
        post_date = datetime.datetime.fromtimestamp(post_timestamp).date() #convert timestamp to date

        if post_date >= start_date and post_date <= end_date:
            filtered_posts.append(post) #or you can also use: filtered_posts.append(post_info)

    return filtered_posts

Это вернет вам список всех сообщений за указанную дату, и вы можете использовать bot.get_media_info(post), чтобы увидеть, что находится внутри каждого сообщения.

ПРИМЕЧАНИЕ. start_date и end_date должны быть в формате date() (а не в формате datetime) в соответствии с этим кодом, но вы можете сравнить с любой функцией datetime, которую хотите :)

person za_ali33    schedule 06.04.2020