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

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

Углубленный онлайн-курс по MikroTik

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Введение

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

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

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

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

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

Google api console

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

Добавление нового api

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

Включение AdSense Management API

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

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

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

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

Добавление api key

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

Ограничения ключа api

Самое простое сделали. Активировали 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

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

Создание идентификатора клиента oauth

У вас теперь есть Идентификатор клиента (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

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

Разрешение на доступ к данным по api

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

Google Authentication code

Запомните его, он нам пригодится далее. С его помощью, а так же с помощью 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. Это то, что нам нужно.

Получение access_token

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

curl \
'https://adsense.googleapis.com/v2/accounts/[account id]/reports:generate?dateRange=TODAY&reportingTimeZone=ACCOUNT_TIME_ZONE&metrics=ESTIMATED_EARNINGS&key=[api]' \
--header 'Authorization: Bearer [access_token]' \
--header 'Accept: application/json' \
--compressed

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

curl \'https://adsense.googleapis.com/v2/accounts/pub-1320661661569887/reports:generate?dateRange=TODAY&reportingTimeZone=ACCOUNT_TIME_ZONE&metrics=ESTIMATED_EARNINGS&key=AIzaDeTPNM2w6qOPMO68vfEH5XTjEsdPEf7K9lpVc' \
--header 'Authorization: Bearer ya29.a0AfH6l8BRwADYPnjpAFpBEfUykAdMyKXxpnSWaChUBrKJJDWOPLNTREWfdgfdgcGwPr3UJPOH0tp5VYgT6A0kjVwDxCffeKIl2VNbUe6FagfkkSvNNQO795FJW4iPtfaKFFRcdKai1c1XQ' \
--header 'Accept: application/json' \
--compressed

Ну и ответ:

{
  "totalMatchedRows": "1",
  "headers": [
    {
      "name": "ESTIMATED_EARNINGS",
      "type": "METRIC_CURRENCY",
      "currencyCode": "USD"
    }
  ],
  "rows": [
    {
      "cells": [
        {
          "value": "12.15"
        }
      ]
    }
  ],
  "totals": {
    "cells": [
      {
        "value": "12.15"
      }
    ]
  },
  "averages": {
    "cells": [
      {
        "value": "12.15"
      }
    ]
  },
  "startDate": {
    "year": 2021,
    "month": 10,
    "day": 22
  },
  "endDate": {
    "year": 2021,
    "month": 10,
    "day": 22
  }
}

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

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 и подраздел generate для запроса различных доходов по датам. А также ресурс 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. А так же текущий баланс аккаунта.

Сбор данных из 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://adsense.googleapis.com/v2/accounts/pub-1310661631569687/reports:generate?dateRange=TODAY&reportingTimeZone=ACCOUNT_TIME_ZONE&metrics=ESTIMATED_EARNINGS&key=${api}" \
  --header "Authorization: Bearer ${token}" \
  --header "Accept: application/json" \
  --compressed

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

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

  • adsense-yesterday.sh - YESTERDAY.
  • adsense-month.sh - MONTH_TO_DATE

Отдельно пришлось повозиться с доходом за прошлый месяц. После смены adsense api с v1.4 на v2.0, нельзя просто запросить данные за прошлый месяц, указав что-то вроде startDate=startOfMonth-1m&endDate=startOfMonth-1d, как можно было раньше. Теперь надо явно указать даты целыми числами. Пришлось это реализовать силами bash.

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

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

LAST_MONTH=$(date "+%F" -d "$(date +'%Y-%m-01') -1 month")
YEAR=$(date "+%Y" -d "$(date +'%Y-%m-01') -1 month")
MONTH=$(date "+%m" -d "$(date +'%Y-%m-01') -1 month")
DAY_START=$(date "+%d" -d "$(date +'%Y-%m-01') -1 month")
DAY_END=$(date "+%d" -d "$LAST_MONTH +1 month -1 day")

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://adsense.googleapis.com/v2/accounts/pub-13106391315157/reports:generate?endDate.year=$YEAR&dateRange=CUSTOM&reportingTimeZone=ACCOUNT_TIME_ZONE&startDate.day=$DAY_START&endDate.month=$MONTH&endDate.day=$DAY_END&metrics=ESTIMATED_EARNINGS&startDate.year=2021&startDate.month=$MONTH&key=${api}" \
  --header "Authorization: Bearer ${token}" \
  --header "Accept: application/json" \
  --compressed

И последний скрипт с общим балансом аккаунта.

# 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://adsense.googleapis.com/v2/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{ "totalMatchedRows": "1", "headers": [ { "name": "ESTIMATED_EARNINGS", "type": "METRIC_CURRENCY", "currencyCode": "USD" } ], "rows": [ { "cells": [ { "value": "12.19" } ] } ], "totals": { "cells": [ { "value": "12.19" } ] }, "averages": { "cells": [ { "value": "12.19" } ] }, "startDate": { "year": 2021, "month": 10, "day": 22 }, "endDate": { "year": 2021, "month": 10, "day": 22 } }]

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

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

Item для запроса данных из adsense api

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

Предобработка json

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

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

Заключение

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

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

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

Углубленный онлайн-курс по MikroTik.

Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.

Помогла статья? Подписывайся на telegram канал автора

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

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

10 комментариев

  1. Здравствуте не нашли решения с обновлением токена ?

    • Нет, но я и не искал. У меня нормально работало то, что описано в статье. Но сейчас всё это стало неактуально. С гуглом больше не работаю.

      • Я занимаюсь другой системой не гугл, не подскажете какие Вам советы на форуме давали . Ссылка может? Нужен алгоритм.

  2. Сергей

    Спасибо Большое, очень помогли!

  3. Не думал, что так можно использовать Zabbix... Если только для этого, то слишком большой геморой и расходы...

    • Дело то не только в zabbix. Не важно, куда загружать данные из api. Казалось бы, есть Яндекс.Метрика или Google Analitycs с очень большим функционалом по визуализации и отчетам. И тем не менее, я знаю, что есть сео специалисты, которые регулярно используют свои запросы к метрикам через api и строят отчеты, которые они не могут получить через web интерфейс. Кто-то прям через браузер опрашивает и выгружает в csv, кто-то заказывает небольшую разработку своей панели на php или python. В общем, тут большой простор для кастомизации.

      Простой пример, как можно без каких-то особенных затрат получить полезный функционал по работе с adsense. Очень просто сделать триггер, который будет срабатывать, если у вас за текущий день доход по сайту в 2 раза меньше, чем в среднем по дням на прошлой неделе. Кому-то только этого оповещения будет достаточно и оно решит конкретную проблему.

      • Логика в ваших рассуждениях конечно есть. Но как посмотрю на наш зоопарк Zabbix, то этот функционал кажется излишним. У нас 5 серваков работает + 3 прокси и 1 БД. Даже если все на одном серваке крутить, тоже проблем не мало. Только поднять и наладить, а потом сопровождение. Да и тоже некоторые навыки в разработке, скажем нужны, настройки триггеров иногда не так тривиальны.

        • Это все понятно. Предложенное мной решение очень нетривиально и мало кому будет актуально. Я больше для настройки доступа к google api это выложил. Сам то я отлично знаю Zabbix и для меня что-то реализовать на нем не представляет большой проблемы. Но если разбираться с нуля, то конечно есть более простые и удобные варианты, чем колхозить скрипты и триггеры на заббиксе.

          Например, мне удобно и прогноз погоды по температуре смотреть в Zabbix :) Так как я целыми днями в нем сижу и замыкаю все метрики на него, как и на телеграм. У меня это постоянный инструмент под рукой.

  4. Валентин

    А почему бы для этих задач не использовать предназначенные для этого сервисы, такие как roistat к примеру?

    • Странный вопрос. На него нет однозначного ответа. Если кого-то устраивает riostat, то надо пользоваться им. Zabbix система мониторинга, которая позволяет объединить в себе любые данные, какие только пожелаете. Готовые системы оставляют вас в рамках функционала своей системы.

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

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

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar