无法将服务帐户添加到通过 API 添加到谷歌搜索控制台的站点

时间:2021-05-24 14:44:45

标签: google-api google-search-console

TLDR 版本

是否有 API 可以执行此操作 - https://support.google.com/webmasters/answer/7687615?hl=en,我希望能够使用某些 API 将服务帐户映射到用户,(我可以手动完成,但列表很长)

enter image description here

长版

据我了解有两种类型的用户

  • 类型 1 - 普通用户(人类)登录并使用谷歌搜索控制台
  • 类型 2 - Google 服务帐户,由应用程序用于提取数据

现在我想在 Google Search Console 中添加数百个站点,我找到了 C# 客户端/API 来做到这一点。

我可以使用 API 使用普通用户帐户添加/列出站点,然后使用 UI 进行验证以查看它们是否被添加。

我能够(没有返回错误)使用 API 使用服务帐户添加/列出站点,但随后无法

  • 查看添加到站点用户列表中的服务帐户用户。但是我调用list api的时候还是看到了网站
  • 为该站点提取数据时,出现错误
  Google.Apis.Requests.RequestError
User does not have sufficient permission for site 'https://www.example.com/th-th/city/'. See also: https://support.google.com/webmasters/answer/2451999. [403]
Errors [Message[User does not have sufficient permission for site 'https://www.example.com/th-th/city/'. See also: https://support.google.com/webmasters/answer/2451999.] Location[ - ] Reason[forbidden] Domain[global]

它指向此链接 - https://support.google.com/webmasters/answer/7687615?visit_id=1621866886080-4412438468466383489&rd=2,我可以在其中使用 UI 并手动添加我的服务帐户,然后一切正常。

但我想通过 API 做同样的事情,因为我将有数百个网站要添加。

请就如何解决这个问题提出建议?

好像这个用户也有类似的问题,但没有解决方案 - How to connect Google service account with Google Search Console

代码

这是我用来使用普通用户和客户端 ID/秘密创建站点的代码,在这里,如果我创建一个站点,我可以在 UI 上看到它,但 API (https://developers.google.com/webmaster-tools/search-console-api-original/v3/sites/add) 没有选项使用服务帐号。

public class WebmastersServiceWrapper
    {
        private string user = "realemail@example.com";
        private readonly ClientSecrets _clientSecrets = new ClientSecrets
        {
            ClientId = "example.apps.googleusercontent.com",
            ClientSecret = "example"
        };

        private readonly string[] _scopes = {
            WebmastersService.Scope.WebmastersReadonly,
            WebmastersService.Scope.Webmasters
        };

        public async Task<WebmastersService> GetWebmastersService()
        {
            var credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(_clientSecrets, _scopes, user, CancellationToken.None);
            var service = new WebmastersService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
                ApplicationName = "WebMasters API Sample",
            });
            return service;
        }
    }

 public class WebMasterSiteService
    {
        private readonly WebmastersServiceWrapper _connection;

        public WebMasterSiteService()
        {
            _connection = new WebmastersServiceWrapper();
        }

        public async Task<IEnumerable<string>> GetSites()
        {
             var service = await _connection.GetWebmastersService();
             var sitesResponse = await service.Sites.List().ExecuteAsync();
             return SiteMapper.MapSites(sitesResponse);
        }

        public async Task DeleteSite(string site)
        {
            var service = await _connection.GetWebmastersService();
            var response = await service.Sites.Delete(site).ExecuteAsync();
            return;
        }

        public async Task AddSite(string site)
        {
            var service = await _connection.GetWebmastersService();
            var response = await service.Sites.Add(site).ExecuteAsync();
            return;
        }
    }

这是我使用 Service Worker 创建站点的一段代码,它是在某处创建的(当我调用 list 时,我将其取回)但是当我使用其他 API 查询该站点时,它失败并出现此错误

Google.Apis.Requests.RequestError
    User does not have sufficient permission for site 'https://www.example.com/th-th/city/'. See also: https://support.google.com/webmasters/answer/2451999. [403]
    Errors [
        Message[User does not have sufficient permission for site 'https://www.example.com/th-th/city/'. See also: https://support.google.com/webmasters/answer/2451999.] Location[ - ] Reason[forbidden] Domain[global]
]
public class SearchConsoleServiceWrapper
    {
        private readonly string[] _scopes = {
            SearchConsoleService.Scope.WebmastersReadonly,
            SearchConsoleService.Scope.Webmasters
        };
        
        public SearchConsoleService GetWebmastersService()
        {
            using var stream = new FileStream("key-downloaded-from-console-cloud-google.json", FileMode.Open, FileAccess.Read);
            var credential = GoogleCredential.FromStream(stream)
                .CreateScoped(_scopes)
                .UnderlyingCredential as ServiceAccountCredential;
            return new SearchConsoleService(new BaseClientService.Initializer
            {
                HttpClientInitializer = credential
            });
        }
    }


public class SiteService
    {
        private readonly SearchConsoleServiceWrapper _connection;

        public SiteService()
        {
            _connection = new SearchConsoleServiceWrapper();
        }

        public async Task<IEnumerable<string>> GetSites()
        {
            var service = _connection.GetWebmastersService();
            var sitesResponse = await service.Sites.List().ExecuteAsync();
            return SiteMapper.MapSites(sitesResponse);
        }

        public async Task DeleteSite(string site)
        {
            var service = _connection.GetWebmastersService();
            var response = await service.Sites.Delete(site).ExecuteAsync();
            return;
        }
        
        public async Task AddSite(string site)
        {
            var service = _connection.GetWebmastersService();
            var response = await service.Sites.Add(site).ExecuteAsync();
            return;
        }
    }

最后的想法

也许我遗漏了一些简单的东西,而且我还没有找到在我的 google 搜索控制台帐户和我的服务帐户之间建立关系的方法。但是,当我使用我的服务帐户并在网站上手动将其添加为用户时,一切正常,我可以正常查询。

0 个答案:

没有答案
相关问题