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.

18 Comments

  1. pythonchik

    А зачем COMОбъект(«WinHttp.WinHttpRequest.5.1»)?

    Стандартным HTTPСоединение не удалось обойтись? А то как-то не кроссплатформенно получилось.

    Reply ↓
  2. Ольга_tmp

    (1) pythonchik, как есть. Да, идеологически правильно — сделать HTTPСоединение и прикрутить SSL.

    Reply ↓
  3. viptextil

    (1) pythonchik, Точно не знаю, но для кроссплатформенности можно было бы костылик использовать. Типа wget и под винду есть и под Linux. Могу, конечно и ошибаться.

    Reply ↓
  4. Serg O.

    афигеть как сложно… перестал читать на 1 шаге…

    там авторизация с указанием телефона и @

    а это уже не совсем «бесплатно» — при желании вас вычислят…

    и денег стрясут хоть прямо с телефона

    Reply ↓
  5. ture

    (4) Serg O., у гугла много всяких подсадных сервисов. К примеру, можно распознавать человеческую речь, ну т.е. можно с 1С разговаривать в стиле — «Открой, маленькая дрянь, документ, укажи контрагента такогото… проведи и закрой…. » Но это все беспонтово, свою прогу этим сильно круто не сделать, просто будешь баблом сервисы гугла прокачивать.

    Reply ↓
  6. TMV

    оффтоп.

    Так все-таки «XTTPЗапрос» или «ХТТПЗапрос» ?

    Reply ↓
  7. viktor2008

    Все прекрасно, а как теперь файлик обратно на гугл-диск отправить?

    Reply ↓
  8. Ольга_tmp

    (7)какой файлик? в статье описывается получение аналитики гугла, на гугл-диск ничего отправлять не нужно

    Reply ↓
  9. viktor2008

    Дело в том, что я использую ваш пример для получения расшаренного файла с гугла-диска, корректирую его и теперь хочу положить его на место. Вот и задал вопрос, как полученный ранее файл обратно положить на гугл-диск. Использовать приложение гугл-диск — руководство не рекомендует.

    Reply ↓
  10. Ольга_tmp

    (9)также Post запросом. например http://forum.aeroion.ru/topic446.html описывается подобное

    Reply ↓
  11. viktor2008

    Спасибо за ссылку. Думаю она мне поможет решить мою задачу.

    Reply ↓
  12. echo77

    Без объекта ПолеХТМЛДокумента на форме это можно сделать?

    Reply ↓
  13. echo77

    Тема кому-нибудь интересна? Я думаю создавать пример, делать публикацию по использованию Google API для Drive(Чтение данных файла, содержимое папок), SpreadSheets(Чтение данных о файле, перечень листов в файле, чтение и анализ значений на всех листах, запись значений на листах, изменение оформления ячеек)?

    Reply ↓
  14. ROM_1C

    (13)

    Тема кому-нибудь интересна? Я думаю создавать пример, делать публикацию по использованию Google API для Drive

    Делали?

    Reply ↓
  15. echo77

    (14) Нет, готовая программа есть, но оформлять ее в виде публикации с набором методов и примеров пока нет времени

    Reply ↓
  16. ROM_1C

    (15) можете поделиться?

    Reply ↓
  17. Zamza

    У вас опечатка в статье:

    client_id — идентификатор созданного проекта

    Это всё же идентификатор клиента.

    Reply ↓
  18. boron

    А как получить КодДоступа?

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *