Ответы пользователя по тегу TeleBot
  • Как организовать работа нескольких пользователей с ботом (ООП telebot)?

    Vindicar
    @Vindicar
    RTFM!
    Хранилище, где значению chat.id сопоставляется значение answer.
    Простейший вариант - словарь (dict), но этот словарь не переживёт перезапуск бота.
    БД будет сложнее, но зато персистентно - что в БД попало, то там и будет при следующем запуске.
    Ответ написан
    2 комментария
  • Почему бот не отправляет сообщения?

    Vindicar
    @Vindicar
    RTFM!
    У обработчика сообщений должен быть только один параметр - message.
    Ответ написан
    Комментировать
  • Как присвоить переменной значение локальной переменной?

    Vindicar
    @Vindicar
    RTFM!
    Ты написал глупость. Вот этот код
    conn = sqlite3.connect('shop.db')
    cursor = conn.cursor()
    nazvanie_tovara = nazvanie
    cost_tovara = cost
    data = [nazvanie_tovara, cost_tovara]
    cursor.execute("INSERT INTO tovary VALUES(?, ?);", data)
    conn.commit()

    выполнится один раз, перед запуском бота, до срабатывания обработчиков.
    Что-то мне подсказывает, что ты не этого хотел.

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

    Vindicar
    @Vindicar
    RTFM!
    1. Форматируй код как положено правилами сайта, кнопкой </>. Нечитаемо же.
    2. Что значит "не работает"? Просто ничего не делает? Останавливается с сообщением об uncaught exception? Компьютер спрыгивает со стола и начинает искать Сару Коннор? Программа может не работать многими способами, приводи описание симптомов и сообщения об ошибках. Сообщения об ошибках тоже стоит обернуть кнопкой </>.
    3. Я подозреваю, что дело именно в uncaught exception. В этом случае рекомендую почитать учебник по Питону, раздел о работе с исключениями. Хотя бы вот этот. Оберни отправку сообщения в блок try-except, при возникновении ошибки можно либо просто игнорировать её, либо добавлять в список "неудавшихся".
    Дальше с этим списком уже можно будет работать, например, попытаться убрать все "неудачные" user ID из joineduser, и записать очищенный список обратно в /home/example.txt.
    Ответ написан
    2 комментария
  • IndentationError: unexpected unindent, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Почему ты открыл try, но не закрыл его блоком except или finally?
    Сначала учи язык, потом уже клепай ботов.
    Ответ написан
    Комментировать
  • Как организовать сравнение даты в переменной с форматом эталона?

    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. И да, я такое видел на этом сайте.

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

    Vindicar
    @Vindicar
    RTFM!
    BALANCE}", .format

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

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