我正在开发一个项目,提供企业管理其Facebook页面的功能,因此它将会有大量与Facebook的API调用。是否可以通过特殊请求来增加速率限制?
我正在开发一个项目,提供企业管理其Facebook页面的功能,因此它将会有大量与Facebook的API调用。是否可以通过特殊请求来增加速率限制?
不,没有特殊请求可以增加限制。如果您真的达到了限制,很可能是在做一些您不应该做的事情。让企业使用自己的页面令牌管理他们的FB页面是没有问题的。
2022年更新:
看起来没有办法增加您的应用程序限制:
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
,需要考虑你的上下文(多线程?异步?...)。