Пишу телеграм бота на aiogram, в функции callback_error, при каждом ответе на callback_data, надо чтобы бот отсылал сообщение пользователя мне в чат

Рейтинг: 0Ответов: 1Опубликовано: 12.03.2023
from aiogram import Bot, Dispatcher, executor, types
import os
from aiogram.dispatcher.filters.state import StatesGroup, State
from aiogram.utils import callback_data
from auth_data import token, support_id
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup, User

bot = Bot(token, parse_mode=types.ParseMode.HTML)
dp = Dispatcher(bot)

ikb = InlineKeyboardMarkup(row_width=2)
ib1 = InlineKeyboardButton(text='Сообщить о проблеме', callback_data="Error")
ib2 = InlineKeyboardButton(text='Предложить свою идею', callback_data="Idea")
ikb.add(ib1).add(ib2)

@dp.message_handler(commands='start')
async def start(message: types.Message):
    start_buttons = ['Отслеживание скидок', 'Обратная связь', 'Список команд']
    keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
    keyboard.add(*start_buttons)
    await bot.send_message(message.from_user.id, f'Привет, спасибо за использование нашего бота! Его работа заключается в том, что он отслеживает скидочные цены на платформе Steam и отсылает уведомления пользователям, если на интересующие их игры действует скидка. Если вы найдете ошибки при пользовании или вам на ум придет интересная идея для воплощения в этом боте, то используйте обратную свзяь, чтобы помочь дальнешей разработке бота. Спасибо, что выбираете именно нас, приятного пользования!', reply_markup=keyboard)

@dp.message_handler(lambda message: message.text == "Список команд")
@dp.message_handler(commands='help')
async def get_help(message: types.Message):
    await bot.send_message(message.from_user.id,
        "Вот список всех команд:\n"
        "/start - начало работы\n"
        "/help - список команд\n"
        "/feedback - обратная связь\n"
        "/list - список отслеживаемых игр\n"
    )

@dp.message_handler(lambda message: message.text == "Обратная связь")
@dp.message_handler(commands='feedback')
async def feedback(message: types.Message):
    await bot.send_message(message.from_user.id, text='Выберите о чем вы хотите написать', reply_markup=ikb)

@dp.message_handler(lambda message: message.text == "Отслеживание скидок")
@dp.message_handler(commands='list')
async def feedback(message: types.Message):
    await bot.send_message(message.from_user.id, text='Пока не работает, ждите😡😡😡')

@dp.callback_query_handler()
async def callback_error(callback: types.CallbackQuery):
    if callback.data == "Error":
        await bot.delete_message(callback.from_user.id, callback.message.message_id)
        await bot.send_message(callback.from_user.id, text="Опишите пожалуйста проблему как можно подробнее, чтобы мы решили ее как можно быстрее!")

    elif callback.data == "Idea":
        await bot.delete_message(callback.from_user.id, callback.message.message_id)
        await bot.send_message(callback.from_user.id, text="Мы всегда рады новым интересным предложениям, внимательно слушаем вас!)")

print("Я запустился")

def main():
    executor.start_polling(dp)

if __name__ == '__main__':
    main()

Ответы

▲ 1Принят

Сделать это можно с помощью FSM (Finite State Machine).

Для начала импортируем необходимые компоненты для работы:

from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import State, StatesGroup

Далее, создаем класс с StatesGroup:

class UserStates(StatesGroup):
step1 = State()

В асинхронной функции callback_error нужно "сэтнуть" состояние, чтобы бот в него вошел:

@dp.callback_query_handler()
async def callback_error(callback: types.CallbackQuery):
    if callback.data == "Error":
        await bot.delete_message(callback.from_user.id, callback.message.message_id)
        await bot.send_message(callback.from_user.id, text="Опишите пожалуйста проблему как можно подробнее, чтобы мы решили ее как можно быстрее!")
        await UserStates.step1.set()

Далее, создаем обработчик этого состояния:

@dp.message_handler(state=UserStates.step1)
async def func_admin(msg: types.Message, state: FSMContext):
    text = msg.text
    await msg.answer('Заявка была отправлена!')
    await bot.send_message(admin_id, f'Пришла новая заявка!\n\nОтправитель 
@{message.from_user.username}\nТекст:{text}')
    await state.finish()