我如何处理Facebook费率限制?

时间:2014-08-20 21:24:40

标签: facebook web-services facebook-graph-api caching facebook-like

我正在开发一个与Facebook相似的应用程序。我目前正在调用Facebook的Graph API,但我发现如果我在600秒内调用它超过600次,那么我将在接下来的15分钟内暂停。

我的问题是,我该如何处理?我有查询结果缓存每个页面计数一分钟,但如果我有超过600页,我想显示所有600多个页面的喜欢我仍然可以超过速率限制。我该如何解决这个问题?

我正在考虑创建一个Windows服务,每隔x秒查询一次Facebook,并在我自己的数据库中存储最新的值。然后我使用我的数据库来查询最新的值。但我觉得必须有一种更简单或更好的方法来解决这个问题吗?

我查看了实时更新(https://developers.facebook.com/docs/graph-api/real-time-updates/v2.1),但我担心我们的服务器将无法处理来自Facebook的来电,我的理解是我仍然需要致电Facebook来获取实际情况喜欢/分享计数。

public async Task<List<KeyValuePair<string, int>>> GetTopTen()
{
    Dictionary<string, int> pageVotes = new Dictionary<string, int>();

    List<string> pageIds = await GetAllPageIds();
    foreach(string pid in pageIds)
    {
        pageVotes[pid] = await GetLikes(pid);
    }

    return pageVotes.OrderByDescending(x => x.Value).Take(10).ToList();
}

private async Task<int> GetLikes(string pageId)
{
    string thisCacheKey = "GetProfileVotes_" + GetUniqueCacheKey(pageId);
    ObjectCache cache = MemoryCache.Default;
    int? result = cache[thisCacheKey] as int?;

    if (result == null)
    {
        string websiteURL = ConfigurationManager.AppSettings["WebsiteURL"];
        string url = Path.Combine(websiteURL, "Page", pageId);

        try
        {
            string jsonString = await new WebClient().DownloadStringTaskAsync("http://graph.facebook.com/" + url);

            JavaScriptSerializer serializer = new JavaScriptSerializer();
            Dictionary<string, object> results = (Dictionary<string, object>)serializer.Deserialize<object>(jsonString);

            object idValue = "";
            object likeValue = "";
            bool success = results.TryGetValue("id", out idValue);
            bool likes = results.TryGetValue("shares", out likeValue);

            if (success)
            {
                if (likes)
                    result = (int)likeValue;
                else
                    result = 0; // Facebook returns null "shares" for 0 votes

                // Save the last successful pull
                SaveLastFacebookLikeCount(pageId, result.Value);
            }
            else
            {
                result = -1;
            }
        }
        catch(Exception ex)
        {
            result = -1;
        }

        if(result < 0)
        {
            result = GetLastFacebookLikeCount(pageId);
        }

        CacheItemPolicy policy = new CacheItemPolicy();
        policy.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(60);
        cache.Set(thisCacheKey, result, policy);
    }

    return result.Value;
}

1 个答案:

答案 0 :(得分:0)

费率限制详情&amp;上个月公开记录了数字:

https://developers.facebook.com/docs/graph-api/advanced/rate-limiting

虽然这不是您问题的直接答案,但它可能会为您提供指导和帮助。关于如何围绕这些建立的确切数字。