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



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

所以我的问题是,我可以用 FQL 做到这一点吗?我已经阅读了文档,但我无法弄清楚如何返回,例如,使用单个 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 中特定用户的访问令牌相反)。我已经将授权用户的访问令牌存储在数据库中,但我不知道是否可以在此上下文中使用它们。

这可以用 FQL 完成吗?是否可以在 FQL 多查询中定义唯一的访问令牌?

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

如果您需要不同的访问令牌,那么显然无法在一个请求中做到这一点......但是,无论如何,如果我的每个朋友最近没有与您的应用程序进行交互,您将从哪里获得访问令牌?如果他们愿意,你可以已经得到他们的工作信息并将其放入你自己的数据库中,这样你就可以使用我朋友的uid进行查找就可以从那里获取它。否则,我认为这不是你的真正方式。

宁愿是这样的:

如果用户的好友已设置其隐私设置,以便他们愿意与用户正在使用的应用共享其工作信息,则你可以获取该信息,而无需为每个好友提供单独的访问令牌。然后,您只需执行这样的 FQL 查询,

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

这将为您提供用户的朋友工作信息 - 但显然仅适用于那些愿意与朋友正在使用的应用程序共享该信息的人。

这不是我最初问题的答案,因为似乎没有答案。似乎在撰写本文时,Facebook的批处理请求真的很慢......这太糟糕了,因为这基本上违背了它的全部目的。

最新更新