Ответы пользователя по тегу AIOgram
  • Почему выходит ошибка Bad Request: message text is empty, хотя сообщение не пустое!?

    Vindicar
    @Vindicar
    RTFM!
    File "C:\Users\user\Desktop\.py Black list aio\handlers\add_guest.py", line 45, in get_iin
        await message.answer('')  # <--- вот тут
    Ответ написан
    Комментировать
  • Почему появляется ошибка «Процесс не может получить доступ к файлу»?

    Vindicar
    @Vindicar
    RTFM!
    with open(filename, 'rb') as file:
        media = MediaFileUpload(
            filename, chunksize=1024 * 1024,
            mimetype=message.document.mime_type, resumable=True)
        request = service.files().create(
            body=metadata, media_body=media)
        file.close()

    Обрати внимание, что MediaFileUpload не использует объект file.
    Поэтому абсолютно не принципиально, как и когда ты закрываешь файловый объект самостоятельно.
    Либо поищи способ отправить файл, используя уже заданный объект, либо читай как корректно закрыть MediaFileUpload. Можешь попробовать media.stream.close(), но я фз можно ли это делать, и если да то когда.
    Ответ написан
    Комментировать
  • Как создать connection_pool асинхронно, но в отдельном модуле, чтобы затем использовать его в dp.message_handler для работы с БД асинхронно?

    Vindicar
    @Vindicar
    RTFM!
    Так не получится, потому что кто кого импортировать будет? Поймаешь циклический импорт.
    Можно проще.
    # handlers.py
    def setup(dp, pool):
        # внутри setup уже объявляешь обработчики
        @dp.message_handler(content_types=['text'])
        def some_handler(message: types.message):
            ...
    
    # main.py
    connection_pool = await create_asyncpg_connection_pool()
    dp = ...
    
    import handlers
    handlers.setup(dp, connection_pool)  # вызывать строго один раз!
    Ответ написан
  • Почему aiogram не выводит фото?

    Vindicar
    @Vindicar
    RTFM!
    В параметр photo клади экземпляр класса InputFile, содержащий путь к желаемому файлу.
    photo=aiogram.types.input_file.InputFile('lesmat/lit1.png')
    Ответ написан
    Комментировать
  • Как автоматизировать подключение роутов?

    Vindicar
    @Vindicar
    RTFM!
    Можно сделать что-то в таком духе. Не супернадёжно, но сработает, пожалуй.
    from pathlib import Path
    import importlib
    import sys
    
    SCRIPT = Path(sys.argv[0]).parent.resolve()
    IMPORT_FROM = 'webhooks'
    for fpath in (SCRIPT / IMPORT_FROM).iterdir():
        # импортим .py файлы и подкаталоги c __init__.py внутри
        # игнорим __init__.py и подобное, а также файлы, начинающиеся с .
        if not fpath.stem.startswith('_') and not fpath.stem.startswith('.') and \
                ((fpath.suffix == '.py') or (fpath.is_dir() and (fpath / '__init__.py').is_file())):  
            try:
                # эквивалент import webhooks.имяфайла as module
                module = importlib.import_module(f'{IMPORT_FROM}.{fpath.stem}')
                dp.include_router(module.router)
            except Exception as err:
                print(err)  # журналируй ошибку
    Ответ написан
  • Проверка сообщений пользователей Aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Код не имеет смысла.
    @dp.message_handler(text=['Найти группу'])
    async def group(message):

    Вы просите бота вызвать функцию group(), если он получит сообщение с текстом 'Найти группу' (точное совпадение).
    Поэтому message.text в рамках этого обработчика будет равен именно 'Найти группу' и более ничему - ни '6', ни '7'.
    Ответ написан
    Комментировать
  • Как отправить несколько сообщений через один хэндлер в Telegram боте?

    Vindicar
    @Vindicar
    RTFM!
    Ну так сначала сформируй желаемый текст в переменной, а потом уже редактируй сообщение.
    Метод str.join() в помощь.
    Ответ написан
    Комментировать
  • У бота такая ошибка, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Почему ты вообще запускапешь файл .yml? Это же файл конфигурации в YAML формате, а не код на питоне.
    Ответ написан
    3 комментария
  • Как получить и обработать событие с помощью Observer и встроить эту функцию в поток?

    Vindicar
    @Vindicar
    RTFM!
    Документация советует run_coroutine_threadsafe(). Эта функция позволяет запланировать вызов корутины с параметрами (читай, эквивалент await вызова) в рамках рабочего цикла (loop) asyncio, который крутится в другом потоке. С полученным future можно что-то сделать, например, подождать, пока оно реализуется. Пример по ссылке.
    Ответ написан
    Комментировать
  • Как реализовать перенос строки MarkdownV2?

    Vindicar
    @Vindicar
    RTFM!
    https://www.markdownguide.org/basic-syntax/#line-breaks
    To create a line break or new line (<br>), end a line with two or more spaces, and then type return.

    Попробуй два пробела перед переносом строки, т.е. ' \n'
    Ответ написан
    Комментировать
  • Как выйти из цикла в другой функции?

    Vindicar
    @Vindicar
    RTFM!
    Никак*. Осознай, что операторы выполняются последовательно. Пока start_stop(True) не закончит выполнение, time.sleep() даже не начнёт выполняться, не говоря уже о последующем. А start_stop(True) не закончит выполнение никогда, потому что ты сделал вечный цикл.

    Также меня несколько настораживает поставленный тобой тег aiogram, потому что использование time.sleep() в асинхронных приложениях - плохая идея. Это наводит на мысль, что тебе стоит сначала понять как следует работу асинхронных приложений. Вот одиндругой) из моих старых ответов, может поможет начать.
    *

    Можно организовать несколько потоков выполнения через threading или же вести асинхронную разработку на корутинах. Смешивать эти два подхода очень не советую, так что сначала определись, который использовать.
    Ответ написан
    3 комментария
  • Как отложить выполнение функции в aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Создай через create_task() долго работающую задачу, которая будет периодически опрашивать запланированные расссылки, искать те, которые "уже пора" и запускать их на выполнение. А потом спать некоторое время до очередной проверки. Эта задача должна стартовать параллельно с ботом.
    Такой способ может вносить погрешность в точное время рассылки (условно, проверяешь раз в час - время можно задать только с точностью до часа). Но зато он гораздо менее рискован. Упрощённо, если ты сделал await asyncio.sleep(сколько_нужно), а за это время бот упал и был перезапущен, бот просто не "вспомнит" о ранее запланированных, но не выполненных рассылках.
    Ответ написан
    Комментировать
  • Как устроена бибилотека aiogram внутри а именно FSM?

    Vindicar
    @Vindicar
    RTFM!
    Ну конкретно по вопросу: можно сделать обоснованную догадку, если знаком с понятием "конечный автомат".
    Это нечто, обладающее набором состояний. В рамках состояния автомат выполняет определённую деятельность и/или ждёт определённого события.
    Автомат может переходить из состояния в состояние по внешнему сигналу. При этом правила перехода зависят от сигнала И от состояния. Иными словами, автомат может реагировать по разному на один и тот же сигнал, в зависимости от своего состояния.

    Пример: часы-будильник. У них могут быть четыре состояния:
    - будильник выключен (только часы)
    - будильник включен (ожидание времени следующего звонка)
    - звучит звонок
    - досыпание
    И три события:
    - сменилась минута
    - пользователь нажал кнопку "вкл-выкл"
    - пользователь нажал кнопку досыпания
    Схему переходов между состояниями можешь придумать сам. В частности, событие "сменилась минута" будет обрабатываться по-разному в каждом из состояний.

    Это базовое понятие. В твоём случае автомат - это StateGroup, его отдельные состояние - это State, а сигналы - события бота, привязанные к автомату. Важно понимать, что у тебя, скорее всего, будет много копий автомата - по одной на каждого пользователя.

    Далее возникает вопрос: а что если нам нужно передавать какие-то данные из состояния в состояние? Вот тут возникает понятие контекста автомата, т.е. какого-то набора данных, которые могут читаться и изменяться при его работе. Это FSMContext.

    Наконец, сугубо практический вопрос: автомат должен "помнить", в каком он состоянии, и должен хранить свой контекст. Где он будет это делать? Вот тут на помощь приходят классы Storage. В частности, MemoryStorage хранит эти данные в памяти. Ненадёжно, не переживает перезапуск бота, но работает быстро и удобно при отладке.

    Попробуй реализовать очень простого бота с автоматом состояний, не используя State, а храня состояние для пользователя самостоятельно. Например, в словаре вида userid: (состояние, контекст). И проверяй вручную состояние и контекст при обработке событий. Тогда поймёшь, что примерно происходит внутри FSM.
    Ответ написан
    2 комментария
  • Что я делаю не так с register_message_handler в aiogram?

    Vindicar
    @Vindicar
    RTFM!

    dp.register_message_handler(answer3, state=get_answer.answer3)
    db.register_message_handler(answer4, state=get_answer.answer4)

    У тебя в паре месте перепутано dp и db.
    Короткие названия они такие... коварные.
    Ответ написан
  • Ошибка sqlite3.IntegrityError: UNIQUE constraint failed: users.user_id Как исправить?

    Vindicar
    @Vindicar
    RTFM!
    Ты добавляешь уже существующего пользователя.
    Прочитай про запрос INSERT ... ON CONFLICT DO ... .
    Тут есть два варианта:
    INSERT ... ON CONFLICT DO UPDATE (он же UPSERT), чтобы обновить данные о пользователе.
    INSERT ... ON CONFLICT DO NOTHING, чтобы молча проигнорировать уже существующего пользователя.
    Ответ написан
    Комментировать
  • Нужно текст, который пользователь написал с FSM передавать определенному пользователю?

    Vindicar
    @Vindicar
    RTFM!
    1. "Нужно текст, который пользователь написал с FSM передавать определенному пользователю?"
    Нет, не нужно. На будущее: формулируй вопрос по-человечески. Туда же оформление кода - этого требуют правила ресурса.

    2. По теме: у тебя в коде есть пример отправки сообщения пользователю с известным ID.
    await bot.send_message(message.chat.id, 'Здравствуйте, какой продукт вы хотите преобрести?')

    В чём проблема сделать по аналогии?
    Ответ написан
  • Проблема с созданием телеграм бота Python aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Проблема с созданием телеграм бота Python aiogram?

    Да, проблема.

    Читай про finite state machine в aiogram.
    Ответ написан
    Комментировать
  • Как отправить sql запрос к базе данных на вывод даты регистрации пользователя?

    Vindicar
    @Vindicar
    RTFM!
    SELECT user_id, join_date EXTRACT(DAY FROM date) as day FROM users VALUES (?, ?)

    SELECT запросы c условием пишутся не так.
    Ответ написан
    Комментировать
  • Почему не работает выдача ссылки в боте телеграмма?

    Vindicar
    @Vindicar
    RTFM!
    aiogram.utils.exceptions.BadRequest: Can't invite members to a private chat

    Ты передаёшь в функцию ID приватного чата, а не комнаты. Проблема в этой строке.
    await bot.approve_chat_join_request(chat_id=callback_query.message.chat.id, user_id=user_id)
    Ответ написан
    Комментировать