Facebook API速率限制提高

5

我正在开发一个项目,提供企业管理其Facebook页面的功能,因此它将会有大量与Facebook的API调用。是否可以通过特殊请求来增加速率限制?


看到我的回答,如果你能告诉我们你想做什么,那将会更容易帮助你。为什么你需要大量的API调用? - andyrandy
1
他正在尝试下载评论和帖子,而Facebook会计算每个调用并减少他的限制。 - Gabriel Fair
这里是文档链接:https://developers.facebook.com/docs/graph-api/advanced/rate-limiting/#user-level-rate-limiting - Ryan
3个回答

2

5
还能增加限额吗?我找不到“申请提高费率”的按钮… - jcmag
1
我可以在 https://developers.facebook.com/apps/999999/dashboard/?business_id=9999999 上看到“应用级别速率限制”,“用户级别速率限制”,“广告账户级别速率限制”等内容,但是找不到“请求速率增加”的按钮。 - Ryan
我也找不到这个选项,这个答案已经过时了。请更新。 - BorisD

2

不,没有特殊请求可以增加限制。如果您真的达到了限制,很可能是在做一些您不应该做的事情。让企业使用自己的页面令牌管理他们的FB页面是没有问题的。


0

2022年更新:

看起来没有办法增加您的应用程序限制:

根据Facebook最佳实践Goutham的回答

1- 达到限制后,停止进行API调用。继续调用将继续增加您的调用次数,这将增加再次成功调用之前的时间。

2- 检查X-Business-Use-Case-Usage HTTP标头,以查看您的广告帐户离其限制有多近,以及何时可以恢复调用。

3- 验证错误代码和API端点以确认限流类型。

4- 切换到其他广告帐户,稍后再回到此帐户。

5- 最好创建新广告而不是更改现有广告。

6- 在两个时间间隔之间均匀分布查询,以避免发送尖峰流量。

7- 使用过滤器限制数据响应大小,并避免请求重叠数据的调用。

就我个人而言,我已经开发了这个小片段,以确保永远不会达到极限,但是它可能会使您的执行时间变得非常长。(这是C#)

    private void TrySleepIfApiLimitIsClose(HttpResponseMessage response)
    {
        try
        {
            IEnumerable<string> businessUsage = response.Headers.FirstOrDefault(header => header.Key == "x-business-use-case-usage").Value;
            IEnumerable<string> appUsage = response.Headers.FirstOrDefault(header => header.Key == "x-app-usage").Value;
            IEnumerable<string> adAccountUsage = response.Headers.FirstOrDefault(header => header.Key == "x-ad-account-usage").Value;
            IEnumerable<string> insightsUsage = response.Headers.FirstOrDefault(header => header.Key == "x-fb-ads-insights-throttle").Value;

            if (businessUsage != null)
            {
                IEnumerable<FacebookBusinessUseCaseUsage> usages = JsonConvert.DeserializeObject<IEnumerable<FacebookBusinessUseCaseUsage>>($"[{Regex.Match(businessUsage.First(), @"\[.{1,}\]").Groups[0].Value.Replace("[", string.Empty).Replace("]", string.Empty)}]");

                foreach (var usage in usages)
                {
                    if (usage.CallCount >= 80 ||
                        usage.TotalCpuTime >= 80 ||
                        usage.TotalTime >= 80)
                        Delay();
                }
            }

            if (appUsage != null)
            {
                FacebookBusinessUseCaseUsage usage = JsonConvert.DeserializeObject<FacebookBusinessUseCaseUsage>(appUsage.First());

                if (usage.CallCount >= 80 ||
                    usage.TotalCpuTime >= 80 ||
                    usage.TotalTime >= 80)
                    Delay();
            }

            if (adAccountUsage != null)
            {
                int usage = int.Parse(Regex.Match(adAccountUsage.First(), @"\d{1,}").Groups[0].Value);

                if (usage >= 80)
                    Delay();
            }

            if (insightsUsage != null)
            {
                FacebookAdInsightsThrottle usage = JsonConvert.DeserializeObject<FacebookAdInsightsThrottle>(insightsUsage.First());

                if (usage.AppIdUtilPct >= 80 || usage.AccIdUtilPct >= 80)
                    Delay();
            }
        }
        catch { }
    }

延迟几分钟:

private void Delay() => Thread.Sleep(1000 * 200);

请注意,我会吞掉异常,因为我不想中断执行。在我的情况下,达到限制比中断执行更好。还要小心使用Thread.Sleep,需要考虑你的上下文(多线程?异步?...)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接