На днях размотал запутанную головоломку, поэтому ее надо обязательно описать, иначе сам забуду. Я настроил доступ к google api для того, чтобы забирать данные в Zabbix. Покажу это на примере информации из личного кабинета Adsense. Забирать инфу через api будем обычными post и get запросами через curl.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Введение
Для начала расскажу, для чего я все буду делать. Глобальная задача стоит сделать дашборд для работы маркетолога или ssm специалиста. Свести в одно место метрики из разных систем - посещаемость сайтов, монетизация, активность в группах vk, telegram и т.д. Часть этого всего я уже сделал. Буду постепенно делиться на страницах сайта. Начать рассказ решил с самого сложного - работа с google api.
В целом, работа со всеми api примерно одинаковая и не представляет особой сложности. С goolge api возникают проблемы с доступом у тех, кто первый раз все это настраивает. Там слишком много всяких сущностей. Надо пройти определенный квест и регулярно его повторять, чтобы иметь доступ к google api. Сделано все это для безопасной работы больших и сложных систем. Ну а обычным юзерам, которые просто хотят дергать curl-ом какие-то метрики, это кажется не очень простым.
В общем, расскажу обо всем по порядку, чтобы было понятно даже новичку, который только начинает работу с api. Покажу на реальном примере моего сайта и кабинета adsense к нему.
Добавление ресурсов в консоли API
Вся настройка начинается с работы в Консоли API. Вам необходимо создать новый проект.
Я создал новый проект и назвал его serveradmin. После этого в верхнем левом углу выбирайте меню навигации и переходите в API и сервисы.
Далее нажимайте сверху на кнопку ENABLE APIS AND SERVICES. В поиске набирайте adsesne и переходите в AdSense Management API.
На следующей странице нажимайте ВКЛЮЧИТЬ.
API мы запустили, теперь нужно создать для него ключ. С помощью ключа можно обращаться к конкретному API, к которому он привязан. Здесь ожидаешь, что это будет некий токен, с помощью которого можно будет уже получать данные, но нет. Нужно четко понимать терминологию и логику работы google api. Сейчас мы создаем именно идентификатор, который будет привязан к api adsense, чтобы по нему обращаться только конкретно к этим данным.
Итак, идем в раздел Учетные данные и создаем новые. Выбираем Ключ API.
В настройках ключа можно настроить ограничение доступа на уровне IP или доменного имени сайта, с которого будут идти запросы. Если у вас есть возможность ограничить доступ, рекомендую это сделать сразу же. Я обычно по ip делаю ограничение, так как данные собираю только с конкретного сервера. В списке допустимых api укажите только AdSense Management API, который мы добавили ранее. Для каждой службы лучше делать свой ключ.
Самое простое сделали. Активировали API и добавили ключ, по которому мы будем к нему обращаться. Теперь надо настроить доступ к этому API.
Доступ к Google API
Я не буду подробно описывать теорию работы с google api через OAuth 2.0. Вы можете без проблем нагуглить эту информацию. Опишу своими словами, как это работает.
- Сначала нужно создать идентификатор клиента OAuth 2.0, который будет состоять из client_id и client_secret.
- Далее для этого идентификатора нужно будет запросить Authentication code, указав scope, на который он будет распространяться. В нашем случае scope для adsense - https://www.googleapis.com/auth/adsense.readonly, так как я собираюсь только читать данные через api, не менять их.
- С помощью полученного кода мы делаем запрос токена. В ответ получаем access_token и refresh_token. С помощью первого токена мы можем делать запросы на получение данных, с помощью второго - обновлять первый. Проблема в том, что access_token действует только 60 минут. После этого его надо обновлять с помощью refresh_token, у которого нет ограничения по времени жизни.
Вот такая схема доступа к данным через google api. Я не буду часто обращаться за данными, поэтому решил в каждом запросе к api сначала обновлять access_token с помощью refresh_token и подставлять новый токен в запрос. Приступаем к реализации.
Идем снова в раздел Учетные данные и добавляем новые, только теперь указываем Идентификатор клиента OAuth.
Вам будет предложено создать Окно запроса доступа OAuth. Сделайте это, указав любое название и выбрав тип - Внешнее. Все остальные поля заполнять не обязательно. После этого снова возвращайтесь к созданию идентификатора oauth. В типе приложения указывайте Приложение для ПК. Именно этот тип подходит для запросов через curl.
У вас теперь есть Идентификатор клиента (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.
И далее спросят, согласны ли вы ей предоставить доступ к просмотру данных adsense.
После вашего согласия получите необходимый код.
Запомните его, он нам пригодится далее. С его помощью, а так же с помощью 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. Это то, что нам нужно.
Теперь у нас есть все для того, чтобы получать данные из кабинета 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:
То же самое на Debian 10, если предпочитаете его:
Я настроил сбор следующих данных о доходе из adsense по api:
- Сегодня.
- Вчера.
- В текущем месяце.
- В прошлом месяце.
- А так же текущий баланс аккаунта.
Для этого я простым копипастом сделал 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.
Создаем новый итем.
И к нему Предобработку, чтобы получить только число.
Для построения JSONPath рекомендую вот этот онлайн конструктор - http://jsonpath.com. В данном случае не очень актуально, так как jsonpath простой. Но в сложных ситуациях сильно выручает. Выгрузил вам для примера мой шаблон с этими пятью айтемами - zabbix-adsense.yaml.
Там ничего особенного нет, просто 5 айтемов с настроенными интервалами, чтобы не дергать лишний раз api. Доход прошлого месяца запрашиваем 2-го числа нового месяца. Вчерашний доход забираем сегодня в 17.00 и т.д. Посмотрите сами и настройте так, как вам нужно.
Заключение
Я показал общий принцип работы с google api в Zabbix. Понимаю, что в среде айтишников это мало кому может пригодиться, но лично я сам пользуюсь, так как имею учетку и небольшой заработок в adsense с баннеров на этом сайте. Собрал все интересующие меня метрики в grafana для удобного дашборда. Возможно покажу все это уже в готовом виде.
Для более сложных и разнообразных запросов надо сделать один скрипт с передачей параметров даты, чтобы не плодить скрипты под каждый айтем. Хотелось бы получить какую-то обратную связь от тех, кто всем этим уже занимался. Тема вообще не гуглится, разбирался во всем сам. Думаю, что в основном для работы с api используются готовые библиотеки под различные языки программирования. Прямые запрос через curl больше на экзотику тянет.
И еще у меня есть некоторые подозрения, что я пошел по сложному пути, и есть способ доступа к api попроще, без протухающих токенов. Но я не понял, как сделать по-другому.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Здравствуте не нашли решения с обновлением токена ?
Нет, но я и не искал. У меня нормально работало то, что описано в статье. Но сейчас всё это стало неактуально. С гуглом больше не работаю.
Я занимаюсь другой системой не гугл, не подскажете какие Вам советы на форуме давали . Ссылка может? Нужен алгоритм.
Спасибо Большое, очень помогли!
Не думал, что так можно использовать Zabbix... Если только для этого, то слишком большой геморой и расходы...
Дело то не только в zabbix. Не важно, куда загружать данные из api. Казалось бы, есть Яндекс.Метрика или Google Analitycs с очень большим функционалом по визуализации и отчетам. И тем не менее, я знаю, что есть сео специалисты, которые регулярно используют свои запросы к метрикам через api и строят отчеты, которые они не могут получить через web интерфейс. Кто-то прям через браузер опрашивает и выгружает в csv, кто-то заказывает небольшую разработку своей панели на php или python. В общем, тут большой простор для кастомизации.
Простой пример, как можно без каких-то особенных затрат получить полезный функционал по работе с adsense. Очень просто сделать триггер, который будет срабатывать, если у вас за текущий день доход по сайту в 2 раза меньше, чем в среднем по дням на прошлой неделе. Кому-то только этого оповещения будет достаточно и оно решит конкретную проблему.
Логика в ваших рассуждениях конечно есть. Но как посмотрю на наш зоопарк Zabbix, то этот функционал кажется излишним. У нас 5 серваков работает + 3 прокси и 1 БД. Даже если все на одном серваке крутить, тоже проблем не мало. Только поднять и наладить, а потом сопровождение. Да и тоже некоторые навыки в разработке, скажем нужны, настройки триггеров иногда не так тривиальны.
Это все понятно. Предложенное мной решение очень нетривиально и мало кому будет актуально. Я больше для настройки доступа к google api это выложил. Сам то я отлично знаю Zabbix и для меня что-то реализовать на нем не представляет большой проблемы. Но если разбираться с нуля, то конечно есть более простые и удобные варианты, чем колхозить скрипты и триггеры на заббиксе.
Например, мне удобно и прогноз погоды по температуре смотреть в Zabbix :) Так как я целыми днями в нем сижу и замыкаю все метрики на него, как и на телеграм. У меня это постоянный инструмент под рукой.
А почему бы для этих задач не использовать предназначенные для этого сервисы, такие как roistat к примеру?
Странный вопрос. На него нет однозначного ответа. Если кого-то устраивает riostat, то надо пользоваться им. Zabbix система мониторинга, которая позволяет объединить в себе любые данные, какие только пожелаете. Готовые системы оставляют вас в рамках функционала своей системы.