Бот для отправки JSON запроса и создания тикета на яндекс.трекере (AIOGRAM)

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Всем привет, очень полезный бот для работы с API yandex.ru

По запросу GURON_18 выкладываю в паблик. Может кому и пригодится, актуальность 2021-22 год.

Писал бота для создания тикетов на сервисе Яндекс.Трекера (техподдержка) из ТГ. Выкладываю исходники без БД, потом допишу с БД (для того чтобы сохранялось ID пользователя при первом запросе). Можно использовать для отправки JSON запросов по идее хоть куда. API примерно все одинаково строятся. (Если что-то не будет работать, пишите)

Начинаем:
  1. pip install aiogram
  2. pip install yatracker
Support_bot_yatracker.py:
Python: Скопировать в буфер обмена
Код:
import asyncio
import logging
from aiogram import Bot, types, Dispatcher
from aiogram.dispatcher.filters import Text
from aiogram.dispatcher.filters.state import State, StatesGroup
from aiogram.utils import executor
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.contrib.middlewares.logging import LoggingMiddleware
from aiogram.dispatcher import Dispatcher, FSMContext
from aiogram.types.message import ContentType
from yatracker import YaTracker
import messages
from messages import MESSAGES
from config import BOT_TOKEN, ORG_ID, TOKEN, DEZHURNIY
from inline_buttons import inline_kb1_admin
logging.basicConfig(format=u'%(filename)+13s [ LINE:%(lineno)-4s] %(levelname)-8s [%(asctime)s] %(message)s',
                    level=logging.INFO)

tracker = YaTracker(ORG_ID, TOKEN)
nabludatel =
dezhurniy = DEZHURNIY
loop = asyncio.get_event_loop()
bot = Bot(BOT_TOKEN, parse_mode=types.ParseMode.HTML)

dp: Dispatcher = Dispatcher(bot, storage=MemoryStorage(), loop=loop)
dp.middleware.setup(LoggingMiddleware())


#Работа с Inline кнопками
@dp.message_handler(Text(equals="Связь с администратором"))
async def process_command_1(message: types.Message):
    await message.reply("Для связи с администратором нажмите на кнопку 'Написать'\nОткроется контакт администратора в телеграме", reply_markup=inline_kb1_admin)

#Массивы на проверку условий ввода с кнопок
available_org_names = ["Автошкола", "Вкусмаг", "Артград"]
available_org_bases = ["ЗУП", "Автошкола-Бух", "Итилиум"]

#Работа с кнопками (В меню)
@dp.message_handler(commands="start", state="*") #Команда /start
@dp.message_handler(Text(equals="Старт", ignore_case=True), state="*")
async def cmd_start(message: types.Message, state: FSMContext):
    await state.finish()
    keyboard = types.ReplyKeyboardMarkup(row_width=3, resize_keyboard=True)
    buttons = ["Автошкола", "Вкусмаг", "Артград"]
    keyboard.add(*buttons)
    await message.answer("Добро пожаловать!\nЯ бот техподдержки 1С\nС какой организации вы обращаетесь?", reply_markup=keyboard)

@dp.message_handler(commands="restart", state="*")
async def cmd_restart(message: types.Message, state: FSMContext):
    await state.finish()
    await message.answer("Бот перезагружен, нажмите на /start", reply_markup=types.ReplyKeyboardRemove())

# Работа со стейтами Базы данных Автошкола
class Order(StatesGroup):
    waiting_for_autoshkola_input_theme = State()
    waiting_for_autoshkola_input_description = State()
    name_user = State()
    fname_user = State()
    city_user = State()
    base_user = State()
# Функции бота
@dp.message_handler(Text(equals="Автошкола"))
async def process_zarulem_command(message: types.Message):
        await message.answer(MESSAGES['zarulem'], reply=False, reply_markup=types.ReplyKeyboardRemove())
        await Order.base_user.set()
        keyboard_base_autoschool = types.ReplyKeyboardMarkup(row_width=3, resize_keyboard=True)
        buttons = ["ЗУП", "Автошкола-Бух", "Итилиум"]
        keyboard_base_autoschool.add(*buttons)
        await message.answer("Используя клавиатуру выберите базу, с которой у Вас проблемы", reply_markup=keyboard_base_autoschool)
@dp.message_handler(state=Order.base_user)
async def process_name(message: types.Message, state: FSMContext):
        # Условие на проверку ввода данных с кнопок при выборе баз
        if message.text not in available_org_bases:
            await message.answer("Пожалуйста, выберите базу, используя клавиатуру ниже!!!")
            return
        async with state.proxy() as data:
            data['base_users'] = message.text
        await Order.next()
        await Order.waiting_for_autoshkola_input_theme.set()
        await message.answer("Пожалуйста, напишите тему обращения:", reply_markup=types.ReplyKeyboardRemove())
# Сюда приходит ответ с темой
@dp.message_handler(state=Order.waiting_for_autoshkola_input_theme)
async def process_name(message: types.Message, state: FSMContext):
        async with state.proxy() as data:
            data['autoshkola_input_theme'] = message.text
        await Order.next()
        await Order.name_user.set()
        await message.answer("Укажите Ваше имя:")
# Сюда приходит ответ с именем
@dp.message_handler(state=Order.name_user)
async def process_name(message: types.Message, state: FSMContext):
        async with state.proxy() as data:
            data['name_users'] = message.text
        await Order.next()
        await Order.fname_user.set()
        await message.answer("Укажите вашу фамилию:")
# Сюда приходит ответ с фамилией
@dp.message_handler(state=Order.fname_user)
async def process_name(message: types.Message, state: FSMContext):
        async with state.proxy() as data:
            data['fname_users'] = message.text
        await Order.next()
        await Order.city_user.set()
        await message.answer("Укажите Ваш город:")
# Сюда приходит ответ с городом
@dp.message_handler(state=Order.city_user)
async def process_name(message: types.Message, state: FSMContext):
        async with state.proxy() as data:
            data['city_users'] = message.text
        await Order.next()
        await Order.waiting_for_autoshkola_input_description.set()
        await message.answer("Подробно опишите Вашу проблему:")
# Сюда приходит описание с проблемой
@dp.message_handler(state=Order.waiting_for_autoshkola_input_description)
async def process_name(message: types.Message, state: FSMContext):
        async with state.proxy() as data:
            data['autoshkola_input_descriptions'] = message.text
        # Формирование POST запроса на создание задачи
        await tracker.create_issue(summary=data['autoshkola_input_theme'],
                                   queue={"key": "SUPP"},
                                   description=data['autoshkola_input_descriptions'] + "\nИмя пользователя: " + data['name_users'] + "\nФамилия пользователя: " + data['fname_users'] + "\nГород обращения: " + data['city_users'] + "\nБаза данных: " + data['base_users'],
                                   priority={"key": "normal"},# При
                                   followers=f"{nabludatel}",  # Идентификаторы или логины наблюдателей задачи.
                                   assignee=f"{dezhurniy}",  # Идентификаторы или логины исполнителей задачи.
                                   tags=[data['fname_users'], data['city_users']], # Массив передачи тегов
                                   components="Автошкола" # Передача компонента задачи(можно указать массивом)
                                   )
        keyboard_base_start = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True)
        buttons = ["Старт"]
        keyboard_base_start.add(*buttons)
        await message.answer("Ваша задача принята в исполнение, пожалуйста ожидайте. \n Если вам нужно отправить обращение снова, введите команду /start или нажмите на кнопку Cтарт", reply_markup=keyboard_base_start)
        await state.finish() # Сброс всех собранных данных и машины состояния



if __name__ == '__main__':
executor.start_polling(dp, loop=loop)

Config.py:
Python: Скопировать в буфер обмена
Код:
BOT_TOKEN = '' # Токен бота полученного от BotFather
ORG_ID = 1234567  # Вписываем ID организации из кабинета Яндекс.Трекера (Обязательно значение int) !!!
TOKEN = "" # Токен логина Яндекс от создателя задачи в Трекере
DEZHURNIY = ''  # Вписываем логин дежурного
NABLUDATEL = ''  # Вписываем логин наблюдателя задачи
 
Сверху Снизу