【问题标题】:Facebook Graph API get all users and their statusFacebook Graph API 获取所有用户及其状态
【发布时间】:2011-03-29 22:46:18
【问题描述】:

我正在使用 Facebook Graph API,我想知道是否可以在一次调用中获取所有用户及其当前状态的列表?

我基本上想要与https://graph.facebook.com/me/friends 相同的结果,但每个对象都包含当前状态。

感谢您的帮助!

编辑:

这里有一些说明。如果https://graph.facebook.com/me/friends?access_token=... 告诉我这个:(也就是我所有朋友的列表)

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

什么 URL 或 FQL 会告诉我这个:(也就是我所有朋友及其状态的列表)

{
  "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 多个电话。

【问题讨论】:

  • 2500+ 次观看,没有 +1?爱在哪里!? :)

标签: json facebook facebook-graph-api


【解决方案1】:

虽然新的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);
?>

在这里,我们在第一个查询中获取用户 ID 和名称,并从第二个查询中获取状态消息。
现在这将在第一个查询或第二个查询中返回更少的结果!因为:

  • 朋友可能没有为last 30 days 发布状态消息,因此它不会出现在第二个查询中(第二个查询的结果集较少)。
  • 朋友可能在过去 30 天内发布了多个状态消息(它应该全部返回 - 最多 50 条?!!)我不确定,但如果这是case 那么第二个将/应该返回比第一个更多的结果。所以我只收到一条消息(注意break)。

【讨论】:

  • 向您致敬,先生。很好的答案:)
  • @ifaour - 我正在整理一些与您的答案非常相似的东西。但是考虑一下这种情况。假设我有 100 个朋友,每个朋友昨天都发布了一条状态消息。但是您的 query2 仍将返回最多 50 个最新帖子,对吗?所以它不能像 joe 想要的那样在一次 fql 调用中完成,或者我走错了路。
  • @Gublooo:这正是我最后两点的意思。结果可能不如预期!但我不确定,因为我的 100 多个朋友结果只返回了 29 条状态消息!我认为如果 Batch API 按预期工作,它应该可以解决这个问题。
  • 非常感谢!我打算玩多查询,但我注意到整个 50 限制......有没有办法“跳过”已经收到的项目?我对FQL不太熟悉,所以可能很简单
  • @joe_coolish:已经收到的物品是什么意思?你的意思是来自一个朋友的多条消息?我不确定......而且我不确定表限制是否适用于整个查询(最有可能)或每个“uid”。
【解决方案2】:

试试下面的fql:

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

只需确保限制在特定日期,因为默认情况下这将返回最近 50 次更新/或最近 30 天的活动。

【讨论】:

  • 来自关于状态表的 Facebook 文档:developers.facebook.com/docs/reference/fql/status 供您参考。
  • 非常感谢,但这只是状态。有没有办法获取 id 和 name 呢?问题是 FQL 的多表问题,我不知道如何解决它。
  • 可以获取id。请参阅编辑后的帖子。至于名称,在 FQL 中无法连接表,但您可以使用多个查询并自己构建正确的 json 对象。这就是 Facebook 的工作方式。
  • 感谢 Elad——这很好用。一个变化是“从朋友那里选择 uid2..”到“从朋友那里选择 uid2..”
【解决方案3】:

您好,您只需要获得user_status or friend_status 的扩展权限,任何对我对象的调用都会获取用户当前状态...

json_decode(file_get_contents('https://graph.facebook.com/me/friends?access_token='.$cookie['access_token']));

【讨论】:

  • 不完全是我想要的。我更新了我的帖子并进行了一些澄清
  • 好的,现在检查我编辑的答案。但是要获得我上面提到的外部权限
【解决方案4】:

感谢@mgilson 的回答,这可以像这样组合成一个 FQL 语句:

SELECT status_id,uid,message FROM status WHERE uid IN (SELECT uid FROM user WHERE uid IN(SELECT uid2 FROM friend WHERE uid1=me()))

我发现的魔力是请求friends_status 权限,该权限将从公共帖子向朋友和其他人开放,这有助于复制墙的感觉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2011-08-12
    • 1970-01-01
    相关资源
    最近更新 更多