如何获取Facebook页面的所有帖子ID?

时间:2015-08-17 18:22:48

标签: facebook facebook-graph-api

我正在使用https://graph.facebook.com/v2.4/page_id/posts?fields=id从Facebook页面获取所有帖子ID,但由于paging.next属性总是返回一个url,我遇到了分页的无限循环问题。看起来最后一页指向第一页。我怎么知道我已经达到了结果。

这是一个代码示例:

public static Dictionary<string,string> GetPagePostIds(string accessToken, string pageId)
        {
            Dictionary<string, string> postIds = new Dictionary<string, string>();
            StringBuilder sb = new StringBuilder(graphAPIURL);
            sb.Append("/").Append(pageId).Append("/posts/?access_token=").Append(accessToken);
            sb.Append("&fields=id");

            string url = sb.ToString();
            int pages = 0;
            int rows = 0;
            while (url != null)
            {
                System.Net.WebRequest req = System.Net.WebRequest.Create(url);
                System.Net.WebResponse response = req.GetResponse();
                string json = null;
                using (System.IO.StreamReader sr = new System.IO.StreamReader(response.GetResponseStream()))
                {
                    json = sr.ReadToEnd();
                    Console.WriteLine(json);
                }
                if (json != null)
                {
                    pages++;
                    Dictionary<string, dynamic> data = (Dictionary<string, dynamic>)Newtonsoft.Json.JsonConvert.DeserializeObject(json, typeof(Dictionary<string, dynamic>));
                    if (data.ContainsKey("data"))
                    {
                        Newtonsoft.Json.Linq.JArray a = (Newtonsoft.Json.Linq.JArray)data["data"];
                        foreach (Newtonsoft.Json.Linq.JObject o in a)
                        {
                            rows++;
                            postIds.Add(o["id"].ToString(), o["id"].ToString());
                        }
                    }
                    if (data.ContainsKey("paging"))
                    {
                        try
                        {
                            if (data["paging"]["next"] == url)
                            {
                                //otherwise we will be stuck in the infinite loop, as next url of the last page is not null
                                break;
                            }

                            //if next link is present, there are more pages available
                            url = null;
                            url = data["paging"]["next"];
                        }
                        catch (Exception)
                        {
                        }
                    }
                }
            }

            return postIds;
        }

1 个答案:

答案 0 :(得分:0)

如果你到达那里只收到空结果的点,你可以打破循环。

所以你只需用第二个条件扩展你的while循环。这是一些简单的伪代码:

while (url != null && resultsOnPage) {
  [...]
  if (data.ContainsKey("data") && data['data'].Count > 0 ) {
    [...]
  } else {
    resultsOnPage = false;
  }
  [...]
}

请保持原样。