Facebook Graph API получают всех пользователей и их статус - PullRequest
9 голосов
/ 30 марта 2011

Я использую API Graph Facebook, и мне было интересно, есть ли возможность получить список всех пользователей и их текущий статус за один звонок?

Мне нужны те же результаты, что и https://graph.facebook.com/me/friends но с текущим статусом для каждого объекта.

Спасибо за любую помощь!

РЕДАКТИРОВАТЬ:

Вот некоторые пояснения.если https://graph.facebook.com/me/friends?access_token=... получит мне это: (AKA список всех моих друзей)

{
  "data": [
    {
      "name": "Foo",
      "id": "1"
    },
    {
      "name": "Bar",
      "id": "2"
    },
    {
      "name": "Foo Bar",
      "id": "3"
    },
    {
      "name": "Bar Foo",
      "id": "4"
    }
  ]
}

какой URL или FQL получит мне это: (AKA список всех моих друзей и их статусы)

{
  "data": [
    {
      "name": "Foo",
      "id": "1"
      "status": "This is my current status!"
    },
    {
      "name": "Bar",
      "id": "2"
      "status": "This is my current status!"
    },
    {
      "name": "Foo Bar",
      "id": "3"
      "status": "This is my current status!"
    },
    {
      "name": "Bar Foo",
      "id": "4"
      "status": "This is my current status!"
    }
  ]
}

Я хочу сделать только один звонок, потому что, в отличие от меня, у большинства людей есть более 100 друзей, и я не хочу делать 100+ звонков, чтобы получить статусы.

Ответы [ 4 ]

8 голосов
/ 04 апреля 2011

Хотя новый Batch API должен выполнять то, что вы просите, мне не удалось заставить его работать должным образом.Кажется, он все еще глючит.

Теперь, чтобы достичь этого с помощью fql.multiquery, приведем краткий пример:

<?php
$app_id = "APP_ID";
$app_secret = "APP_SECRET"; 
$my_url = "REDIRECT_URL";

$code = $_REQUEST["code"];

if(empty($code)) {
$dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" 
  . $app_id . "&redirect_uri=" . urlencode($my_url);

echo("<script> top.location.href='" . $dialog_url 
  . "'</script>");
}

$token_url = "https://graph.facebook.com/oauth/access_token?client_id="
. $app_id . "&redirect_uri=" . urlencode($my_url) 
. "&client_secret=" . $app_secret 
. "&code=" . $code;

$access_token = file_get_contents($token_url);

$queries = '{"query1":"SELECT uid,name FROM user WHERE uid IN(SELECT uid2 FROM friend WHERE uid1=me())","query2":"SELECT uid,message FROM status WHERE uid IN (SELECT uid FROM #query1)"}';
$multiquery = "https://api.facebook.com/method/fql.multiquery?queries=" . urlencode($queries) . "&format=json&" . $access_token;
$res = json_decode(file_get_contents($multiquery), TRUE);

$final = array();
foreach( $res[1]['fql_result_set'] as $i=>$message_arr ) {
    foreach( $res[0]['fql_result_set'] as $j=>$friend ) {
        if( $message_arr['uid'] == $friend['uid'] ) {
            $friend['message'] = $message_arr['message'];
            $final[] = $friend;
            break;
        }
    }
}
print_r($final);
?>

Здесь мы получаем идентификатор пользователя и имя в первом запросе и получаемсообщения о состоянии от второго.
Теперь это вернет меньше результатов в первом или втором запросе!потому что:

  • Возможно, друг не опубликовал сообщение о состоянии за последние 30 дней , поэтому оно не будет отображаться во втором запросе (второй содержит меньше результирующего набора).
  • Друг, возможно, опубликовал более одного сообщения о статусе за последние 30 дней (оно должно вернуть их все - до 50? !!) Я не уверен, но если этоВ этом случае второй будет / должен вернуть больше результатов, чем первый.Поэтому я получаю только одно сообщение (обратите внимание на break).
3 голосов
/ 04 апреля 2011

Попробуйте следующее fql:

Select uid, message from status where uid in (select uid2 from friends where uid1 = [active user id])

Просто убедитесь, что вы ограничены определенной датой, поскольку по умолчанию будут возвращаться последние 50 обновлений / или последние 30 дней активности.

0 голосов
/ 14 декабря 2013

Спасибо @mgilson за его ответ, это можно объединить в один оператор FQL, например:

ВЫБРАТЬ status_id, uid, сообщение ОТ статуса ГДЕ ВХОД (ВЫБРАТЬ uid ОТ ПОЛЬЗОВАТЕЛЯ ГДЕ (ВЫБРАТЬ uid2 ОТ ДРУГОГО ГДЕ uid1 = me ()))

Волшебство, которое я обнаружил, это запрос разрешения friends_status, которое откроется из общедоступных постов для друзей и других, которые помогают воспроизвести ощущение стены.

0 голосов
/ 04 апреля 2011

привет, вам просто нужно получить расширенное разрешение user_status или friend_status для этого, и любой вызов объекта me будет захватывать текущий статус пользователя ...

json_decode(file_get_contents('https://graph.facebook.com/me/friends?access_token='.$cookie['access_token']));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...