google oauth 2 авторизация при использовании их api индексации

Я пытаюсь понять API индексации Google, но их документация ужасна. Я прошел настройку учетной записи службы и загрузил файл json вместе с остальными необходимыми условиями. Следующим шагом является получение токена доступа для аутентификации.

Я нахожусь в среде.net, но они не дают пример для этого. Я нашел некоторый пример использования библиотеки.net, чтобы сделать это здесь, но после следующего кода я не уверен, какая служба будет создана, чтобы затем сделать вызов индексному API. Я не вижу библиотеку google.apis.indexing в менеджере пакетов nuget.

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"));
}

В их примере кода это выглядит как простой пост json. Я попробовал это, но, конечно, это не работает, потому что я не аутентифицирован. Я просто не уверен, как связать все это в среде.net.

1 ответ

Вы правы, документации Google для этого либо нет, либо она ужасна. Даже в их собственных документах есть разбитые или незаконченные страницы, и в одной из них вы указали на пакет nuget, который не существует. Можно заставить это работать, хотя, объединяя другие примеры Auth на SA и затем следуя документации по индексации 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;
Другие вопросы по тегам