使用FQL获取所有Facebook消息

时间:2013-03-25 11:45:03

标签: facebook facebook-graph-api facebook-fql

我需要为具有FQL的facebook用户获取线程内的所有用户线程和消息。

当我运行以下FQL时,它返回所有线程ID

select thread_id,message_count from thread where viewer_id = me() and folder_id = 0

在收件箱文件夹中显示主题和消息计数

    {
  "data": [
    {
      "thread_id": "196940283688620", 
      "message_count": 99
    }, 
    {
      "thread_id": "283904071679203", 
      "message_count": 1
    }, 

但是当我运行以下查询来获取给定thread_id中的所有消息时,假设 "thread_id": "196940283688620",

select message_id,body,viewer_id , thread_id from message where thread_id = 196940283688620 and viewer_id = me()

由于第一个查询结果显示我在 "thread_id": "196940283688620", 中有99条消息,但查询只返回了20条消息。

1-我错了什么?我需要在单个FQL中获取线程中的所有消息,还是需要多个FQL? 2-对于经过Facebook身份验证的用户,获取线程内所有线程和消息的最佳方法是什么。

2 个答案:

答案 0 :(得分:4)

我的解决方案是这样的:

SELECT message_id,body,viewer_id, thread_id FROM message 
  WHERE thread_id = 196940283688620 AND viewer_id = me() LIMIT 0,30 

获得前30个结果 然后

SELECT message_id,body,viewer_id, thread_id FROM message 
      WHERE thread_id = 196940283688620 AND viewer_id = me() LIMIT 30,60

接下来的30个元素。

等等......我还没有找到更好的解决方案。

答案 1 :(得分:3)

对于Facebook没有返回线程中显示的所有消息的问题,您可能会遇到默认的内部限制。您可以通过在FQL中使用LIMIT语句来绕过此:

SELECT message_id,body,viewer_id, thread_id FROM message 
  WHERE thread_id = 196940283688620 AND viewer_id = me() LIMIT 200

根据我的经验,Facebook根据对象设置最多500或5000项。当您超过最大值时,您将开始获得的项目少于您返回的限制。此时,您需要找到一种通过多个查询对数据进行分页的方法。

至于获取所有线程和消息的最有效方法,它是FQL multiquery

您可以将查询重组为如下所示:(为了便于阅读而添加了空格)

 {'msg_threads':
    'SELECT thread_id,message_count FROM thread WHERE viewer_id = me() AND folder_id = 0',
  'msg_messages':
    'SELECT message_id,body,viewer_id, thread_id FROM message 
       WHERE thread_id IN (SELECT thread_id FROM #msg_threads)
       AND viewer_id = me() LIMIT 200'
  }