5

Вопрос по facebook, facebook-graph-api, ajax, javascript, php – Фейсбук API запросов на понимание

Для проекта мне нужно получить представление о странице в течение длительного периода времени (например, 1-2 года) в Facebook.

Я сначала попытался сделать один запрос, но оказалось, что только запрос

/PAGE_ID/insights?since=xxx&until=xxx

не возвращает все данные, которые я хочу (он каким-то образом подавляет данные, как будто существует некоторый предел размера ответа).

Затем я попытался разделить диапазон дат (например, 01.04.2011-01.04.2011 -> 01.04.2011-01.08.2011-01.12.2011-01.04.2011), что также не вполне сработало, как я хотел к.

Мой следующий подход состоял в том, чтобы запрашивать только те значения понимания, которые мне нужны, такие как «page_stories, page_impressions, ...». Запросы выглядели так

/PAGE_ID/insights/page_impressions/day?since=xxx&until=xxx

Это на самом деле работает, но не с AJAX. Иногда казалось, что некоторые запросы сбрасываются (особенно если я изменил вкладку браузера в Google Chrome), и мне нужно быть уверенным, что все запросы возвращают ответ. Синхронное решение просто заняло бы слишком много времени, учитывая, что для одного запроса требуется не менее 2 секунд, а с диапазоном дат в 2 года у меня может быть около 300 отдельных запросов, это просто слишком долго для выполнения.

В конце концов я наткнулся на возможность делать запросы в Фейсбуке, а это именно то, что мне нужно. Он может упаковать до 50 запросов за один звонок, что значительно снижает пропускную способность. И вот, где я застрял. API Facebook дает примеры того, как его использовать, но ни один из них не сработал, когда я тестировал их в Graph Explorer и через php facebook api sdk. Я пытался упаковать этот запрос

PAGE_ID/insights/page_fan_adds/day?since=1332486000&until=1333695600

в пакетном запросе, но не удалось.

Кажется, что API прослушивается. Это всегда дает мне эту ошибку, когда я использую вопросительный знак? в «относительной_урле»; поле.

{
  "error": {
    "message": "batch parameter must be a JSON array", 
    "type": "GraphBatchException"
  }
}

Вот что я попробовал:

Они дают «должен быть массив JSON»; ошибка:

?batch=[{"method":"GET","relative_url":"/PAGE_ID/insights/page_fan_adds/day?since=1332486000&until=1333695600"}]

Эти два фактически возвращают данные, но они игнорируют параметры:

?batch=[{"method":"GET","relative_url":"/PAGE_ID/insights/page_fan_adds/day","body":"since=1332486000 until=1333695600"}]
?batch=[{"method":"GET","relative_url":"/PAGE_ID/insights/page_fan_adds/day","body":"since=1332486000,until=1333695600"}]
?batch=[{"method":"GET","relative_url":"/PAGE_ID/insights/page_fan_adds/day","body":{"since":"1332486000","until":"1333695600"}}]

И этот говорит мне, что это «неподдерживаемый почтовый запрос»:

?batch=[{"method":"POST","relative_url":"/PAGE_ID/insights/page_fan_adds/day","body":"since=1332486000 until=1333695600"}]

Может кто-нибудь помочь?

  • Вау, интересный обходной путь. Не забудьте пометить свой ответ как принятый.

    от
  • Это сбивало меня с толку, поэтому я решил добавить существующий ответ.

    от
  • На самом деле вам нужно только обработать значениеlative_url с помощью urlencode,

    от
  • @Madc правильно, но это сводило меня с ума, спасибо!

    от
  • Первоначальный ответ правильный, решения @ madc недостаточно для больших партий. Ура Ke Vin!

    от
  • БЛАГОДАРЮ ВАС!!!!!!!!!

    от
  • 0

    Этот пример для использования

    array идентификаторов, чтобы сделать пакетный запрос с urlencoding.

    $postIds = [
        'XXXXXXXXXXXXXXX_XXXXXXXXXXXXXXX',
        'XXXXXXXXXXXXXXX_XXXXXXXXXXXXXXX',
        'XXXXXXXXXXXXXXX_XXXXXXXXXXXXXXX',
        'XXXXXXXXXXXXXXX_XXXXXXXXXXXXXXX',
        'XXXXXXXXXXXXXXX_XXXXXXXXXXXXXXX',
    ];
    
    $queries = [];
    foreach( $postIds as $postId ) {
        $queries[] = [
            'method'        => 'GET',
            'relative_url'  => '/' . $postId . '/comments?summary=1&filter=stream&order=reverse_chronological',
        ];
    }
    
    $requests = $facebook->post( '?batch=' . urlencode( json_encode( $queries ) ) )->getGraphNode();
    

  • 27

    Я наконец нашел решение своей проблемы. Это не упоминается в документа

    ции Facebook, но для этого запроса

    ?batch=[{"method":"GET","relative_url":"/PAGE_ID/insights/page_fan_adds/day?since=1332486000&until=1333695600"}]
    

    чтобы правильно работать, мы должны использовать такую функцию, как

    urlencode()
    

    кодировать часть JSON. Таким образом, запросы работают как шарм. Пример PHP:

    $insights = $facebook->api('?batch=['.urlencode('{"method":"GET","relative_url":"/PAGE_ID/insights/page_fan_adds/day?since=1332572400&until=1333782000"}').']'
        ,'post',array('access_token' => $this->facebook->getAccessToken()));
    

    что приводит к этому:

    ?batch=[%7B%22method%22%3A%22GET%22%2C%22relative_url%22%3A%22%2FPAGE_ID%2Finsights%2Fpage_fan_adds%2Fday%3Fsince%3D1300086000%26until%3D1307862000%22%7D]