问题描述
TLDR 版本
是否有 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 搜索控制台帐户和我的服务帐户之间建立关系的方法。但是,当我使用我的服务帐户并在网站上手动将其添加为用户时,一切正常,我可以正常查询。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)