Доступ к Google API AdSense через Zabbix

Доступ к Google API AdSense через Zabbix

На днях размотал запутанную головоломку, поэтому ее надо обязательно описать, иначе сам забуду. Я настроил доступ к google api для того, чтобы забирать данные в Zabbix. Покажу это на примере информации из личного кабинета Adsense. Забирать инфу через api будем обычными post и get запросами через curl.


Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «Administrator Linux. Professional» в OTUS. Курс не для новичков, для поступления нужно пройти .

Введение

Для начала расскажу, для чего я все буду делать. Глобальная задача стоит сделать дашборд для работы маркетолога или ssm специалиста. Свести в одно место метрики из разных систем — посещаемость сайтов, монетизация, активность в группах vk, telegram и т.д. Часть этого всего я уже сделал. Буду постепенно делиться на страницах сайта. Начать рассказ решил с самого сложного — работа с google api.

В целом, работа со всеми api примерно одинаковая и не представляет особой сложности. С goolge api возникают проблемы с доступом у тех, кто первый раз все это настраивает. Там слишком много всяких сущностей. Надо пройти определенный квест и регулярно его повторять, чтобы иметь доступ к google api. Сделано все это для безопасной работы больших и сложных систем. Ну а обычным юзерам, которые просто хотят дергать curl-ом какие-то метрики, это кажется не очень простым.

В общем, расскажу обо всем по порядку, чтобы было понятно даже новичку, который только начинает работу с api. Покажу на реальном примере моего сайта и кабинета adsense к нему.

Добавление ресурсов в консоли API

Вся настройка начинается с работы в Консоли API. Вам необходимо создать новый проект.

Доступ к Google API AdSense через Zabbix

Я создал новый проект и назвал его serveradmin. После этого в верхнем левом углу выбирайте меню навигации и переходите в API и сервисы.

Доступ к Google API AdSense через Zabbix

Далее нажимайте сверху на кнопку ENABLE APIS AND SERVICES. В поиске набирайте adsesne и переходите в AdSense Management API.

Доступ к Google API AdSense через Zabbix

На следующей странице нажимайте ВКЛЮЧИТЬ.


Важно!!! У вас должен быть выключен блокировщик рекламы в браузере. Если он будет включен, то получите ошибку и API adsense не заработает. Тут и далее обязательно все делайте без блокировщика.

API мы запустили, теперь нужно создать для него ключ. С помощью ключа можно обращаться к конкретному API, к которому он привязан. Здесь ожидаешь, что это будет некий токен, с помощью которого можно будет уже получать данные, но нет. Нужно четко понимать терминологию и логику работы google api. Сейчас мы создаем именно идентификатор, который будет привязан к api adsense, чтобы по нему обращаться только конкретно к этим данным.

Итак, идем в раздел Учетные данные и создаем новые. Выбираем Ключ API.

Доступ к Google API AdSense через Zabbix

В настройках ключа можно настроить ограничение доступа на уровне IP или доменного имени сайта, с которого будут идти запросы. Если у вас есть возможность ограничить доступ, рекомендую это сделать сразу же. Я обычно по ip делаю ограничение, так как данные собираю только с конкретного сервера. В списке допустимых api укажите только AdSense Management API, который мы добавили ранее. Для каждой службы лучше делать свой ключ.

Доступ к Google API AdSense через Zabbix

Самое простое сделали. Активировали API и добавили ключ, по которому мы будем к нему обращаться. Теперь надо настроить доступ к этому API.

Доступ к Google API

Я не буду подробно описывать теорию работы с google api через OAuth 2.0. Вы можете без проблем нагуглить эту информацию. Опишу своими словами, как это работает.

  1. Сначала нужно создать идентификатор клиента OAuth 2.0, который будет состоять из client_id и client_secret.
  2. Далее для этого идентификатора нужно будет запросить Authentication code, указав scope, на который он будет распространяться. В нашем случае scope для adsense — https://www.googleapis.com/auth/adsense.readonly, так как я собираюсь только читать данные через api, не менять их.
  3. С помощью полученного кода мы делаем запрос токена. В ответ получаем access_token и refresh_token. С помощью первого токена мы можем делать запросы на получение данных, с помощью второго — обновлять первый. Проблема в том, что access_token действует только 60 минут. После этого его надо обновлять с помощью refresh_token, у которого нет ограничения по времени жизни.

Вот такая схема доступа к данным через google api. Я не буду часто обращаться за данными, поэтому решил в каждом запросе к api сначала обновлять access_token с помощью refresh_token и подставлять новый токен в запрос. Приступаем к реализации.

Идем снова в раздел Учетные данные и добавляем новые, только теперь указываем Идентификатор клиента OAuth.

Доступ к Google API AdSense через Zabbix

Вам будет предложено создать Окно запроса доступа OAuth. Сделайте это, указав любое название и выбрав тип — Внешнее. Все остальные поля заполнять не обязательно. После этого снова возвращайтесь к созданию идентификатора oauth. В типе приложения указывайте Приложение для ПК. Именно этот тип подходит для запросов через curl.

Доступ к Google API AdSense через Zabbix

У вас теперь есть Идентификатор клиента (client_id) и Секретный код клиента (client_secret). Далее нам надо получить Authentication code. Для этого переходите по ссылке:

 https://accounts.google.com/o/oauth2/auth?client_id=[client_id]&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=[scope]&response_type=code.

В моем случае ссылка получается такая:

https://accounts.google.com/o/oauth2/auth?client_id=782459127764-gu9rr9fo379klsqvmyk8b6ubgd6kn.apps.googleusercontent.com&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https://www.googleapis.com/auth/adsense.readonly&response_type=code

После перехода вас попросят авторизоваться под учетной записью google.

Доступ к Google API AdSense через Zabbix

И далее спросят, согласны ли вы ей предоставить доступ к просмотру данных adsense.

Доступ к Google API AdSense через Zabbix

После вашего согласия получите необходимый код.

Доступ к Google API AdSense через Zabbix

Запомните его, он нам пригодится далее. С его помощью, а так же с помощью client_id и client_secret формируем POST запрос на получение токена.

curl --request POST --data  
"code=[Authentication code]&client_id=[client_id]&client_secret=[client_secret]&grant_type=authorization_code" 
https://accounts.google.com/o/oauth2/token

В моем случае он получился такой:

curl --request POST --data 
"code=4/4QGbQEsY8QwTpEFBeZ2PIlTFCfZzSwlXgwyPrTVEJkg&client_id=782459127764-gu9rr9fo379klsqvmyk8b6ubgd6kn.apps.googleusercontent.com&client_secret=l7_-a3RTnmPkDVL5DwruJfix&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code" 
https://accounts.google.com/o/oauth2/token

После выполнения запроса, вам вернется json с access_token и refresh_token. Это то, что нам нужно.

Доступ к Google API AdSense через Zabbix

Теперь у нас есть все для того, чтобы получать данные из кабинета adsense. Вот пример запроса на получение дохода за сегодняшний день.

curl 
'https://www.googleapis.com/adsense/v1.4/reports?startDate=today&endDate=today&accountId=[account id]&metric=EARNINGS&useTimezoneReporting=true&key=[api key]' 
--header 'Authorization: Bearer [access_token]' 
--header 'Accept: application/json' 
--compressed

В моем случае запрос получился такой.

curl 'https://www.googleapis.com/adsense/v1.4/reports?startDate=today&endDate=today&accountId=pub-1320661661569887&metric=EARNINGS&useTimezoneReporting=true&key=AIzaDeTPNM2w6qOPMO68vfEH5XTjEsdPEf7K9lpVc' 
--header 'Authorization: Bearer ya29.a0AfH6l8BRwADYPnjpAFpBEfUykAdMyKXxpnSWaChUBrKJJDWOPLNTREWfdgfdgcGwPr3UJPOH0tp5VYgT6A0kjVwDxCffeKIl2VNbUe6FagfkkSvNNQO795FJW4iPtfaKFFRcdKai1c1XQ' 
--header 'Accept: application/json' 
--compressed

Ну и ответ:

[
  {
    "kind": "adsense#report",
    "totalMatchedRows": "1",
    "headers": [
      {
        "name": "EARNINGS",
        "type": "METRIC_CURRENCY",
        "currency": "USD"
      }
    ],
    "rows": [
      [
        "9.31"
      ]
    ],
    "totals": [
      "9.31"
    ],
    "averages": [
      "9.31"
    ],
    "startDate": "2020-09-19",
    "endDate": "2020-09-19"
  }
]

Вот и все. Доступ к данным вы получили. Теперь надо научиться обновлять токен, так как этот протухнет через час. Обновляем его с помощью следующего запроса.

curl --request POST 
--data "client_id=[client_id]&client_secret=[client_secret]&refresh_token=[refresh_token]&grant_type=refresh_token" 
https://accounts.google.com/o/oauth2/token

На выходе получите новый токен для доступа к api.

В целом, разобрали механизм доступа и получения данных из google api. Дальше передать это все в Zabbix дело техники. Я уже не стал там сильно заморачиваться и сделал все в лоб через bash скрипты, хотя есть и другие варианты. Рассказываю далее об этом.

Немного полезных ссылок по теме. Для формирования, да и просто проверки запросов к api, удобно пользоваться API Explorer. Его можно вызвать справа в сайдбаре. Слева будет документация по типам ресурсов. Мне нужен только ресурс report и метрика earnings для запроса различных доходов по датам. А так же ресурс payments для информации о текущем балансе аккаунта.

И еще полезная ссылка на getting_started от самого гугла. Там кратко будет описан принцип работы с google adsense api.

Сбор данных в Zabbix из Google API

Осталось самое простое — настроить сбор данных в Zabbix через Google api. Из-за того, что токен протухает и его надо постоянно обновлять, не получится собирать данные только через HTTP Агент. Я спросил в чате Zabbix, можно ли как-то реализовать сбор данных по такой схеме только в шаблоне. Мне ответили, что можно, но схема мне не очень понравилась.

Можно создать отдельный item для хранения токена, который будет регулярно обновляться запросом с использованием временного токена. В постобработке этого итема было предложено с помощью JavaScript обновлять макрос для основного айтема, где будет храниться токен, через zabbix api.

Плюс этого метода в том, что все хранится в шаблоне, легко переносится и сохраняется. Нет необходимости что-то делать на хостах. Минус только один — если итемов и проверок много, это все нагружается сервер мониторинга, так как собирает и обрабатывает данные он полностью сам. В целом, я все стараюсь реализовать в шаблонах, так как с большими нагрузками не работаю, а удобство такого подхода налицо.

В данном случае не стал разбираться с JavaScript и Zabbix api, так как банально стало жаль время тратить. Решил отложить этот как-нибудь на потом, а все запросы реализовал по старинке на хосте через bash скрипты. Заняло это у меня буквально 10 минут. Буду передавать готовые цифры сразу в Zabbix через UserParameter.

Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:

  1. Установка CentOS 8.
  2. Настройка CentOS 8.
  3. Установка и настройка zabbix сервера.

То же самое на Debian 10, если предпочитаете его:

  1. Установка Debian 10.
  2. Базовая настройка Debian.
  3. Установка и настройка zabbix на debian.

Я настроил сбор следующих данных о доходе из adsense по api:

  1. Сегодня.
  2. Вчера.
  3. В текущем месяце.
  4. В прошлом месяце.
  5. А так же текущий баланс аккаунта.

Доступ к Google API AdSense через Zabbix

Для этого я простым копипастом сделал 5 скриптов с автообновлением токена и 5 итемов. Вот содержимое скриптов.

# cat adsense-day.sh
#!/bin/bash

client_id='782412765764-gu9dsfsrtyjgd6kn.apps.googleusercontent.com'
client_secret='l7_-a73uErw532oPer67riuJfix'
refresh_token='1//0ck3_00Bbay6NQmOyPE_9UGKDFghmEwPuhDDEHMWrjjjlWedNceQwepfdkjEvhsadfEWQQPPJfgfcmmSwqfgfh'
api='AIzAswwQQEfjlPewvBnmFDDRTsHYGGUyTjUFqEf7K9lpVc'

token=`curl -s --request POST --data "client_id=${client_id}&client_secret=${client_secret}&refresh_token=${refresh_token}&grant_type=refresh_token" https://accounts.google.com/o/oauth2/token | grep access_token | awk '{print $2}' | sed -e 's/^.//' | sed 's/..$//'`

curl -s "https://www.googleapis.com/adsense/v1.4/reports?startDate=today&endDate=today&accountId=pub-13106391315157&metric=EARNINGS&useTimezoneReporting=true&key=${api}" 
  --header "Authorization: Bearer ${token}" 
  --header "Accept: application/json" 
  --compressed

Я в переменную token записываю токен доступа, полученный с помощью refresh_token, обрезав все лишнее в выводе. А дальше его подставляю в запрос.

В остальных скриптах на запрос дохода меняются только даты:

  • adsense-yesterday.sh — startDate=today-1d&endDate=today-1d.
  • adsense-month.sh — startDate=startOfMonth&endDate=today
  • adsense-lastmonth.sh — startDate=startOfMonth-1m&endDate=startOfMonth-1d
# cat adsense-payments.sh
#!/bin/bash

client_id='782412765764-gu9dsfsrtyjgd6kn.apps.googleusercontent.com'
client_secret='l7_-a73uErw532oPer67riuJfix'
refresh_token='1//0ck3_00Bbay6NQmOyPE_9UGKDFghmEwPuhDDEHMWrjjjlWedNceQwepfdkjEvhsadfEWQQPPJfgfcmmSwqfgfh'
api='AIzAswwQQEfjlPewvBnmFDDRTsHYGGUyTjUFqEf7K9lpVc'

token=`curl -s --request POST --data "client_id=${client_id}&client_secret=${client_secret}&refresh_token=${refresh_token}&grant_type=refresh_token" https://accounts.google.com/o/oauth2/token | grep access_token | awk '{print $2}' | sed -e 's/^.//' | sed 's/..$//'`

curl -s "https://www.googleapis.com/adsense/v1.4/accounts/pub-1310661631569687/payments?key=${api}" 
  --header "Authorization: Bearer ${token}" 
  --header "Accept: application/json" 
  --compressed

Тут другой url запроса, так как поменялся ресурс с reports на payments.

Добавляем UserParameter в конфигурацию zabbix агента.

UserParameter=adsense.day, /bin/bash /etc/zabbix/scripts/adsense-day.sh
UserParameter=adsense.yesterday, /bin/bash /etc/zabbix/scripts/adsense-yesterday.sh
UserParameter=adsense.month, /bin/bash /etc/zabbix/scripts/adsense-month.sh
UserParameter=adsense.lastmonth, /bin/bash /etc/zabbix/scripts/adsense-lastmonth.sh
UserParameter=adsense.payments, /bin/bash /etc/zabbix/scripts/adsense-payments.sh

Перезапустите агента и проверьте работу итемов.

# zabbix_agentd -t adsense.day
adsense.day                                   [t|{"kind":"adsense#report","totalMatchedRows":"1","headers":[{"name":"EARNINGS","type":"METRIC_CURRENCY","currency":"USD"}],"rows":[["9.42"]],"totals":["9.42"],"averages":["9.42"],"startDate":"2020-09-19","endDate":"2020-09-19"}]

На выходе должны получить json. Подробно работу с json в Zabbix я разбирал в отдельной статье. Теперь идем на Zabbix сервер и создаем шаблон. Я покажу на примере одного итема, как я предобработкой разбираю приходящий json.

Создаем новый итем.

Доступ к Google API AdSense через Zabbix

И к нему Предобработку, чтобы получить только число.

Доступ к Google API AdSense через Zabbix

Для построения JSONPath рекомендую вот этот онлайн конструктор — http://jsonpath.com. В данном случае не очень актуально, так как jsonpath простой. Но в сложных ситуациях сильно выручает. Выгрузил вам для примера мой шаблон с этими пятью айтемами — zabbix-adsense.xml.

Там ничего особенного нет, просто 5 айтемов с настроенными интервалами, чтобы не дергать лишний раз api. Доход прошлого месяца запрашиваем 2-го числа нового месяца. Вчерашний доход забираем сегодня в 17.00 и т.д. Посмотрите сами и настройте так, как вам нужно.

Заключение


Не понравилась статья и хочешь научить меня администрировать? Пожалуйста, я люблю учиться. Комментарии в твоем распоряжении. Расскажи, как сделать правильно!

Я показал общий принцип работы с google api в Zabbix. Сам еще подробно не разбирался и дашборды не составлял. Остановился ровно на том, на чем закончил статью. Дальше буду все это разрабатывать и настраивать под конкретные задачи и нужды. Потом все это уедет вместе с остальными метриками в grafana для удобного дашборда. Возможно покажу все это уже в готовом виде.

Для более сложных и разнообразных запросов надо сделать один скрипт с передачей параметров даты, чтобы не плодить скрипты под каждый айтем. Хотелось бы получить какую-то обратную связь от тех, кто всем этим уже занимался. Тема вообще не гуглится, разбирался во всем сам. Думаю, что в основном для работы с api используются готовые библиотеки под различные языки программирования. Прямые запрос через curl больше на экзотику тянет.

И еще у меня есть некоторые подозрения, что я пошел по сложному пути, и есть способ доступа к api попроще, без протухающих токенов. Но я не понял, как сделать по-другому.

Онлайн курс по Linux

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, рекомендую познакомиться с онлайн-курсом «Administrator Linux. Professional» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.

Что даст вам этот курс:

  • Знание архитектуры Linux.
  • Освоение современных методов и инструментов анализа и обработки данных.
  • Умение подбирать конфигурацию под необходимые задачи, управлять процессами и обеспечивать безопасность системы.
  • Владение основными рабочими инструментами системного администратора.
  • Понимание особенностей развертывания, настройки и обслуживания сетей, построенных на базе Linux.
  • Способность быстро решать возникающие проблемы и обеспечивать стабильную и бесперебойную работу системы.

Проверьте себя на вступительном тесте и смотрите подробнее программу по .

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.
Источник

Просмотров:

Добавить комментарий