Статья предназначена для маркетологов и собственников бизнеса, которые ведут рекламные кампании в Яндекс Директе (или любой другой рекламной системе) и хотят ежедневно держать руку "на пульсе" того как работает их реклама. Мы рассмотрим, как можно автоматизировать сбор данных из рекламной системы, обрабатывать их и регулярно отправлять уведомления о результатах в Telegram с помощью Python.
Основная цель оперативно анализировать данные по рекламе за текущий период, с первого взгляда на сообщение понимать как идут дела в рекламе не заходя в рекламные кабинеты. Оценивая эту задачу мы пришли к выводу, что цифры со статистикой "за вчера", оторванные от контекста месяца / полугодия не имеют ни какого смысла. Для аналитики рекламы с привязкой к контексту данных мы применили подход оценки средних значений за последние 7, 30 и 90 дней.
Таким образом мы можем оперативно сделать вывод о том, как работает реклама сейчас и как она работала в среднем за последнее время. Если показатели за последние 7 дней показывают рост относительно 30, 90 дней - значит дела идут в нужном направлении, если спад, значит нужно начинать разбираться в чем дело.
Содержание
Выбор способа хранения и получения исходных данных
Шаг 1: Выбор способа хранения и получения исходных данных
Перед тем, как что-то рассылать в уведомлениях нам необходимо подготовить данные. Здесь есть два основных подхода: использование готового хранилища данных или прямое подключение к API рекламной системы.
Идеальный (на мой вкус) вариант - с хранилищем
Этот вариант считается более стабильным и предпочтительным. Вы заранее настраиваете ежедневную загрузку данных из рекламных систем в единое хранилище используя к примеру Python (пример не идеален но логика верная) или язык R.
Например, данные из таких платформ, как Яндекс Директ, ВК Реклама, TG Ads, могут автоматически загружаться и актуализироваться в базе данных. Это позволяет вам работать с уже обработанными данными и исключить риски, связанные с потерей соединения или неполным получением информации.
Преимущества:
Стабильность: Данные уже загружены в базу, что исключает риски, связанные с непредсказуемостью работы API. Это особенно важно, если вам нужно регулярно получать большие объемы данных.
Доступность: Данные всегда под рукой, и к ним можно обращаться в любой момент без необходимости делать запросы к внешним сервисам.
Исторические данные: Можно хранить и обрабатывать данные за продолжительный период, что полезно для анализа и долгосрочных трендов.
Недостатки:
Требуется инфраструктура: Необходимость организации и поддержки хранилища данных, что может быть затратным по времени и ресурсам.
Первоначальная настройка: Требуется настройка процессов для автоматической загрузки данных, что может занять значительное время.
Сложность обновления данных: Если данные обновляются часто, могут возникнуть задержки в получении самой актуальной информации.
Прямое подключение к API
Этот подход менее надежен, так как он напрямую зависит от стабильности соединения с API рекламной системы, но запросы к ней так же можно посылать используя любой язык программирования в том числе Python или R.
Если запросы на получение данных слишком объемны, возможно, что соединение будет прерываться, и данные могут приходить неполными или вообще не прийти. Каждый раз при запросе данных происходит подключение к API, получение необходимой информации за выбранный период и ее обработка перед отправкой в Telegram.
Преимущества:
Свежие данные: Данные всегда актуальны на "сейчас", так как запросы происходят в реальном времени. Это особенно полезно, если вам нужны последние данные для оперативного принятия решений, но это не очень актуально если рекламу вы хотите оценивать в режиме "обобщенной аналитики" за прошедший период.
Отсутствие необходимости в хранилище: Вы можете обойтись без настройки и поддержки базы данных, просто подключаясь к API по мере необходимости. Наверное это ключевой плюс такого подхода.
Недостатки:
Нестабильность: Прямое подключение к API рекламных систем может приводить к обрывам соединения, особенно при больших объемах данных, что чревато потерей данных или задержками.
Ограничения API: Многие рекламные системы накладывают ограничения на количество запросов или объем данных, которые можно получить за один раз, что усложняет процесс получения полного набора данных.
Обработка ошибок: Необходимо реализовывать дополнительную логику для обработки неудачных запросов, повторов и частичных данных, что увеличивает сложность реализации именно в рамках построения уведомительной системы.
Шаг 2: Подключение к Telegram
После того, как вы определились с источником данных, следующий шаг – это настройка интеграции с Telegram для отправки уведомлений.
Создание бота
Для работы с Telegram нам понадобится бот. Его можно легко создать с помощью официального бота @BotFather в Telegram:
Откройте диалог с @BotFather и выполните команду
/newbot
.Следуйте инструкциям для создания бота и получения токена, который будет использован в Python для отправки сообщений. Полученный токен обязательно скопируйте, дальше он нам пригодится для работы с отправкой сообщений.
-
Добавьте созданного бота в чат или канал, куда будут приходить уведомления. Для этого шага необходимо, чтобы бот был добавлен в канал или чат Телеграм и получил там права администратора с правами на отправку сообщений.
Права добавляются в разделе администрирования канала или чата при переходе к администраторам ресурса.
Шаг 3: Подключение к хранилищу данных
Теперь, когда бот Telegram настроен, нужно подключиться к хранилищу данных, где хранятся результаты рекламных кампаний. Для этого можно использовать такие библиотеки Python, как pymysql
или sqlalchemy
.
Подключаемые библиотеки
from sqlalchemy import create_engine
import pandas as pd
from datetime import datetime
import requests
Здесь мы подключаем четыре необходимых пакета:
sqlalchemy
: Этот пакет используется для создания подключения к базе данных. Он позволяет взаимодействовать с различными СУБД (системами управления базами данных) через единый интерфейс.pandas
: Это популярная библиотека для работы с данными в Python. Мы используемpandas
для загрузки данных из базы в виде DataFrame — структуры данных, удобной для дальнейшего анализа.datetime:
Это модуль из стандартной библиотеки Python предоставляет функциональность для работы с датами и временем.requests
: Эта бибилиотека предназначена для выполнения HTTP-запросов. Она используется для взаимодействия с внешними веб-сервисами или API.
Подключение к базе данных
db_url = f"mysql+mysqlconnector://{user}:{password}@{host}:{port}/{dbname}?auth_plugin=mysql_native_password"
engine = create_engine(db_url)
Здесь происходит настройка и создание подключения к базе данных:
-
db_url
: Формируется строка подключения, которая включает:user
: Имя пользователя базы данных.password
: Пароль для доступа к базе.host
: Адрес сервера базы данных.port
: Порт, по которому происходит подключение (обычно 3306 для MySQL).dbname
: Название базы данных, с которой будет вестись работа.auth_plugin
: Параметр, указывающий, какой плагин используется для аутентификации (в данном случаеmysql_native_password
).
Строка подключения передается в SQLAlchemy для создания безопасного подключения к базе данных.
engine
: Мы используем функциюcreate_engine
из SQLAlchemy, чтобы создать объект подключения к базе данных. Этот объект позволяет выполнять SQL-запросы и управлять соединением.
SQL-запрос данных для последних 7 дней
Здесь мы формируем SQL-запрос для получения данных за последние 7 дней. Запрос выполняет следующие операции:
-
SELECT
: Выбираем нужные метрики:CabinetName
: поле с данными о наименовании рекламного кабинетаTotalCost
: Сумма затрат за последние 7 дней. ИспользуемROUND
для округления значения до целого числа.TotalClicks
: Общее количество кликов по рекламе.TotalConversions
: Общее число конверсий, полученных с рекламных кампаний. Мы суммируем несколько целей (goal_1 - goal_6), используяCOALESCE
, чтобы учесть случаи, когда значения целей могут быть нулевыми.TotalImpressions
: Общее количество показов рекламы (охваты).AverageCPC
: Средняя цена за клик (CPC), рассчитываемая как общие затраты, деленные на количество кликов.CPA
: Цена за конверсию (CPA), рассчитанная как общие затраты, деленные на количество конверсий.
FROM
: Указываем таблицуtf_direct
, которая содержит данные из Яндекс Директа (у вас эта таблица может называться по другому).WHERE
: Фильтр данных по дате. Используется функцияDATE_SUB
, чтобы выбрать данные за последние 7 дней от текущей даты (CURDATE()
).
SQL-запросы для последних 30 и 90 дней
query_last_30_days = query.replace("7 DAY", "30 DAY")
query_last_90_days = query.replace("7 DAY", "90 DAY")
Эти строки изменяют исходный SQL-запрос для выборки данных за последние 30 и 90 дней соответственно:
query_last_30_days
: Создается копия запроса, где фильтр по дате заменяется на "последние 30 дней".query_last_90_days
: Создается копия запроса для выборки данных за последние 90 дней.
Это позволяет повторно использовать исходный запрос, заменяя только временные интервалы.
Выполнение SQL-запросов и получение данных
last_7_days_data = pd.read_sql(query, con=engine)
last_30_days_data = pd.read_sql(query_last_30_days, con=engine)
last_90_days_data = pd.read_sql(query_last_90_days, con=engine)
Здесь выполняются запросы и загружаются результаты в DataFrame с помощью pandas
:
pd.read_sql
: Функция загружает данные, полученные по SQL-запросу, в объектDataFrame
, который удобен для последующей работы и анализа данных.last_7_days_data
,last_30_days_data
,last_90_days_data
: Три разных переменные для данных за последние 7, 30 и 90 дней.
Возврат результатов
return last_7_days_data, last_30_days_data, last_90_days_data
В итоге функция возвращает три объекта DataFrame, содержащих данные за последние 7, 30 и 90 дней. Эти данные можно использовать для анализа метрик эффективности рекламных кампаний - Общий код запроса.
Шаг 4: Формирование отчетов и отправка данных в Telegram
После получения сводных данных из базы, важно обработать их и сформировать понятные отчеты. Используйте библиотеку Pandas для работы с данными.
Так как у нас была задача формировать средние значения за 7, 30, 90 дней мы напишем функции, которые смогут обращаться к данным собранным на Шаге 3 и формировать из них средние значения по всем ключевым показателям - Функции усреднения.
После того как усредненные данные нами были получены, мы можем из них формировать сообщение для отправки в Телеграм - Функция для формирования сообщения для отправки в ТГ
Отправка данных в Телеграм:
def sent_msg(msg):
TOKEN = f'777********43:AAHOR***********cEj4lbJo' # Указываем Токен, который получили на Шаге 2 от BotFather
CHATS_ID = [f'-35*****8'] # Указываем ID чата в который планируем отправлять сообщения ботом
for CHAT_ID in CHATS_ID:
url = f"https://api.telegram.org/bot{TOKEN}/sendMessage?chat_id={CHAT_ID}&text={msg}&parse_mode=HTML"
response = requests.get(url)
if response.status_code == 200:
print(f"Message sent successfully to {CHAT_ID}")
else:
print(f"Failed to send message to {CHAT_ID}: {response.text}")
Чтобы получить CHATS_ID можете воспользоваться ботом в Телеграм -@getmyid_bot
, добавив его в свою группу / чат и он в ответ пришлет вам ID вашего чата.
Уже на этом этапе, выполнив запрос:
message = build_msg(merged_data)
sent_msg(message)
Ваше сообщение со всеми данными по рекламе должны попасть в тот чат, для которого мы выше получали CHATS_ID.
Шаг 5: Автоматизация отправки уведомлений
Последний этап – это автоматизация процесса. Один из способов – настроить задачу на ежедневную отправку отчетов с помощью Task Scheduler на Windows.
Настройка задачи в Task Scheduler
Откройте Task Scheduler (Планировщик задач).
-
Создайте новую задачу, выбрав "Создать задачу".
Установите триггер на ежедневное выполнение в заданное время.
-
В разделе "Действия" укажите запуск Python-скрипта:
python путь_к_скрипту.py
Сохраните задачу.
Теперь ваш скрипт будет автоматически запускаться каждый день в указанное время и отправлять отчеты в Telegram.
Альтернативные решения
Для пользователей Linux можно использовать cron для настройки автоматического запуска скрипта. Например:
0 9 * * * /usr/bin/python3 /path/to/script.py
Это задание будет запускать скрипт ежедневно в 9:00.
Заключение
Мы рассмотрели, как можно автоматизировать процесс формирования отчетов о рекламных кампаниях и их отправку в Telegram. Теперь, с помощью Python и небольшого скрипта, вы сможете ежедневно получать актуальные данные в динамике и следить за работой ваших рекламных кампаний. Не упускать важные изменения, вовремя реагировать на колебания и оптимизировать свои рекламные стратегии для достижения лучших результатов.
П.С. В статье детально не раскрыта тема того как собираются и загружаются данные в БД, про это планирую рассказать позднее если тема будет актуальна.
Спасибо что дочитали, желаю успешного внедрения =)