是否有 API 可以执行此操作 - https://support.google.com/webmasters/answer/7687615?hl=en,我希望能够使用某些 API 将服务帐户映射到用户,(我可以手动完成,但列表很长)
据我了解有两种类型的用户
现在我想在 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 搜索控制台帐户和我的服务帐户之间建立关系的方法。但是,当我使用我的服务帐户并在网站上手动将其添加为用户时,一切正常,我可以正常查询。