google 使用其索引时的 oauth 2 授权 api
google oauth 2 authorization when using their indexing api
我正在尝试理解 google indexing api 但他们的文档太糟糕了。我已经设置了服务帐户并下载了 json 文件以及其余的先决条件。下一步是获取访问令牌以进行身份验证。
我在 .net 环境中,但他们没有为此提供示例。我确实找到了一些使用 .net 库来完成它的示例 here,但是在下面的代码之后,我不确定将创建什么服务来调用索引 api。我在 nuget 包管理器中没有看到 google.apis.indexing 库。
UserCredential credential;
using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
{
credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
new[] { "https://www.googleapis.com/auth/indexing" },
"user", CancellationToken.None, new FileDataStore("IndexingStore"));
}
在他们的 example code 中,它看起来只是一个简单的 json post。我试过了,但当然它不起作用,因为我没有通过身份验证。我只是不确定如何在 .net 环境中将所有这些结合在一起。
你说得对,Google 的相关文档要么不存在,要么非常糟糕。甚至他们自己的文档中也有损坏或未完成的页面,在其中一个文档中,您被指向一个不存在的 nuget 包。通过将 SA 上的其他 Auth 示例拼凑在一起,然后遵循 Java 索引文档,可以使它起作用。
首先,您需要使用 nuget 包管理器添加主 api 包和 auth 包:
然后尝试以下操作:
using System;
using System.Configuration;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Http;
using Newtonsoft.Json;
namespace MyProject.Common.GoogleForJobs
{
public class GoogleJobsClient
{
public async Task<HttpResponseMessage> AddOrUpdateJob(string jobUrl)
{
return await PostJobToGoogle(jobUrl, "URL_UPDATED");
}
public async Task<HttpResponseMessage> CloseJob(string jobUrl)
{
return await PostJobToGoogle(jobUrl, "URL_DELETED");
}
private static GoogleCredential GetGoogleCredential()
{
var path = ConfigurationManager.AppSettings["GoogleForJobsJsonFile"];
GoogleCredential credential;
using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
credential = GoogleCredential.FromStream(stream)
.CreateScoped(new[] { "https://www.googleapis.com/auth/indexing" });
}
return credential;
}
private async Task<HttpResponseMessage> PostJobToGoogle(string jobUrl, string action)
{
var googleCredential = GetGoogleCredential();
var serviceAccountCredential = (ServiceAccountCredential) googleCredential.UnderlyingCredential;
const string googleApiUrl = "https://indexing.googleapis.com/v3/urlNotifications:publish";
var requestBody = new
{
url = jobUrl,
type = action
};
var httpClientHandler = new HttpClientHandler();
var configurableMessageHandler = new ConfigurableMessageHandler(httpClientHandler);
var configurableHttpClient = new ConfigurableHttpClient(configurableMessageHandler);
serviceAccountCredential.Initialize(configurableHttpClient);
HttpContent content = new StringContent(JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
var response = await configurableHttpClient.PostAsync(new Uri(googleApiUrl), content);
return response;
}
}
}
你可以这样调用它
var googleJobsClient = new GoogleJobsClient();
var result = await googleJobsClient.AddOrUpdateJob(url_of_vacancy);
或者如果您不在异步方法中
var googleJobsClient = new GoogleJobsClient();
var result = googleJobsClient.AddOrUpdateJob(url_of_vacancy).Result;
我正在尝试理解 google indexing api 但他们的文档太糟糕了。我已经设置了服务帐户并下载了 json 文件以及其余的先决条件。下一步是获取访问令牌以进行身份验证。
我在 .net 环境中,但他们没有为此提供示例。我确实找到了一些使用 .net 库来完成它的示例 here,但是在下面的代码之后,我不确定将创建什么服务来调用索引 api。我在 nuget 包管理器中没有看到 google.apis.indexing 库。
UserCredential credential;
using (var stream = new FileStream("client_secrets.json", FileMode.Open, FileAccess.Read))
{
credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
GoogleClientSecrets.Load(stream).Secrets,
new[] { "https://www.googleapis.com/auth/indexing" },
"user", CancellationToken.None, new FileDataStore("IndexingStore"));
}
在他们的 example code 中,它看起来只是一个简单的 json post。我试过了,但当然它不起作用,因为我没有通过身份验证。我只是不确定如何在 .net 环境中将所有这些结合在一起。
你说得对,Google 的相关文档要么不存在,要么非常糟糕。甚至他们自己的文档中也有损坏或未完成的页面,在其中一个文档中,您被指向一个不存在的 nuget 包。通过将 SA 上的其他 Auth 示例拼凑在一起,然后遵循 Java 索引文档,可以使它起作用。
首先,您需要使用 nuget 包管理器添加主 api 包和 auth 包:
然后尝试以下操作:
using System;
using System.Configuration;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Http;
using Newtonsoft.Json;
namespace MyProject.Common.GoogleForJobs
{
public class GoogleJobsClient
{
public async Task<HttpResponseMessage> AddOrUpdateJob(string jobUrl)
{
return await PostJobToGoogle(jobUrl, "URL_UPDATED");
}
public async Task<HttpResponseMessage> CloseJob(string jobUrl)
{
return await PostJobToGoogle(jobUrl, "URL_DELETED");
}
private static GoogleCredential GetGoogleCredential()
{
var path = ConfigurationManager.AppSettings["GoogleForJobsJsonFile"];
GoogleCredential credential;
using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
credential = GoogleCredential.FromStream(stream)
.CreateScoped(new[] { "https://www.googleapis.com/auth/indexing" });
}
return credential;
}
private async Task<HttpResponseMessage> PostJobToGoogle(string jobUrl, string action)
{
var googleCredential = GetGoogleCredential();
var serviceAccountCredential = (ServiceAccountCredential) googleCredential.UnderlyingCredential;
const string googleApiUrl = "https://indexing.googleapis.com/v3/urlNotifications:publish";
var requestBody = new
{
url = jobUrl,
type = action
};
var httpClientHandler = new HttpClientHandler();
var configurableMessageHandler = new ConfigurableMessageHandler(httpClientHandler);
var configurableHttpClient = new ConfigurableHttpClient(configurableMessageHandler);
serviceAccountCredential.Initialize(configurableHttpClient);
HttpContent content = new StringContent(JsonConvert.SerializeObject(requestBody), Encoding.UTF8, "application/json");
var response = await configurableHttpClient.PostAsync(new Uri(googleApiUrl), content);
return response;
}
}
}
你可以这样调用它
var googleJobsClient = new GoogleJobsClient();
var result = await googleJobsClient.AddOrUpdateJob(url_of_vacancy);
或者如果您不在异步方法中
var googleJobsClient = new GoogleJobsClient();
var result = googleJobsClient.AddOrUpdateJob(url_of_vacancy).Result;