• Как работает этот бот?

    @crystalbit
    Full Stack NodeJS PHP JS React
    Удачно попал на вопрос о своем боте)
    Конкретно это это эти функции бот апи:
    https://core.telegram.org/bots/api#keyboardbuttonr...
    https://core.telegram.org/bots/api#keyboardbuttonr...
    Ответ написан
    8 комментариев
  • С чем может быть связана ошибка "asyncio.exceptions.CancelledError"?

    Vindicar
    @Vindicar
    RTFM!
    Открой доки и почитай. CancelledError выбрасывается в корутине, когда она завёрнута в таск через create_task() и на этом таске вызван метод cancel(). Это позволяет прервать выполнение корутины через выбрасывание специального исключения. Исключение не наследуется от Exception, поэтому обычный try-except его не ловит, если только специально не указать try ... except CancelledError. Так сделано, потому что при выходе через всплывание исключения будут отрабатывать все нормальные питоновские механизмы: блоки finally, блоки with и так далее.
    Я полагаю, команда на остановку бота делает cancel() на его главной корутине, скорее всего запущенной внутри start_polling(). Это исключение всплывает в твой main(). Но поскольку main() выполняется в asyncio.run(), то исключение всплывает туда. Это исключение не имеет особого смысла вне asyncio, так что я полагаю, run() ловит это исключение и вместо него выбрасывает KeyboardInterrupt() как ближайший не-асинхронный эквивалент. Это исключение всплывает на верхний уровень и останавливает интерпретатор.

    Ты можешь ловить CancelledError в main(), чтобы спокойно завершить работу бота. Ну или ловить KeyboardInterrupt() в теле скрипта, на вызове asyncio.run().
    Ответ написан
    1 комментарий
  • Как сохранить полное форматирование текста при его копировании?

    Vindicar
    @Vindicar
    RTFM!
    Как насчёт вместо message.text посмотреть в message.text_markdown или message.text_html (доки)? Ну и соответственно указать не text, а markdown или html при вызове send_message().
    Ответ написан
    4 комментария
  • Как добавить кнопку "Назад" в telegram бота?

    MicroProger
    @MicroProger
    Работает - не трогай
    Здравствуйте.
    Я бы сделал массив, состоящий из трех элементов:
    0: Меню, в котором находится пользователь сейчас
    1: Меню, в котором находился пользователь шаг назад
    2: Меню, в котором находился пользователь два шага назад

    C каждым изменением меню, массив сдвигался вправо с изменением 0-го элемента. Например:
    menus = [menu1, menu2, menu3]
    print(menus)  # [menu1, menu2, menu3]
    def menu_select(menu):
        menus[2] = menus[1]
        menus[1] = menus[0]
        menus[0] = menu
    # смена меню на menu4
    menu_select(menu4)
    print(menus)  # [menu4, menu1, menu2]

    А при нажатии кнопок, будут меняться кнопки на соответствующие меню
    Надеюсь, этот код вам поможет
    Ответ написан
    2 комментария
  • Как получать id канала отправленного боту через KeyboardButtonRequestChat?

    @Baggrisha
    Внимательнее читай документацию
    import asyncio
    
    from aiogram import Bot, Dispatcher, F
    from aiogram.filters.callback_data import CallbackData
    from aiogram.fsm.storage.memory import MemoryStorage
    from aiogram.filters import Command, BaseFilter
    from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, CallbackQuery, ReplyKeyboardMarkup, \
        KeyboardButtonRequestChat
    from aiogram.utils.keyboard import InlineKeyboardBuilder
    from aiogram.types import (
        KeyboardButton,
        Message)
    
    
    TOKEN = ""
    
    bot = Bot(TOKEN)
    dp = Dispatcher(storage=MemoryStorage())
    
    
    @dp.message(F.text.contains("/start"))
    async def text_handler(message: Message):
        await message.answer("I'm here", reply_markup=ReplyKeyboardMarkup(keyboard=
            [
                [
                    KeyboardButton(text="test1", request_chat=KeyboardButtonRequestChat(
                        request_id=1,
                        user_is_bot=False,
                        chat_is_channel=True,
                        chat_is_forum=False
                    )),
                    KeyboardButton(text="test2", request_chat=KeyboardButtonRequestChat(
                        request_id=2,
                        user_is_bot=False,
                        chat_is_channel=False,
                        chat_is_forum=False
                    )),
                ]
            ]
        ))
    
    
    @dp.message(F.chat)
    async def handle_request_chat(msg: Message):
        chat_info = msg.chat_shared.chat_id
        await bot.send_message(msg.from_user.id, f"Вы выбрали канал с ID: {chat_info}")
    
    async def main():
        await dp.start_polling(bot)
    
    if __name__ == "__main__":
        asyncio.run(main())
    Ответ написан
    1 комментарий