Каталог решений - Google Analytics API, Oauth2.0 и 1c8

Google Analytics API, Oauth2.0 и 1c8

Google Analytics API, Oauth2.0 и 1c8

В наличии

Обращение к Google Analytics API, Протокол Oauth 2.0 и запросы от 1С:8 без авторизации пользователя

Категория:

Описание

Задача — получить аналитику гугла по сайту из 1С:8. Причем получать эту информацию регулярно, регламентным заданием, дабы анализировать продажи совместно с траффиком

Для связки с Google analytics API использую протокол OAUTH 2.0.

Статьи, которые помогли мне ознакомиться с протоколом:

https://developers.google.com/identity/protocols/OAuth2#basicsteps

https://developers.google.com/adwords/api/docs/guides/authentication#create_a_client_identifier_and_client_secret

https://habrahabr.ru/company/mailru/blog/115163/

http://pro1c.net/pub/283

В идеале — надо бы использовать HTTP соединение и SSL, но копипаст еще никого не подводил)

Шаг 1. Зарегистрировать проект в консоли разработчиков 

https://console.developers.google.com/apis/library

Создаю проект. На вкладке Обзор включаю нужный api — Google analytics, на вкладке Учетные данные — создаю учетные данные, выбираю пункт Идентификатор клиента OAuth, Тип приложения — другие типы. Результат — клиент oauth, с идентификатором и секретом клиента, которые я использую для доступа к api гугла.

 

Шаг 2. Получить код ответа.

Создаю обработку, на форме размещаю поле HTMLдокумента с именем Браузер. Подключаю обработчик ожидания. На кнопку действия размещаю процедуру

   Параметры = "response_type=code"+"&";
    Параметры = Параметры + "client_id="+ client_id + "&";
    Параметры = Параметры + "redirect_uri=http://localhost" + "&";
    Параметры = Параметры + "access_type=offline"+"&";
    Параметры = Параметры + "scope=https://www.googleapis.com/auth/analytics";
    АдресАвторизации = "https://accounts.google.com/o/oauth2/auth" + "?";
    ПолныйАдресАвторизации = АдресАвторизации + Параметры;
    ЭлементыФормы.Браузер.Перейти(ПолныйАдресАвторизации);

client_id —  идентификатор созданного проекта
При нажатии Выполнить — пользователю предлагается ввести логин/пароль в гугле и разрешить приложению доступ к данным. Код ответа смотрю в заголовке браузера: ЭлементыФормы.Браузер.документ.URLUnencoded 

 

Шаг 3. Обменять данный код(code) на ключ доступа(access_token).

    XTTPЗапрос = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
    Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
    Скрипт.language = "javascript";
    Скрипт.AddObject("XTTPЗапрос", XTTPЗапрос);
    Скрипт.Eval("XTTPЗапрос.Option(4)=13056");
    
    XTTPЗапрос.Open("Post", "https://accounts.google.com/o/oauth2/token", 0);
    XTTPЗапрос.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    
    ПараметрыPOST = "grant_type=authorization_code" + "&";
    ПараметрыPOST = ПараметрыPOST + "code=" + КодДоступа + "&";
    
    ПараметрыPOST = ПараметрыPOST + "client_id=" + client_id + "&";
    ПараметрыPOST = ПараметрыPOST + "client_secret=" + client_secret + "&";
    ПараметрыPOST = ПараметрыPOST + "redirect_uri=http://localhost";
    
    XTTPЗапрос.send(ПараметрыPOST);

Текст ответа:{  «access_token» : «ya29.CjHUAjuyyO6y5HZB9zOC-R6SurYOg7zoUIM9YQASLrBBT_S6F6rNxkvSzV2SNyt3R…»,  «token_type» : «Bearer»,  «expires_in» : 3600,  «refresh_token» : «1/Zq3Vi90TZ3O52ft2NDley9-OqO7FxlefusSHH….»}

access_token поможет мне получить нужные данные api гугла, однако параметр expires_in показывает время жизни, после которого данный ключ бесполезен. Дабы получать каждый день данные уже без участия пользователя, сохраняю значение refresh_token, который буду обменивать на access_token.

 

Шаг 4(На будущее). Обменять refresh_token на access_token

	XTTPЗапрос = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
    Скрипт = Новый COMОбъект("MSScriptControl.ScriptControl");
    Скрипт.language = "javascript";
    Скрипт.AddObject("XTTPЗапрос", XTTPЗапрос);
    Скрипт.Eval("XTTPЗапрос.Option(4)=13056");
    
    XTTPЗапрос.Open("Post", "https://accounts.google.com/o/oauth2/token", 0);
    XTTPЗапрос.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
	
	GoogleДанные  = Справочники.Сайты.google;
    ПараметрыPOST = "grant_type=refresh_token" + "&";
    ПараметрыPOST = ПараметрыPOST + "client_id=" + client_id + "&";
    ПараметрыPOST = ПараметрыPOST + "client_secret=" + client_secret + "&";
    ПараметрыPOST = ПараметрыPOST + "refresh_token=" + refresh_token;
    
    XTTPЗапрос.send(ПараметрыPOST);
    ТекстОтвета = XTTPЗапрос.responsetext();

изменен параметр grant_type и указан refresh_token
Ответ данного запроса выглядит так: 
{  «access_token» : «ya29.CjHUAlFwX3C196iBqH2UgBTi9qYu68zC6hTuWb9O0cvZIGUedwVIbTXc_Zm2yX8KK..»,  «token_type» : «Bearer»,  «expires_in» : 3600}

 

Шаг 5. Получить данные по траффику.

Итак, доступ получен. Осталось составить запрос — как запросить данные. Гугл уже позаботился о данном вопросе и любезно предоставил страничку https://ga-dev-tools.appspot.com/query-explorer/ , за что им огромное человеческое спасибо! В итоге код для получения трафика выглядит так:

	ХТТПЗапрос = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
	Скрипт=Новый COMОбъект("MSScriptControl.ScriptControl");
	Скрипт.language="javascript";
	Скрипт.AddObject("ХТТПЗапрос",ХТТПЗапрос);
	Скрипт.Eval("ХТТПЗапрос.Option(4)=13056");
	
	ДатаЗапроса = формат(текущаяДата(),"ДФ=yyyy-MM-dd");
	
	ТекстАпи = "https://www.googleapis.com/analytics/v3/data/ga?ids=ga%3A115479052&client_id="+ client_id + "&start-date="+ДатаЗапроса+"&end-date="+ДатаЗапроса+"&metrics=ga%3Asessions";
	ХТТПЗапрос.Open("GET",ТекстАпи,0);
	ХТТПЗапрос.setRequestHeader("Authorization","Bearer " + Токен);
	ХТТПЗапрос.Send(); 
	Результат = ХТТПЗапрос.ResponseText();

Результат — Json-файл. Если у вас платформа выше 8.3.6.1977 , то обработать данный файл можно средствами платформы. Иначе — парсинг собственными силами. 

Шаг 6. Создать регламентное задание,запускающее Шаг 4 и Шаг 5 и сохранение данных по траффику

 

Данная статья написана по итогам первого знакомства с Google API.

has been added to your cart:
Оформление заказа