gifts2017

Google Analytics API, Oauth2.0 и 1c8

Опубликовал Ольга (Ольга_tmp) в раздел Программирование - Практика программирования

Обращение к 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.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Александр Немцов (pythonchik) 03.05.16 11:05
А зачем COMОбъект("WinHttp.WinHttpRequest.5.1")?
Стандартным HTTPСоединение не удалось обойтись? А то как-то не кроссплатформенно получилось.
TMV; frkbvfnjh; viptextil; ekaruk; +4 Ответить 2
2. Ольга (Ольга_tmp) 04.05.16 07:46
(1) pythonchik, как есть. Да, идеологически правильно - сделать HTTPСоединение и прикрутить SSL.
3. Виктор Пинчуков (viptextil) 04.05.16 11:16
(1) pythonchik, Точно не знаю, но для кроссплатформенности можно было бы костылик использовать. Типа wget и под винду есть и под Linux. Могу, конечно и ошибаться.
4. Сергей Огородников (Serg O.) 04.05.16 13:06
афигеть как сложно... перестал читать на 1 шаге...
там авторизация с указанием телефона и @
а это уже не совсем "бесплатно" - при желании вас вычислят...
и денег стрясут хоть прямо с телефона
5. Женька Ture (ture) 04.05.16 15:55
(4) Serg O., у гугла много всяких подсадных сервисов. К примеру, можно распознавать человеческую речь, ну т.е. можно с 1С разговаривать в стиле - "Открой, маленькая дрянь, документ, укажи контрагента такогото... проведи и закрой.... " Но это все беспонтово, свою прогу этим сильно круто не сделать, просто будешь баблом сервисы гугла прокачивать.
6. TMV 07.05.16 08:24
оффтоп.
Так все-таки "XTTPЗапрос" или "ХТТПЗапрос" ?
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа