Задать вопрос
  • Как убрать inline клавиатуру aiogram?

    @SashaN69
    Школота
    Можно просто удалять сообщение
    import asyncio
    from contextlib import suppress
    
    from aiogram import types
    from aiogram.utils.exceptions import (MessageToEditNotFound, MessageCantBeEdited, MessageCantBeDeleted,
                                          MessageToDeleteNotFound)
    
    async def delete_message(message: types.Message, sleep_time: int = 0):
        await asyncio.sleep(sleep_time)
        with suppress(MessageCantBeDeleted, MessageToDeleteNotFound):
            await message.delete()


    msg = await message.reply("Я удалюсь через 30 секунд")
        asyncio.create_task(delete_message(msg, 30)
    Ответ написан
    Комментировать
  • Предусмотрено ли в aiogram следущее?

    Возможно.
    aiogram просто выводит клавиатуру.
    Никто тебе не запрещает кодом создать новую клавиатуру с нужным порядком клавиш и попросить aiogram её вывести.
    Ответ написан
    Комментировать
  • Как в aiogram сделать так, что бы не повторялся текст в одной команде?

    @Sing303
    Отключи нотификацию у 2го сообщения
    await message.answer("Подменю Кнопки", reply_markup=inlinebuttons, disable_notification=True)
    Ответ написан
    1 комментарий
  • Что я делаю не так при импорте в aiogram?

    aleksashka
    @aleksashka
    Согласен в Борисом - нужно подтянуть Python, в частности импорты, использование модулей. Но и с ТС согласен - если делать что-то практическое, то мотивашка получше будет :).

    Попробуйте посмотреть это видео (да и весь плейлист будет полезен): Telegram бот на python aiogram #4 хендлеры по файл..., там как раз описывается процесс разбивки кода на файлы, если не поможет, то можно и оставить всё в одном файле, но рано или поздно придётся всё-таки разобраться с импортами и прочим.
    Ответ написан
    1 комментарий
  • Существует ли классический стандарт структуризации телеграм ботов по файлам?

    phaggi
    @phaggi
    лужу, паяю, ЭВМы починяю
    Стандарта нет. Но в зависимости от структуры самого бота возможны осмысленные варианты. Можно посмотреть пример как реализовано разделение для программы тестирования веб-страницы.
    Там есть основной модуль, а к нему модуль классов страниц, а к нему модуль классов элементов страниц и модуль классов соответствующих локаторов.
    Классы страниц подтягивают классы элементов с соответствующими локаторами, а страницы управляются с главного класса на главном модуле.

    Вот вам один подход. Конечно, он напрямую на вашу схему не ляжет, но можно в этом направлении двигаться. Классы пользователей, классы услуг, классы каких-нибудь там еще сущностей.

    А можно как в фреймворках типа Django - модуль установки и настройки проекта, папка проекта, в ней - модуль шаблонов, модуль логики, модуль взаимодействия с БД, модуль администрирования, модуль взаимодействия с сервисом, для которого бот, подпапка со статикой, подпапка с конфигами…
    Ответ написан
    2 комментария
  • Существует ли классический стандарт структуризации телеграм ботов по файлам?

    TalismanChet
    @TalismanChet
    Лицо зла
    нету такого стандарта, делай как тебе удобно
    Ответ написан
    Комментировать
  • Можна ли в aiogram реализовать следующую функцию?

    @Tim-developer
    Извиняюсь, что так долго. Пишите, ecли будут вопросы

    from aiogram import Dispatcher, Bot, executor
    from aiogram.types import *
    
    
    bot = Bot("TOKEN")
    dp = Dispatcher(bot)
    
    
    @dp.message_handler(text="Кнопка1")
    async def main(message: Message):
        keyboard = InlineKeyboardMarkup(row_width=1)
        btn1 = InlineKeyboardButton(text="Инлайн кнопка1", callback_data="btn1")
        btn2 = InlineKeyboardButton(text="Инлайн кнопка2", callback_data="btn2")
        btn3 = InlineKeyboardButton(text="Инлайн кнопка3", callback_data="btn3")
        keyboard.add(btn1, btn2, btn3)
        await message.answer("Инлайновые кнопки Кнопки1", reply_markup=keyboard)
    
    
    @dp.callback_query_handler(text="btn1")
    async def btn1(call: CallbackQuery):
        photo = open("img.png", "rb")
        msg = await call.message.answer_photo(photo=photo, caption="Прикреплённый к фото текст кнопки 1")
        keyboard = call.message.reply_markup
        btn1 = InlineKeyboardButton(text="Инлайн кнопка1 (Свернуть)", callback_data=f"{msg.message_id}_btn1")
        keyboard["inline_keyboard"][0][0] = btn1
        await call.message.edit_reply_markup(keyboard)
    
    
    @dp.callback_query_handler(text="btn2")
    async def btn2(call: CallbackQuery):
        photo = open("img.png", "rb")
        msg = await call.message.answer_photo(photo=photo, caption="Прикреплённый к фото текст кнопки 2")
        keyboard = call.message.reply_markup
        btn2 = InlineKeyboardButton(text="Инлайн кнопка2 (Свернуть)", callback_data=f"{msg.message_id}_btn2")
        keyboard["inline_keyboard"][1][0] = btn2
        await call.message.edit_reply_markup(keyboard)
    
    
    @dp.callback_query_handler(text="btn3")
    async def btn3(call: CallbackQuery):
        photo = open("img.png", "rb")
        msg = await call.message.answer_photo(photo=photo, caption="Прикреплённый к фото текст кнопки 3")
        keyboard = call.message.reply_markup
        btn3 = InlineKeyboardButton(text="Инлайн кнопка2 (Свернуть)", callback_data=f"{msg.message_id}_btn3")
        keyboard["inline_keyboard"][2][0] = btn3
        await call.message.edit_reply_markup(keyboard)
    
    
    @dp.callback_query_handler(regexp=r"[\d]+_btn1")
    async def btn1_pthotodel(call: CallbackQuery):
        await bot.delete_message(call.message.chat.id, int(call.data.split("_")[0]))
        keyboard = call.message.reply_markup
        btn1 = InlineKeyboardButton(text="Инлайн кнопка1", callback_data="btn1")
        keyboard["inline_keyboard"][0][0] = btn1
        await call.message.edit_reply_markup(keyboard)
    
    
    @dp.callback_query_handler(regexp=r"[\d]+_btn2")
    async def btn1_pthotodel(call: CallbackQuery):
        await bot.delete_message(call.message.chat.id, int(call.data.split("_")[0]))
        keyboard = call.message.reply_markup
        btn2 = InlineKeyboardButton(text="Инлайн кнопка2", callback_data="btn2")
        keyboard["inline_keyboard"][1][0] = btn2
        await call.message.edit_reply_markup(keyboard)
    
    
    @dp.callback_query_handler(regexp=r"[\d]+_btn3")
    async def btn1_pthotodel(call: CallbackQuery):
        await bot.delete_message(call.message.chat.id, int(call.data.split("_")[0]))
        keyboard = call.message.reply_markup
        btn3 = InlineKeyboardButton(text="Инлайн кнопка3", callback_data="btn3")
        keyboard["inline_keyboard"][2][0] = btn3
        await call.message.edit_reply_markup(keyboard)
    
    
    executor.start_polling(dp)
    Ответ написан
    3 комментария
  • Не получается создать кнопку назад и скрыть другие кнопки?

    1-Чтобы удалить клавиатуру, воспользуйтесь методом telebot.types.ReplyKeyboardRemove

    2-Чтобы вернуться в главное меню нужно отправлять сообщение, к примеру, с сообщением «Главное меню» и нужной вам клавиатурой
    Ответ написан
    Комментировать
  • Как правильно соединить в один код 2 файла python?

    Iscrenniy
    @Iscrenniy
    Прошёл регистрацию для ответа :)

    В main.py используй import <Название второго файла>
    Потом в main.py, при надобности пишешь "secondfile.get_text_messages(message)"
    Это будет перенаправлять сообщение в функцию второго файла.

    Спойлер: В интернете есть об этом информация, иначе - не знал бы никто.
    Ответ написан
    2 комментария
  • Как соединить 2 python файла в один код?

    Vindicar
    @Vindicar
    RTFM!
    У тебя будет проблема в том, что во второй файл надо будет передать объект bot, которого, скорее всего, не будет на момент импорта этого файла.
    Есть не слишком изящный, но простой способ.
    # imported_file.py
    import telebot
    from telebot import types
    
    def setup(bot):  # setup() принимает бота и прочее как параметры.
        # да, прописываем обработчики прямо внутри setup()
        # но вот глобальные переменные здесь прописывать не стоит
        @bot.message_handler(content_types=['text'])
        def get_text_messages(message):
            ...
    
    # main_file.py
    import telebot
    from telebot import types
    import time
    
    import imported_file
    
    bot = telebot.TeleBot("ТОКЕН")
    # убедись, что setup() вызывается строго один раз для каждого дополнительного файла!
    imported_file.setup(bot)  
    ...  # дальше работаем как обычно


    Этот вариант позволяет загрузить файл уже в ходе работы бота, но не предусматривает возможности выгрузить файл на ходу. Впрочем, не все библиотеки позволяют отвязать обработчик от события, так что это не только проблема этого подхода.
    Ответ написан
    1 комментарий
  • Как соединить 2 python файла в один код?

    @wincrx
    Вначале file1 пишешь:
    import file2
    Тогда в файле 1 для вызова функции из файла 2 нужно будет писать (например) file2.get_text_messages

    Но лучше вместо "import file2" писать:
    from file2 import get_text_messages (или любые другие функции)
    Тогда для вызова этой функции в 1 файле нужно будет просто написать get_text_messages (без file2. в начале)
    Ответ написан
    2 комментария