Как стать автором
Обновить

Как автоматизировать контроль кабинетов Яндекс Директ с помощью Telegram бота

Делаем легкого телеграмм чат-бота который будет присылать информацию о статистике за прошедший день и остаток на балансе баланса ваших аккаунтов в Яндекс Директ.

Будет полезно тем кто ведем много проектов и хочет упростить работу за их отслеживанием.

Сначала создадим файл config.py.

# Токен нашего бота
tokenbot = '1111111111:AAAAAaaaaaAAAAAaaaaa'

# Адрес для работы с API 5
ReportsURL5 = "https://api.direct.yandex.com/json/v5/reports"
# Адрес для работы с API 4 Live
ReportsURL4 = "https://api.direct.yandex.ru/live/v4/json/"

# Список наших логинов и токенов
login_token = {'login1':'token1','login2':'token2'}
# Chat_ID людей у кого есть разрешения
chat_id = ['11111111','222222222']

В этом файле у нас хранятся переменные с токеном нашего бота, ссылки для обращения к API Яндекс Директа, словарь наших логинов : токенов и chat_id кому разрешено получать сообщения(чтобы третьи лица не могли получить нашу статистику).

Второй файл для получения из API Яндекс Директа необходимых нам данных yaDirect.py.

import config
import requests
from requests.exceptions import ConnectionError
from time import sleep
import json
import datetime

yesterday = str(datetime.date.today() - datetime.timedelta(days=1))

# Метод для корректной обработки строк в кодировке UTF-8 как в Python 3, так и в Python 2
import sys
if sys.version_info < (3,):
    def u(x):
        try:
            return x.encode("utf8")
        except UnicodeDecodeError:
            return x
else:
    def u(x):
        if type(x) == type(b''):
            return x.decode('utf8')
        else:
            return x

# Функция получения остатка баланса
def yaBalance(token, login):
    # Создание тела запроса
    body = {
        "method": "AccountManagement",
        "token": token,
        "locale": "ru",
        "param": {
            "Action": "Get"
        },
        "SelectionCriteria": {
            "Logins": [
                login
            ]
        }
    }
    body = json.dumps(body, indent=4)
    while True:
        try:
            req = requests.post(config.ReportsURL4, body)
            req.encoding = 'utf-8'
            if req.status_code == 400:
                info = ("Параметры запроса указаны неверно или достигнут лимит отчетов в очереди")
                break
            elif req.status_code == 200:
                r = req.json()
                info = [r['data']['Accounts'][0]['Login'], r['data']['Accounts'][0]['Amount'],
                        r['data']['Accounts'][0]['Currency']]
                break
            else:
                info = ("Произошла непредвиденная ошибка")
                break
        except:
            info = ("Произошла непредвиденная ошибка")
            break
    return info

# Функция получения статистики
def yaStat(token, login):
    headers = {
        "Authorization": "Bearer " + token,
        "Client-Login": login,
        "Accept-Language": "ru",
        "processingMode": "auto"
    }
    body = {
        "params": {
            "SelectionCriteria": {
                "DateFrom": yesterday,
                "DateTo": yesterday
            },
            "FieldNames": [
                "Date",
                "Impressions",
                "Clicks",
                "Cost"
            ],
            "ReportName": u(f"ACCOUNT {login}"),
            "ReportType": "ACCOUNT_PERFORMANCE_REPORT",
            "DateRangeType": "CUSTOM_DATE",
            "Format": "TSV",
            "IncludeVAT": "NO",
            "IncludeDiscount": "NO"
        }
    }
    body = json.dumps(body, indent=4)
    while True:
        try:
            req = requests.post(config.ReportsURL5, body, headers=headers)
            req.encoding = 'utf-8'
            if req.status_code == 400:
                info = ("Параметры запроса указаны неверно или достигнут лимит отчетов в очереди")
                break
            elif req.status_code == 200:
                info = format(u(req.text)).replace('Total rows: 1', ' ')
                data = info.split('"')
                body = data[2].split()
                info = (f"{data[1]}\n{body[0]} - {body[4]}\n{body[1]} - {body[5]}\n{body[2]} - {body[6]}\n{body[3]} - {int(body[7]) / 1000000}")
                break
            else:
                info = ("Произошла непредвиденная ошибка")
                break
        except:
            info = ("Произошла непредвиденная ошибка")
            break
    return info

Тут две основные функции yaBalance() для получения остатка на балансе и yaStat() для получения статистики за вчера.

Следующий файл у нас будет с самим ботом bot.py.

from config import tokenbot, login_token, chat_id
from yaDirect import yaBalance, yaStat
import logging
from aiogram import Bot, Dispatcher, executor, types
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
from aiogram.contrib.fsm_storage.memory import MemoryStorage

# Настраиваем логирование
logging.basicConfig(level=logging.INFO, format='%(asctime)s / %(levelname)s / %(message)s')

# Инициализация бота
bot = Bot(token=tokenbot)
dp = Dispatcher(bot, storage=MemoryStorage())

# Создание клавиатуры
kb_start = ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard=True).row(KeyboardButton('Получить информацию'))

# Старт
@dp.message_handler(commands=['start'])
async def mes_start(message: types.Message):
    user_id = str(message.from_user.id)
    await message.answer(f"Привет {user_id}", reply_markup=kb_start)

# Отправление информации по запросу
@dp.message_handler(regexp='(Получить информацию)')
async def GetInfo(message: types.Message):
    user_id = str(message.from_user.id)
    if user_id in chat_id:
        for item in login_token.items():
            info_balance = yaBalance(item[1], item[0])
            info_stat = yaStat(item[1], item[0])
            await message.answer(f"{info_stat}\nОстаток баланса: {info_balance[1]} {info_balance[2]}", reply_markup=kb_start)

# запускаем лонг поллинг
if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

Получаем готового бота.

При СТАРТЕ бот будет привествовать вас и говорить ваш chat_id. Сохраняйте его в список chat_id в файле config.py. После у бота будет кнопка «Получить информацию» по нажатию на неё бот будет выдавать статистику и остаток на балансе по каждому вашему кабинету.

В итоге получаем такого простого телеграмм бота который по вашему запросу присылает необходимую вам информацию.

Если есть вопросы пишите:

https://vk.me/zaharovmail

https://t.me/zaharovmail

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.