Google api 网站管理员API-配额限制

Google api 网站管理员API-配额限制,google-api,google-webmaster-tools,google-api-webmasters,Google Api,Google Webmaster Tools,Google Api Webmasters,我们试图通过调用WebmastersService.SearchAnalytics.Query(),为使用Webmasters API.NET客户端库的站点下载页面数据。为此,我们在一批中使用并发送大约600个请求。但是,大多数测试失败,错误为“超出配额”。失败的数量每次都会有所不同,但在600个成功的产品中,只有10个(在批次中的位置也会有所不同)。我们让它工作的唯一方法是将批处理大小减少到3,并在每次调用之间等待1秒 根据开发人员控制台,我们的每日配额设置为1000000(剩下99%),每个

我们试图通过调用
WebmastersService.SearchAnalytics.Query()
,为使用Webmasters API.NET客户端库的站点下载页面数据。为此,我们在一批中使用并发送大约600个请求。但是,大多数测试失败,错误为“超出配额”。失败的数量每次都会有所不同,但在600个成功的产品中,只有10个(在批次中的位置也会有所不同)。我们让它工作的唯一方法是将批处理大小减少到3,并在每次调用之间等待1秒

根据开发人员控制台,我们的每日配额设置为1000000(剩下99%),每个用户限制设置为10000个请求/秒/用户

我们得到的错误是:

超出配额[403]错误[消息[超出配额]位置[-] 原因[QuotaExceed]域[usageLimits]]

是否有另一个强制执行的配额?“域[使用限制]”是什么意思?是我们查询页面数据的站点所在的域,还是我们的用户帐户

如果我们单独运行每个请求,我们仍然会遇到问题,除非我们在每次调用之间等待1秒。由于网站的数量和网页的数量,我们需要下载的数据,这不是一个真正的选择

我发现这指出,仅仅因为最大批量是1000并不意味着你调用的谷歌服务支持这些大小的批量。但我真的很想知道配额限制到底是什么(因为它们与开发人员控制台的数字无关),以及如何避免错误

更新1

下面是一些示例代码。它是专门写的,只是为了证明问题,所以不需要评论它的质量;o)

使用Google.api.Auth.OAuth2;
使用Google.api.Services;
使用Google.api.Util.Store;
使用Google.api.Webmasters.v3;
使用Google.api.Webmasters.v3.Data;
使用制度;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
使用系统文本;
使用系统线程;
使用System.Threading.Tasks;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
新程序().Run().Wait();
}
专用异步任务运行()
{
List pageUrls=新列表();
//将页面URL添加到此处的列表中
等待GetPageData(“,”2015-06-15“,”2015-07-05“,”web“,”桌面“,”PageURL);
}
公共静态异步任务GetService(字符串appName)
{
//如果(_服务!=null)
//退货服务;
//TODO:-查看分析代码,了解如何存储JSON、刷新令牌以及检查另一台PC上的运行情况
用户凭证;
使用(var stream=newfilestream(“c:\\temp\\WMT.json”,FileMode.Open,FileAccess.Read))
{
凭证=等待GoogleWebAuthorizationBroker.AuthorizationAsync(
GoogleClientSecrets.Load(stream.Secrets),
新[]{Google.api.Webmasters.v3.Webmasters服务.Scope.Webmasters},
“用户”,CancellationToken.None,新文件数据存储(“WebmastersService”);
}
//创建服务。
WebmastersService服务=新的WebmastersService(新的BaseClientService.Initializer()
{
HttpClientInitializer=凭证,
ApplicationName=appName,
});
//_服务=服务;
回程服务;
}
私有静态异步任务GetPageData(字符串appName、字符串fromDate、字符串toDate、字符串searchType、字符串设备、字符串siteUrl、列表pageUrls)
{
//从初始方法获取服务
bool-ret=假;
WebmastersService服务=等待GetService(appName);
Google.api.Requests.BatchRequest b=新的Google.api.Requests.BatchRequest(服务);
尝试
{
foreach(pageUrls中的字符串pageUrl)
{
SearchAnalyticsQueryRequest qry=新的SearchAnalyticsQueryRequest();
qry.StartDate=起始日期;
qry.EndDate=toDate;
qry.SearchType=SearchType;
qry.RowLimit=5000;
qry.Dimensions=newlist(){“query”};
qry.DimensionFilterGroups=新列表();
ApiDimensionFilterGroup filterGroup=新的ApiDimensionFilterGroup();
ApiDimensionFilter=新的ApiDimensionFilter();
filter.Dimension=“设备”;
表达式=设备;
filter.Operator=“等于”;
ApiDimensionFilter filter2=新的ApiDimensionFilter();
filter2.Dimension=“page”;
filter2.Expression=pageUrl;
filter2.Operator_u=“等于”;
filterGroup.Filters=新列表();
filterGroup.Filters.Add(过滤器);
filterGroup.Filters.Add(filter2);
qry.dimensionFilterGroup.Add(filterGroup);
var req=service.Searchanalytics.Query(qry,siteUrl);
b、 队列(请求,(响应、错误、i、消息)=>
{
如果(错误==null)
{
//处理结果
ret=真;
}
其他的
{
Console.WriteLine(错误消息);
}
});
等待b.ExecuteAsync();
}
}
捕获(例外情况除外)
{
WriteLine(“获取页面统计信息时发生异常:“+ex.Message”);
ret
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
using Google.Apis.Util.Store;
using Google.Apis.Webmasters.v3;
using Google.Apis.Webmasters.v3.Data;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            new Program().Run().Wait();
        }

        private async Task Run()
        {
            List<string> pageUrls = new List<string>();
            // Add your page urls to the list here

            await GetPageData("<your app name>", "2015-06-15", "2015-07-05", "web", "DESKTOP", "<your domain name>", pageUrls);
        }

        public static async Task<WebmastersService> GetService(string appName)
        {
            //if (_service != null)
            //    return _service;
            //TODO: - look at analytics code to see how to store JSON and refresh token and check runs on another PC
            UserCredential credential;
            using (var stream = new FileStream("c:\\temp\\WMT.json", FileMode.Open, FileAccess.Read))
            {
                credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    new[] { Google.Apis.Webmasters.v3.WebmastersService.Scope.Webmasters },
                    "user", CancellationToken.None, new FileDataStore("WebmastersService"));
            }

            // Create the service.
            WebmastersService service = new WebmastersService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = appName,
            });

            //_service = service;
            return service;

        }

        private static async Task<bool> GetPageData(string appName, string fromDate, string toDate, string searchType, string device, string siteUrl, List<string> pageUrls)
        {
            // Get the service from the initial method
            bool ret = false;

            WebmastersService service = await GetService(appName);
            Google.Apis.Requests.BatchRequest b = new Google.Apis.Requests.BatchRequest(service);

            try
            {
                foreach (string pageUrl in pageUrls)
                {
                    SearchAnalyticsQueryRequest qry = new SearchAnalyticsQueryRequest();
                    qry.StartDate = fromDate;
                    qry.EndDate = toDate;
                    qry.SearchType = searchType;
                    qry.RowLimit = 5000;
                    qry.Dimensions = new List<string>() { "query" };
                    qry.DimensionFilterGroups = new List<ApiDimensionFilterGroup>();
                    ApiDimensionFilterGroup filterGroup = new ApiDimensionFilterGroup();
                    ApiDimensionFilter filter = new ApiDimensionFilter();
                    filter.Dimension = "device";
                    filter.Expression = device;
                    filter.Operator__ = "equals";

                    ApiDimensionFilter filter2 = new ApiDimensionFilter();
                    filter2.Dimension = "page";
                    filter2.Expression = pageUrl;
                    filter2.Operator__ = "equals";

                    filterGroup.Filters = new List<ApiDimensionFilter>();
                    filterGroup.Filters.Add(filter);
                    filterGroup.Filters.Add(filter2);
                    qry.DimensionFilterGroups.Add(filterGroup);

                    var req = service.Searchanalytics.Query(qry, siteUrl);
                    b.Queue<SearchAnalyticsQueryResponse>(req, (response, error, i, message) =>
                    {
                        if (error == null)
                        {
                            // Process the results
                            ret = true;
                        }
                        else
                        {
                            Console.WriteLine(error.Message);
                        }

                    });
                    await b.ExecuteAsync();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception occurred getting page  stats : " + ex.Message);
                ret = false;
            }

            return ret;
        }        
    }
}