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

问题描述

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 使用服务帐户添加/列出站点,但随后无法

  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 搜索控制台帐户和我的服务帐户之间建立关系的方法。但是,当我使用我的服务帐户并在网站上手动将其添加用户时,一切正常,我可以正常查询

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)