|
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
|
||||||||||||||||
Telegram Bot Бот на питоне для телеги - проблемы с обработкой команд20.11.2022, 22:24. Показов 2044. Ответов 18
Метки нет (Все метки)
поздновато может для меня учить программирование, но что не сделаешь ради хобби (хотя я чайник по вашим меркам ещё тот), решил начать знакомство с "питона" и первым проектом для себя выбрал - создание скрипта бота для телеги с возможностью обрабатывать команды, в т.ч. с параметрами (аргументами). Ну и чтоб бот часть команд воспринимал только от конкретных пользователей (своего рода админы или модераторы).
Вот команды с параметрами (аргументами) доставили проблем. Для примера решил реализовать вывод ботом случайного числа в формате по примеру:
вроде работает, но до тех пор, пока пользователь будет соблюдать формат команды. Да, я предусмотрел в обработчике команды, если юзер не введет аргументы вообще или введет, но явно не два или если диапазон неверно указан... Тут обработчик верно отрабатывает и указывает на ошибку пользователя. предлагая ему исправить. Но вот, если он введет вместо чисел - буквы и прочее, что явно не является числами, но скрипт сразу крашится, бот останавливается... и вываливается ошибка:
вот мой код:
0
|
||||||||||||||||
| 20.11.2022, 22:24 | |
|
Ответы с готовыми решениями:
18
Бот для telegram на Питоне Бот для дискорда на питоне Бот на питоне для Flash игры |
|
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
|
|
| 21.11.2022, 07:03 | |
|
А просто в try-except обернуть не подходит что ли?
2
|
|
|
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
|
||||||
| 21.11.2022, 08:22 [ТС] | ||||||
|
Lekks, кстати да, вариант, как раз испробую в деле. Подсмотрел подобное в соседней похожей теме и тут ещё от вас этот же вариант. Однозначно попробую добавить этот метод. Спасибо.
Fudthhh, то что надо! сейчас протестирую код, благодарю. Пытался на регулярном выражении типа:
PS: после php немного непривычно с этим питоном, учит порядку и соблюдать синтаксис, в пхп часто пренебрегал этим =)
0
|
||||||
|
Модератор
|
|||||||||||
| 21.11.2022, 09:39 | |||||||||||
|
web-er, не прокатило так как условие не правильно поставлено (да и регулярки для сие дела, не очень подходят):
Правильно:
0
|
|||||||||||
|
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
|
||||||
| 21.11.2022, 09:59 [ТС] | ||||||
|
Fudthhh, хорошо, попробую применить, а пока вот что получилось... Незнаю правда, правильно так делать или нет, но обработчик команды как бы отрабатывает и не дает ошибок и краша скрипта.
Вот что получилось:
0
|
||||||
|
Модератор
|
||||||||||||||||
| 21.11.2022, 10:26 | ||||||||||||||||
|
web-er, булевы переменные лучше сравнивать так (более читабельно):
Можно и так:
0
|
||||||||||||||||
|
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
|
||||||
| 21.11.2022, 12:03 [ТС] | ||||||
|
Fudthhh, благодарю за примеры, теперь попробую все это "переварить"...
да, я ещё мыслю как ПХПист, потому и условный оператор сделал похожим на тот "привычный" метод... Добавлено через 59 минут Fudthhh, попробовал ваш метод, но сначала подумал я где то ошибся, бот просто молчит, решил вообще целиком взять ваш код и проверить (указав только переменную бота), но тоже молчит. Хотя не крашится...
0
|
||||||
|
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
|
||||||
| 21.11.2022, 13:13 [ТС] | ||||||
|
Fudthhh, добавлял уже, все равно молчит...
0
|
||||||
|
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
|
||||||
| 23.11.2022, 17:52 [ТС] | ||||||
|
Fudthhh, в принципе разобрался, удалил из кода эту часть:
0
|
||||||
|
17 / 17 / 6
Регистрация: 11.11.2015
Сообщений: 146
|
|
| 24.11.2022, 13:32 | |
|
Понимаю, что немного запоздал с подсказкой, но может пригодится на будущее - в Питоне есть ф-я isinstance(), гляньте на нее при случае
0
|
|
|
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
|
|
| 24.11.2022, 13:43 [ТС] | |
|
vkiper, хорошо, гляну...
Сейчас я пытаюсь понять работу с функцией register_next_step_handler, т.е. интересует, как ей "сказать", что ждать можно ждать ответа от пользователя например 10 секунд, а потом, если пользователь так ничего и не ответил, произвести некие действия (поторопить его, сбросить диалог и т.д.). Пытался сразу после register_next_step_handler вставить функцию таймера, но проблема в том, что даже если юзер ответил, таймер все равно после этих 10 секунд срабатывает и отправляет в чат реплику бота, будто от пользователя не было ответа, хотя по факту он ответил вовремя. гугл не особо помог, пытаюсь "курить" маны, но пока безуспешно... PS: не хотелось бы по каждой проблеме плодить тут темы, потому, если позволят модераторы, продолжу вникать в рамках этой темы.
0
|
|
|
Модератор
|
|
| 24.11.2022, 14:03 | |
|
vkiper, очень полезная функция, особенно учесть что в сообщении 100% приходит строка.
web-er, таймер надо либо останавливать, либо после истечения времени проверять флаг, сделал пользователь то что нужно или нет.
0
|
|
|
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
|
||||||
| 24.11.2022, 15:17 [ТС] | ||||||
|
Fudthhh, вот я пока пробую варианты, но ни один не помогает. Какой флаг или переменную проверять и где, когда скрипт в процессе ожидания ответа от пользователя... В целевой функции, я так понимаю нет смысла проверять, ведь она сработает лишь по факту ответа от пользователя и в ней уже есть свои обработчики проверок того, что ввел юзер. Получается, что будто бы ловить этот самый флаг надо где то между функцией команды, которая по итогу активировала register_next_step_handler и как бы обращения в следующую функцию пока нет, но она прописана в этом register_next_step_handler...
И теперь я курю маны и не понимаю, где ловить теперь ответ юзера, если в функции команды так понимаю, все переменные уже известны и в message по прежнему висит команда, которую написал юзер, вот ту и проблема, как поймать ответ юзера между этими двумя функциями... Короче я сам запутался, как новичку, который привык учиться на практических простых примерах, понять это очень сложно. Вот в общих чертах, как я пытался сделать, но таймер срабатывает даже тогда, когда юзер вовремя дал ответ.
Чтоб скрипт "помнил", что писал юзер и сравнивал изменения, на ум приходит только хранение данных в БД или в файле... Но по мне это костыль ещё тот...
0
|
||||||
|
Модератор
|
|
| 25.11.2022, 07:33 | |
|
web-er, значит стоит начать с основ если нет понимания как это реализовать.
Вкратце: 1) Юзер пишет команду, запускаем поток. 2) В потоке проверяем в бд состояние пользователя ответил ли он. 3) Если время истекло, выдаем сообщение, если пользователь ответил, закрываем поток. Во всех серверных приложениях, почти каждое действие храниться в бд, т. к. сервер в любое время может упасть и все данные будут потеряны.
0
|
|
|
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
|
|
| 25.11.2022, 10:30 [ТС] | |
|
Fudthhh, ну я вот и пытаюсь эти основы понять, вот юзер написал команду и отправил её, скрипт бота активировал метод register_next_step_handler и ждет от пользователя действий (какого либо текста). Ведь целевая функция, которая читает ответ и выполняет действие я так понимаю пока не активна(молчит)... Юзер вводит текст и отправляет, целевая функция сразу даёт знать об этом и отвечает пользователю.
Теперь вот что получается, пока целевая функция не получила текст, а функция источник так скажем висит на register_next_step_handler и ждет текст... Вот тут нужно запустить некий цикл и отслеживать поток, как вы сказали. Т.е. по любому БД придется использовать, чтоб в неё записывать активность юзера(айди и прочее)? в качестве БД я так понимаю можно использовать и тестовой файл же? Собственно он получается будет в цикле "прослушки" действий юзера и перезаписываться, если данные обновились? В этом случае, завершить цикл перезаписи БД и послать в таймер флаг стоп и дальше уже отвечает целевая функция? Правильно я понимаю порядок работы метода отлова данные пользователя? Данные так же ловить из message массива?
0
|
|
|
Модератор
|
|
| 28.11.2022, 07:34 | |
|
web-er, не нужно использовать register_next_step_handler, по факту обрабатываются все команды, просто проверяются должны они что то выполнить или нет, я не использовал эту функцию в проектах, т. к. ее применение очень узконаправленное. В aiogram, есть конечные автоматы(FSMContext) (которые как раз замещают костыли, для внесения многих данных в базу данных, т. к. при правильной настройке это все делается автоматически).
0
|
|
|
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
|
||||||
| 28.11.2022, 16:24 [ТС] | ||||||
|
Fudthhh, хорошо. учту, aiogram погляжу...
Ну а пока набросал в процессе изучения "манов" и ваших подсказок бота, который более менее работает. 1. Выводит случайные числа в указанном диапазоне и количестве (опционально) 2. Выводит случайные элемента из списка в указанном количестве 3. Ну и что то вроде админки, где бот отвечает только тем, кто в списке этих самых админов (их айди в телеграм). Сейчас выводит для таковых только debug_info, чтоб видеть массив переменных для работы с данными пользователей. Убрал из основного скрипта часть данных в отдельные файлы (данные конфига бота и его ответы) Так что теперь скрипт выглядит более аккуратно и нет теперь необходимости постоянно подтирать токен и т.д., если придется код выкладывать на форуме для поиска решений. Что скажете? Норм или ещё что-то стоит подработать в нём?
0
|
||||||
| 28.11.2022, 16:24 | |
|
Помогаю со студенческими работами здесь
19
Бот для Телеграмм, использование клавиатур и команд Бот discord.py Проблема с обработкой(Обновлением) таблицы в async методе, sqllite3 Бот в телеграмм на Питоне Бот в телеграмм на Питоне Vk api бот на питоне Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
|
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс.
Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
|
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа.
В качестве фильтра для отбора служит предопределенное значение перечислений.
Процедура. . .
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|