|
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
|
||||||||||||||||
Telegram Bot Бот на питоне для телеги - проблемы с обработкой команд20.11.2022, 22:24. Показов 1955. Ответов 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 бот на питоне Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Рецензия / Мнение
Это мой обзор планшета X220 с точки зрения школьника.
Недавно я решила попытаться уменьшить свой. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|