Ответы пользователя по тегу TeleBot
  • Как организовать сравнение даты в переменной с форматом эталона?

    Vindicar
    @Vindicar
    RTFM!
    Документацию читать пробовал?
    ValueError is raised if the date_string and format can’t be parsed by time.strptime() or if it returns a value which isn’t a time tuple

    Если входная строка или строка формата не поддаются разбору вызовом time.strptime(), или если эта функция возвращает не кортеж с описанием даты-времени, функция выбрасывает исключение ValueError.

    Учись обрабатывать исключения блоком try-except.
    Впрочем, если судить вот по этому:
    if res == True:
        ...
    elif res == False:
        ...

    Стоит вообще поучить язык, а потом уже браться за ботов. Это технически сработает, но выдаёт непонимание того, как работают логические переменные.
    Правильнее будет
    if res:
        ...
    else:
        ...


    Также задачу соответствия текста шаблону часто удобнее решать регулярными выражениями. Например:
    import datetime
    import re
    # цифра, за ней может быть ещё одна, за ними "-", "/" или ".", 
    # потом опять цифра, за ней может быть ещё одна, за ними "-", "/" или ".", 
    # потом 2 или 4 цифры
    regexp = re.compile(r'(\d\d?)[-/.](\d\d?)[-/.](\d{2}|\d{4})')
    text = input('Введите дату в формате DD/MM/YYYY: ')
    match = regexp.search(text)
    if match is None:
        print('Вы ввели не дату, или ввели её в неправильном формате')
    else:
        day, month, year = int(regexp.group(1)), int(regexp.group(2)), int(regexp.group(3))
        # тут нужна ещё проверка, так как пользователь может ввести 99/99/9999
        try:
            userdate = datetime.date(year, month, day)
        except ValueError:
            print('Это некорректная дата.')
        else:
            print('Дата корректна.')
    Ответ написан
  • Как записать Input в TelegramBotApi?

    Vindicar
    @Vindicar
    RTFM!
    А теперь еще раз и по-человечески.
    Ты хочешь, чтобы сообщения пользователя интерпретировались по-разному, в зависимости от того, на каком шаге сценария он находится?
    Тебе нужны finite state machine (FSM). Не уверен, что PyTelegramBotAPI их умеет - смотри документацию на него.
    Ответ написан
  • Почему все говорят что писать ботов это сложно?

    Vindicar
    @Vindicar
    RTFM!
    А сложность начинается, как только задачи, стоящие перед ботом, перерастают уровень примера в документации видеотуториале пятилетней давности.

    Нужно сделать несколько под-команд у команды. Напишу цепочку if-elif-else, делов то. Ой, а теперь простыня кода на пять экранов, в которой фиг чего найдёшь. Потому что нет привычки структурировать код.

    Нужно, чтобы несколько команд/событий формировали цепочку (сценарий). Например, пользователь отправил тре сообщения, первое с именем, второе с возрастом, третье с адресом. Ой, а как это сделать вообще? Не зная понятия "конечный автомат" (finite state machine, FSM), очень трудно догадаться, как тут поступить.

    Нужно, чтобы ботом могли пользоваться несколько человек. Ой, их данные перепутались! Потому что бот использует глобальные переменные.

    Нужно, чтобы бот выполнил длительную задачу, и написал сообщение, когда она выполнится. Не вопрос, напишу функцию, вызову её, а сразу после отправлю сообщение. Ой, а бот не отвечает! Потому что рабочий цикл asyncio занят этой длительной операцией и не может отреагировать на поступающие данные. Нужно иметь хорошее представление о том, как работает асинхронная программа.

    Нужно добавить боту графический интерфейс - админку. Ой, а работает или интерфейс, или сам бот! Потому что нужно представлять, как устроено большинство GUI-фреймворков, и как устроена асинхронное приложение. А заодно понимать многопоточность, вопросы синхронизации действий между двумя потоками, и особенности работы с asyncio в многопоточных приложениях. Потому что одним потоком тут обойтись будет очень непросто.

    Нужно хранить данные в БД. Ой, а почему у меня проблемы при записи в БД имени пользователя? А потому что погромист собирает SQL-запрос через форматирование строк. Надо было почитать доки, чтобы наткнуться на prepared statements, они же parameterized queries.

    Нужно хранить данные в БД. Вот только данные имеют связи многие-ко-многим. Я знаю! Я буду просто добавлять или удалять столбцы в таблицу! Потому что не освоены даже азы проектирования БД. Тут уже nuff said. И да, я такое видел на этом сайте.

    Незнание средств языка и основных приемов построения алгоритмов и структур данных приводит к диким велосипедам, которые создают больше проблем, чем пользы. Особенно если к этому добавляется нежелание находить и читать документацию на фреймворк, на котором построен бот.
    Ответ написан
    2 комментария
  • Жалуется .format(message.from_user) как пофиксить?

    Vindicar
    @Vindicar
    RTFM!
    BALANCE}", .format

    Зачем тут запятая.
    Ответ написан
    4 комментария
  • Почему после нажатия inline кнопки бот не запускает ее обработчик?

    Vindicar
    @Vindicar
    RTFM!
    lambda call: 'season'
    Это работает не так. Читай документацию.
    Лямбда должна вернуть истинное булево значение, если обработчик может обработать этот запрос, и ложное - если нет.
    Внезапно, любая непустая строка интерпретируется как истина. А значит, первый обработчик получает все запросы.
    Сравнивай call.data с искомой строкой.
    Ответ написан
    3 комментария