Задать вопрос
Ответы пользователя по тегу Telegram
  • Как циклически просматривать записи из БД в телеграм боте?

    Vindicar
    @Vindicar
    RTFM!
    Храни для каждого пользователя id/номер записи, на которой он остановился.
    Есть несколько corner-case'ов, например, добавление новой записи после того как просмотр начался... но в целом не должно быть очень сложно.
    Ответ написан
    Комментировать
  • Как сделать завершение команды?

    Vindicar
    @Vindicar
    RTFM!
    > message.from_user.id != [905259209, -1001486872541]:
    Выучи основы питона сначала, а? Потом уже возьмёшься за ботописание.

    Проверка вхождения значения в коллекцию выполняется оператором in. Для проверки не-вхождения есть оператор not in.
    message.from_user.id not in [905259209, -1001486872541]:
    Ответ написан
    8 комментариев
  • Куда отправляется информация из телеграмм ботов?

    Vindicar
    @Vindicar
    RTFM!
    Заведи приватный телеграм канал, куда имеют доступ только менеджеры, пусть бот постит туда.

    Либо можно сделать простой сайт только для внутреннего пользования, на том же Flask или DJango, и связать с ботом через общую БД.
    Ответ написан
    1 комментарий
  • Как сделать, чтобы бот ждал сообщение от пользователя который отправил команду?

    Vindicar
    @Vindicar
    RTFM!
    Ну очевидно, бот должен запоминать, какие пользователи ввели команду, и если сообщение не от одного из них - то игнорировать это сообщение и ждать снова.

    С другой стороны, подумай - может, можно вообще уйти от этой системы со 100500 сообщений, и обойтись параметрами команды?
    Ответ написан
    Комментировать
  • Как осуществить шифр цезаря в Telegram боте?

    Vindicar
    @Vindicar
    RTFM!
    Причем тут вообще input()? Эта функция занимается только вводом из консоли.
    То же самое с print(), это исключительно консольный вывод.

    Простейший способ, если бот имеет только это назначение и никакого другого - не париться с командами, а просто на каждое входящее сообщение отвечать шифрованным. Это будет модификация простого эхо-бота, которого ты взял за основу. Тебе же передаётся параметр message в обработчике, разбирайся с ним.

    Иначе нужно будет разобрать входящее сообщение (оторвать от начала команду), и шифровать его.
    Ответ написан
  • Как заставить бота отправлять сообщение раз в 30 секунд, Python Aiogram?

    Vindicar
    @Vindicar
    RTFM!
    Ну во-первых, зачем тебе 2 main-блока?
    При этом обрати внимание, что первый main-блок не закончит работу, пока не закончит работу твоя корутина helloworld(), так как ты используешь метод run_until_complete(). А твоя корутина никогда не закончит работу.
    Используй loop.create_task(), чтобы запланировать выполнение корутины "в свободное время" работы системы и продолжить работу.
    if __name__ == '__main__':
      loop.create_task(helloworld())
      executor.start_polling(dp, skip_updates=True)


    Во-вторых, длительные синхронные операции в корутине блокируют её работу, и работу остальных корутин. Это основы асинхронного прогарммирования, блин!
    Поэтому твой time.sleep() вешает всего бота. Используй await asyncio.sleep(), она отдаст управление другим корутинам бота на время сна текущей корутины.
    Ответ написан
    Комментировать
  • Рандом телеграм бот генерирует результат, а потом ленится и выдает повтор, как исправить?

    Vindicar
    @Vindicar
    RTFM!
    random_team0 = random.choice(man) + ' из ' + random.choice(place)
    random_team1 = random.choice(prilag) + ' ' + random.choice(such)
    team_name = [random.choice(team), random_team0, random_team1]

    Этот код выполняется один раз при запуске бота, а не каждый раз при выполнении team(). Внеси его внутрь подпрограммы team().
    Ответ написан
    Комментировать
  • Как сделать проверку ссылки в телеграм боте?

    Vindicar
    @Vindicar
    RTFM!
    Если вы не знаете, как искать наличие подстроки в строке (либо через оператор in, либо через метод index()), или как пользоваться регулярными выражениями, то вам рано браться за ботов. Начните с упражнений попроще, потом вернётесь к теме.

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

    Vindicar
    @Vindicar
    RTFM!
    Включить голову. Твой код, по сути, делает ровно то, что ты от него просишь:
    1. Если сообщение в личку, то в зависимости от слова, скинуть ту или иную фотку. Если не одно слово не подошло, то ничего не делать.
    2. Если сообщение не в личку, ответить, что на групповые сообщения не отвечает.

    Т.е. он всегда будет реагировать на не-личные сообщения по else. Не нравится? Убери этот else вместе со всем содержимым.
    Ну и да, основные алгоритмические конструкции.
    Ответ написан
    Комментировать
  • Aiogram - как отправить аудио файл gTTS без сохранения на диск?

    Vindicar
    @Vindicar
    RTFM!
    Ты спрашиваешь как сохранить выхлоп gTTS в объект BytesIO, или как отправить содержимое BytesIO через телегу?
    Потому что если первое, это есть в документации на gTTS.
    Ответ написан
    1 комментарий
  • При запуске бота выдает ошибку AttributeError: 'NoneType' object has no attribute 'create_task' как исправить?

    Vindicar
    @Vindicar
    RTFM!
    dp.loop.create_task(get_channels())
    На момент этого вызов диспетчер еще не начал работу, поэтому его рабочий цикл (loop) отсутствует. Я полагаю, create_task() нужно вызывать внутри какого-либо обработчика события, тогда можно быть уверенным, что рабочий цикл уже запущен.
    Если API aiogram имеет событие, срабатывающее при подключении к сети, обработчик этого события будет подходящим местом.
    Ответ написан
  • Как сделать чтобы сообщение Telegram обновлялось пока выполняется другой скрипт?

    Vindicar
    @Vindicar
    RTFM!
    Да, как ни странно, пока выполняется одна часть кода - другая не выполняется. Исключения из этого правила три:
    1. Многопоточность. Каждый поток выполнения может выполнять код независимо от другого. ОС сама заставит их чередоваться, от кода почти ничего не требуется делать. Можно просто взять существующий однопоточный код, и выполнить его в другом потоке. Но проблема в том, что тогда два потока могут помешать друг другу при попытке обратиться к одним и тем же данным ("состояние гонки"). Избежать этого не совсем тривиально.
    2. Многопроцессность. Почти то же самое, что и многопоточность. Имеет кое-какие плюшки, но куда сложнее в использовании.
    3. Асинхронность. В этом случае одна часть кода может приостановить своё выполнение, "уступив место" другой ненадолго. Так как выполнение строго поочерёдное, то состояния гонки не будет. Но с другой стороны, обе части кода должны уметь кооперироваться друг с другом с самого начала. Это потребует полной переработки кода, так как нельзя просто "взять и прикрутить" асинхронность к существующему коду. С другой стороны, боты часто пишутся с использованием асинхронного кода, так что может потребоваться только переработать твой "рабочий" скрипт.

    В общем, выбор между хреном и редькой. Не зная, как реализован бот, и что делает рабочий скрипт, подсказать что-то сложно.
    Ответ написан
    4 комментария
  • Как сделать достижения в асинхронном боте телеграм(aiogram)?

    Vindicar
    @Vindicar
    RTFM!
    Грубо говоря, для асинхронной программы верно одно утверждение: "пока ты выполняешь код, не являющийся await вызовом, остальная программа простаивает".
    Каждый await вызов (а также его завершение) - это повод переключиться на другую задачу.
    Таким образом, бесконечный цикл - это просто:
    while True:
      await asyncio.sleep(5) #пока текущая корутина спит, остальной бот работает
      do_stuff() #пока do_stuff() работает, остальной бот спит

    Вопрос в другом: нужен ли бесконечный цикл?
    Я бы посоветовал начать с создания системы сбора статистики.
    Например, завести таблицу вида id юзера - имя статы - значение статы.
    Скажем "id - число_сообщений - 100500". И в обработчиках соответствующих событий делать UPDATE на эту таблицу. А потом в отдельном модуле периодически проверять статы пользователей, проверять, есть ли у них уже ачивка за эту стату, и если нет - то давать.
    Ответ написан
  • Может ли телеграм бот читать exel файл который я ему отправил?

    Vindicar
    @Vindicar
    RTFM!
    Да, можно, если речь идет о Excel (а не exel).
    Зависит от формата файла. Новый .xlsx читается довольно легко, есть библиотеки для этого,но можно и средствами стандартной библиотеки Python - это просто zip-архив с пачкой xml-файлов внутри. Выковырять данные будет не очень трудно.

    А вот старый .xls - это бинарный, плохо документированный формат. С ним будут проблемы.
    Ответ написан
    Комментировать
  • Как написать функцию чистки пользователей, которые заблокировали бота в Телеграм?

    Vindicar
    @Vindicar
    RTFM!
    Перенеси try-except внутрь цикла for, чтобы внутри try-except был только вызов bot.send_message(), и все дела.
    И зачем ты еще раз коннектишься к базе данных внутри except, у тебя ведь уже есть подключение?
    Ответ написан
    Комментировать
  • Как реализовать запись данных пользователя в телеграм-боте на Python?

    Vindicar
    @Vindicar
    RTFM!
    Если тебе нужно реализовать сценарий, в рамках которого пользователь отправляет несколько сообщений, разбирайся с register_next_step_handler()
    Ответ написан
    Комментировать
  • Telegram bot, не работает постоянно и выключается после запуска со словами:"process finished with exit code 0", как пофиксить?

    Vindicar
    @Vindicar
    RTFM!
    Я что-то не пойму. Документация и примеры по aiogram говорят, что бота надо выполнять вызовом executor.start_polling(), а у тебя что?
    Ответ написан
    Комментировать
  • Можно ли сделать бесконечно работающего бота телеграм?

    Vindicar
    @Vindicar
    RTFM!
    1. Как именно не работает? Приводи минимальный проблемный пример кода и полный текст ошибки (+ traceback).
    2, 3. Зависит от используемой библиотеки для общения с телеграммом. Не зная, какую ты используешь, подсказать трудно - но наверняка можно нагуглить документацию и/или примеры использования.
    Ответ написан
  • Как мне сообщить пользователю в телеграмм боте, что он должен нажать на кнопки?

    Vindicar
    @Vindicar
    RTFM!
    > if message.text == 'Технология(Мальчики)':
    Имел ввиду elif? У тебя вообще довольно много elif пропущено.

    Вообще я бы посоветовал использовать словарь.
    #код неполный! вставишь эти фрагменты в свой самостоятельно
    #все задания описаны тут
    tasks = {
      'Математика': 'Параграф 4 учить РТ 3',
      #ну и так далее.
    }
    #делаем кнопки
    buttons = [types.KeyboardButton(name) for name in tasks] #по кнопке на каждое задание
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    markup.add(*buttons) #добавить все элементы списка buttons, как если бы мы написали их по одному
    
    #Проверка полученной кнопки
    if message.chat.type == 'private':
        task = tasks.get(message.text, None) #ищем текст, соответствующий кнопке
        if task is None: #не нашли
            bot.send_message(message.chat.id, 'Пожалуйста, нажми на кнопки')
        else:
            bot.send_message(message.chat.id, task)

    И никакой лестницы if-elif
    Ответ написан
    Комментировать
  • Ошибка sqlite3.IntegrityError: UNIQUE constraint failed: users.user_id, что делать?

    Vindicar
    @Vindicar
    RTFM!
    message.from_user.id in cursor.execute('SELECT user_id FROM users')
    На кой нужно делать выборку всех пользователей, чтобы потом питоном искать в ней данные? Используй ключевое слово WHERE, и используй prepared statement для подстановки значения из переменной, а не форматирование строк.

    f'UPDATE users SET user_id = {message.from_user.id} WHERE user_id = {message.from_user.id}'
    "Если id = 1, то сделай id равным 1". На кой?!
    И да, не используй форматирование строк для формирования строки запроса. Используй prepared statements.

    Например так:
    ids = cursor.execute('SELECT user_id FROM users WHERE user_id = ?', (message.from_user.id,))


    > не понимаю в чем проблема
    В недостатке знаний по основам SQL, и в попытке писать ботов, не разобравшись в основах.
    Ответ написан
    2 комментария