将Facebook API批处理请求转换为FQL多重查询

时间:2012-06-16 03:59:57

标签: facebook facebook-graph-api

我的网络应用程序为Facebook图形API构建批量请求。批处理是通过第一次API调用来抓取用户的朋友。然后我遍历朋友列表并为每个朋友添加一个特定的请求(使用该用户的特定访问令牌)并将每个请求添加到批处理中。所以它最终是两个API调用。不幸的是,它真的很慢,我听说FQL请求更快。

所以我的问题是,我可以用FQL做到这一点吗?我已经阅读the documentation但我无法弄清楚如何返回,例如,朋友的工作历史的所有朋友(需要每个朋友的访问令牌)只有一个FQL查询。这可能吗?显然我可以构建一个FQL请求的批处理请求,但这会让我回到我开始的地方。

更新 我做了一些测试,FQL肯定比批量请求更快。我的FQL多重查询看起来像这样:

$multiQuery = array(
"query1"=>"SELECT uid2 FROM friend WHERE uid1 = me()", //LIST OF FRIEND IDs
"query2"=>"SELECT uid, name, work, education, is_app_user FROM user WHERE uid IN (SELECT uid2 FROM #query1)", //FRIEND PROFILES
"query3"=>"SELECT uid2 FROM friend WHERE uid1 IN (SELECT uid FROM #query2 WHERE is_app_user=1)",
"query4"=>"SELECT uid, name, work, education FROM user WHERE uid IN (SELECT uid2 FROM #query3)"
);

$multiQueryResult = $facebook->api(array(
'method'   => 'fql.multiquery',
'queries'  => $multiQuery
));

var_dump( $multiQueryResult );

查询有效,但有两个问题:

  1. query3返回所有用户ID,而不仅仅是已授权的用户ID 我的应用。

  2. query4不会返回工作/教育领域......大概是 因为正在使用当前用户调用API请求 访问令牌(与query3中的特定用户相反)。我已将授权用户的访问权限存储在数据库中,但我不知道是否可以在此上下文中使用它们。

  3. 可以用FQL完成吗?我可以在FQL多查询中定义唯一的访问令牌吗?

2 个答案:

答案 0 :(得分:0)

  

朋友工作历史的所有朋友(需要每个朋友的访问令牌)

如果您需要不同的访问权限,那么显然没有办法在单个请求中执行此操作...但是如果他们最近没有与您的应用程序进行交互,那么您在哪里可以让我的每个朋友都访问令牌?如果他们有,你可以获得他们的工作信息然后把它放到你自己的数据库中,这样你就可以从那里使用朋友的uid进行查找。否则,我认为这是真的是你的方式。

它更像是这样:

如果您的用户的朋友设置了他们的隐私设置,以便他们愿意与您的用户使用的应用分享他们的工作信息,那么您可以获得该信息,而无需为这些朋友中的每个朋友提供单独的访问令牌。然后你就可以像这样做一个FQL查询,

SELECT uid, name, work FROM user WHERE uid IN
  (SELECT uid1 FROM friend WHERE uid2 = me())

这将为您的用户的朋友提供工作信息 - 但显然只适用于愿意与朋友使用的应用共享该信息的用户。

答案 1 :(得分:0)

这不是我原来问题的真正答案,因为似乎没有答案。似乎在撰写本文时,Facebook批量请求真的很慢......这太糟糕了,因为这基本上打败了它的整个目的。