D2
Администратор
- Регистрация
- 19 Фев 2025
- Сообщения
- 4,380
- Реакции
- 0
Всем привет, очень полезный бот для работы с API yandex.ru
По запросу GURON_18 выкладываю в паблик. Может кому и пригодится, актуальность 2021-22 год.
Писал бота для создания тикетов на сервисе Яндекс.Трекера (техподдержка) из ТГ. Выкладываю исходники без БД, потом допишу с БД (для того чтобы сохранялось ID пользователя при первом запросе). Можно использовать для отправки JSON запросов по идее хоть куда. API примерно все одинаково строятся. (Если что-то не будет работать, пишите)
Начинаем:
Python: Скопировать в буфер обмена
Config.py:
Python: Скопировать в буфер обмена
По запросу GURON_18 выкладываю в паблик. Может кому и пригодится, актуальность 2021-22 год.
Писал бота для создания тикетов на сервисе Яндекс.Трекера (техподдержка) из ТГ. Выкладываю исходники без БД, потом допишу с БД (для того чтобы сохранялось ID пользователя при первом запросе). Можно использовать для отправки JSON запросов по идее хоть куда. API примерно все одинаково строятся. (Если что-то не будет работать, пишите)
Начинаем:
- pip install aiogram
- pip install yatracker
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 = '' # Вписываем логин наблюдателя задачи