0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
Telegram Bot

Бот на питоне для телеги - проблемы с обработкой команд

20.11.2022, 22:24. Показов 1989. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
поздновато может для меня учить программирование, но что не сделаешь ради хобби (хотя я чайник по вашим меркам ещё тот), решил начать знакомство с "питона" и первым проектом для себя выбрал - создание скрипта бота для телеги с возможностью обрабатывать команды, в т.ч. с параметрами (аргументами). Ну и чтоб бот часть команд воспринимал только от конкретных пользователей (своего рода админы или модераторы).

Вот команды с параметрами (аргументами) доставили проблем. Для примера решил реализовать вывод ботом случайного числа в формате по примеру:

Code
1
/rand 1 500
т.е. в диапазоне между 1 и 500 выдать случайное число

вроде работает, но до тех пор, пока пользователь будет соблюдать формат команды. Да, я предусмотрел в обработчике команды, если юзер не введет аргументы вообще или введет, но явно не два или если диапазон неверно указан... Тут обработчик верно отрабатывает и указывает на ошибку пользователя. предлагая ему исправить. Но вот, если он введет вместо чисел - буквы и прочее, что явно не является числами, но скрипт сразу крашится, бот останавливается...

и вываливается ошибка:

Python
1
2
    x_min = int(message.text.split()[1])
ValueError: invalid literal for int() with base 10: 'www'
Я курил мануалы как только мог, пытался регулярками и прочими методами, но толком не заработало, может дадите решение, чтоб в обработчике учитывался момент, если вместо чисел в аргументах окажется что то совсем другое?

вот мой код:



Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import telebot
import random
 
API_BOT = "токен бота"
ADMIN_USER_ID: list[int] = [список айди пользователей админов бота]
 
THIS_BOT = telebot.TeleBot(API_BOT)
 
 
@THIS_BOT.message_handler(commands=['start'])
def cmd_start(message):
    THIS_BOT.send_message(message.chat.id,
                          f'<b>Привет, {message.from_user.first_name}! Я Ваш интерактивный помошник.</b>',
                          parse_mode='html')
 
 
@THIS_BOT.message_handler(commands=['rand'])
def cmd_rand(message):
    if len(message.text.split()[1:]) == 2:
        x_min = int(message.text.split()[1])
        x_max = int(message.text.split()[2])
    else:
        x_min = False
        x_max = False
 
    if x_min < x_max is not False:
        result = random.randint(x_min, x_max)
        THIS_BOT.send_message(message.chat.id, f"Случайное число: {result} ", parse_mode='html')
    else:
        THIS_BOT.send_message(message.chat.id, f"Ошибка! Неправильно указаны аргументы команды. \n Правильный пример: "
                                               f"/rand 1 100 \n Вы написали следующее: {message.text}",
                              parse_mode='html')
 
 
@THIS_BOT.message_handler()
def msg(message):
    if (message.text == "debug_info") and (message.from_user.id in ADMIN_USER_ID) is True:
        THIS_BOT.send_message(message.chat.id, message, parse_mode='html')
 
 
if __name__ == "__main__":
    THIS_BOT.polling(none_stop=True)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.11.2022, 22:24
Ответы с готовыми решениями:

Бот для telegram на Питоне
Очень хотел написать бота для telegram, долго изучал эту тему и наконец написал программу. Писал на PyCharm под Виндой, задача Бота ответ...

Бот для дискорда на питоне
Добрый день и всех с наступающим! Немного начала разбираться с написание бота для дискорда, написал и запустил. Этого было мало и я...

Бот на питоне для Flash игры
Здравствуйте! Необходим бот для Флеш игры. Естественно собираюсь писать сам. Есть кликер написанный мной на Питоне, который будет...

18
243 / 178 / 73
Регистрация: 17.10.2018
Сообщений: 749
21.11.2022, 07:03
А просто в try-except обернуть не подходит что ли?
2
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
21.11.2022, 07:36
web-er, сделай проверку на числа:
Python
1
2
3
string_args = message.text.split()
if all(map(str.isdigit, string_args[1:])):
    ...
0
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
21.11.2022, 08:22  [ТС]
Lekks, кстати да, вариант, как раз испробую в деле. Подсмотрел подобное в соседней похожей теме и тут ещё от вас этот же вариант. Однозначно попробую добавить этот метод. Спасибо.

Fudthhh, то что надо! сейчас протестирую код, благодарю. Пытался на регулярном выражении типа:

Python
1
    if re.findall('\d+', x_min) and re.findall('\d+', x_max) is True:
Но не прокатило что то...

PS: после php немного непривычно с этим питоном, учит порядку и соблюдать синтаксис, в пхп часто пренебрегал этим =)
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
21.11.2022, 09:39
web-er, не прокатило так как условие не правильно поставлено (да и регулярки для сие дела, не очень подходят):

Правильно:
Python
1
2
if re.match('\d+', x_min) and re.match('\d+', x_max):
    ...
Можно тогда уж вообще все выражение проверять:
Python
1
2
3
4
5
6
7
8
9
10
import re
 
 
def foo(message: str):
    match = re.match(r"/roll (\d+) (\d+)", message)
    if not match: return
    minimum, maximum = map(int, match.groups())
    print(minimum, maximum) # 0 100
 
foo("/roll 0 100")
0
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
21.11.2022, 09:59  [ТС]
Fudthhh, хорошо, попробую применить, а пока вот что получилось... Незнаю правда, правильно так делать или нет, но обработчик команды как бы отрабатывает и не дает ошибок и краша скрипта.

Вот что получилось:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import telebot
import random
 
API_BOT = ""
ADMIN_USER_ID: list[int] = []
 
THIS_BOT = telebot.TeleBot(API_BOT)
 
 
@THIS_BOT.message_handler(commands=['start'])
def cmd_start(message):
    THIS_BOT.send_message(message.chat.id,
                          f'<b>Привет, {message.from_user.first_name}! Я Ваш интерактивный помошник.</b>',
                          parse_mode='html')
 
 
@THIS_BOT.message_handler(commands=['rand'])
def cmd_rand(message):
    string_var = message.text.split()
    if all(map(str.isdigit, string_var[1:])) is False:
        THIS_BOT.send_message(message.chat.id, f"Ошибка! параметры должны быть числами!", parse_mode='html')
    elif len(message.text.split()[1:]) != 2:
        THIS_BOT.send_message(message.chat.id, f"Ошибка! параметров должно быть два!", parse_mode='html')
    elif int(message.text.split()[1]) > int(message.text.split()[2]):
        THIS_BOT.send_message(message.chat.id, f"Ошибка! Число во втором параметре должно быть больше!",
                              parse_mode='html')
    else:
        result = random.randint(int(message.text.split()[1]), int(message.text.split()[2]))
        THIS_BOT.send_message(message.chat.id, f"Случайное число: {result} ", parse_mode='html')
 
 
@THIS_BOT.message_handler()
def msg(message):
    if (message.text == "debug_info") and (message.from_user.id in ADMIN_USER_ID) is True:
        THIS_BOT.send_message(message.chat.id, message, parse_mode='html')
 
 
if __name__ == "__main__":
    THIS_BOT.polling(none_stop=True)
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
21.11.2022, 10:26
web-er, булевы переменные лучше сравнивать так (более читабельно):
Python
1
2
3
4
5
6
7
8
is_true = True
is_false = False
 
if is_true:
    print("TRUE")
 
if not is_false:
    print("FALSE")
Порядок условий выставлен не верно, сначало проверяют количество аргументов, а потом уже тип, если тип ошибки не важен, то можно вот так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
@bot.message_handler(commands=["roll"],
    help="Command to get a random value in a given range.\n"
         "  Syntaxis: /roll <minimum> <maximum>\n"
         "  -----------------------------------\n"
         "  Example: /roll 0 100")
def command_roll(message: telebot.types.Message) -> None:
    match: re.Match = re.match(r"/roll (\d+) (\d+)", message.text)
    if match:
        minimum, maximum = map(int, match.groups())
        result: int = random.randint(minimum, maximum)
        bot.send_message(f"Result: {result}")
    else:
        bot.send_message(message.chat.id, "Incorrect command syntax!")
Добавлено через 9 минут
Можно и так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@bot.message_handler(commands=["roll"],
    help="Command to get a random value in a given range.\n"
         "  Syntaxis: /roll <minimum> <maximum>\n"
         "  -----------------------------------\n"
         "  Example: /roll 0 100")
def command_roll(message: telebot.types.Message) -> None:
    string_args: list[str] = message.text.split()
    if len(string_args) != 3:
        bot.send_message("Two arguments were expected!")
        return 
    if not all(map(str.isdigit, string_args[1:])):
        bot.send_message("Arguments must be numbers!")
        return
    minimum, maximum = map(int, string_args)
    if minimum > maximum:
        bot.send_message("The first number must be greater than the second!")
        return
    result = random.randint(minimum, maximum)
    bot.send_message(message.chat.id, f"Result: {result}")
0
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
21.11.2022, 12:03  [ТС]
Fudthhh, благодарю за примеры, теперь попробую все это "переварить"...

да, я ещё мыслю как ПХПист, потому и условный оператор сделал похожим на тот "привычный" метод...

Добавлено через 59 минут
Fudthhh, попробовал ваш метод, но сначала подумал я где то ошибся, бот просто молчит, решил вообще целиком взять ваш код и проверить (указав только переменную бота), но тоже молчит. Хотя не крашится...

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import random
import telebot
from telebot import types
 
API_BOT = ""
ADMIN_USER_ID: list[int] = []
 
THIS_BOT = telebot.TeleBot(API_BOT)
 
 
@THIS_BOT.message_handler(commands=['start'])
def cmd_start(message):
    THIS_BOT.send_message(message.chat.id,
                          f'<b>Привет, {message.from_user.first_name}! Я Ваш интерактивный помошник.</b>',
                          parse_mode='html')
 
 
 
@THIS_BOT.message_handler(commands=["roll"],
                     help="Command to get a random value in a given range.\n"
                          "  Syntaxis: /roll <minimum> <maximum>\n"
                          "  -----------------------------------\n"
                          "  Example: /roll 0 100")
def command_roll(message: telebot.types.Message) -> None:
    string_args: list[str] = message.text.split()
    if len(string_args) != 3:
        THIS_BOT.send_message("Two arguments were expected!")
        return
    if not all(map(str.isdigit, string_args[1:])):
        THIS_BOT.send_message("Arguments must be numbers!")
        return
    minimum, maximum = map(int, string_args)
    if minimum > maximum:
        THIS_BOT.send_message("The first number must be greater than the second!")
        return
    result = random.randint(minimum, maximum)
    THIS_BOT.send_message(message.chat.id, f"Result: {result}")
 
 
@THIS_BOT.message_handler()
def msg(message):
    if (message.text == "debug_info") and (message.from_user.id in ADMIN_USER_ID) is True:
        THIS_BOT.send_message(message.chat.id, message, parse_mode='html')
 
 
if __name__ == "__main__":
    THIS_BOT.polling(none_stop=True)
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
21.11.2022, 12:56
web-er, я не указал id чата в который надо отсылать сие сообщение

Добавлено через 23 секунды
То бишь везде надо добавить "message.chat.id"
0
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
21.11.2022, 13:13  [ТС]
Fudthhh, добавлял уже, все равно молчит...

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@THIS_BOT.message_handler(commands=["roll"],
                          help="Command to get a random value in a given range.\n"
                               "  Syntaxis: /roll <minimum> <maximum>\n"
                               "  -----------------------------------\n"
                               "  Example: /roll 0 100")
def command_roll(message: telebot.types.Message) -> None:
    string_args: list[str] = message.text.split()
    if len(string_args) != 3:
        THIS_BOT.send_message(message.chat.id, "Two arguments were expected!")
        return
    if not all(map(str.isdigit, string_args[1:])):
        THIS_BOT.send_message(message.chat.id, "Arguments must be numbers!")
        return
    minimum, maximum = map(int, string_args)
    if minimum > maximum:
        THIS_BOT.send_message(message.chat.id, "The first number must be greater than the second!")
        return
    result = random.randint(minimum, maximum)
    THIS_BOT.send_message(message.chat.id, f"Result: {result}")
0
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
23.11.2022, 17:52  [ТС]
Fudthhh, в принципе разобрался, удалил из кода эту часть:


Python
1
2
3
4
                          help="Command to get a random value in a given range.\n"
                               "  Syntaxis: /roll <minimum> <maximum>\n"
                               "  -----------------------------------\n"
                               "  Example: /roll 0 100"
и он заработал, хотя скрипт и до этого ошибок не выдавал, просто бот молчат на эту команду, теперь отвечает. Чтож теперь дальше буду вникать, что да как работает...
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
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
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 по прежнему висит команда, которую написал юзер, вот ту и проблема, как поймать ответ юзера между этими двумя функциями... Короче я сам запутался, как новичку, который привык учиться на практических простых примерах, понять это очень сложно.

Вот в общих чертах, как я пытался сделать, но таймер срабатывает даже тогда, когда юзер вовремя дал ответ.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import telebot
import time
 
bot = telebot.TeleBot('123')
 
 
@bot.message_handler(commands=['my_command'])
def welcome(message):
    timing = time.time()
 
    mess = bot.send_message(message.chat.id, 'Please send me message')
    bot.register_next_step_handler(mess, test)
 
    while True:
        if time.time() - timing > 10.0:
            bot.send_message(message.chat.id, f"Отмена ожидания, пользователь не дал ответ")
            bot.clear_step_handler_by_chat_id(chat_id=message.chat.id)
            break
 
 
def test(message):
    bot.send_message(message.chat.id, 'You send me message')
 
 
if __name__ == "__main__":
    bot.polling(none_stop=True)
Добавлено через 18 минут
Чтоб скрипт "помнил", что писал юзер и сравнивал изменения, на ум приходит только хранение данных в БД или в файле... Но по мне это костыль ещё тот...
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
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
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
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, чтоб видеть массив переменных для работы с данными пользователей.

Убрал из основного скрипта часть данных в отдельные файлы (данные конфига бота и его ответы)

Так что теперь скрипт выглядит более аккуратно и нет теперь необходимости постоянно подтирать токен и т.д., если придется код выкладывать на форуме для поиска решений.

Что скажете? Норм или ещё что-то стоит подработать в нём?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import random
import telebot
from Lang_RU import *
from cfg import *
 
ADMIN_USER_ID: list[int] = ADMINS
THIS_BOT = telebot.TeleBot(TOKEN)
 
 
@THIS_BOT.message_handler(commands=['start'])
def cmd_start(message):
    start = hi.replace('_F_NAME_', message.from_user.first_name)
    THIS_BOT.send_message(message.chat.id, start, parse_mode='html')
 
 
@THIS_BOT.message_handler(commands=['rand'])
def cmd_rand(message):
    string_var = message.text.split()
 
    if len(message.text.split()[1:]) > 3 or len(message.text.split()[1:]) <= 1:
        THIS_BOT.send_message(message.chat.id, err_rand_ca)
        return
    if all(map(str.isdigit, string_var[1:])) is False:
        THIS_BOT.send_message(message.chat.id, err_rand_isdigit)
        return
    if int(message.text.split()[1]) > int(message.text.split()[2]):
        THIS_BOT.send_message(message.chat.id, err_rand_sa)
        return
    if len(message.text.split()[1:]) == 3 and int(message.text.split()[3]) > int(message.text.split()[2]):
        THIS_BOT.send_message(message.chat.id, err_rand_la)
        return
 
    if len(message.text.split()[1:]) == 3 and int(message.text.split()[3]) > 0:
        is_count = int(message.text.split()[3])
    else:
        is_count = 1
 
    number = 0
    cat = []
 
    while number < is_count:
        number += 1
        result = random.randint(int(message.text.split()[1]), int(message.text.split()[2]))
        check_item = cat.count(result)
        if check_item == 0:
            cat.append(result)
            continue
        else:
            number = number - 1
        if number > is_count:
            break
 
    delimiter = '\n'
    single_str = delimiter.join([str(item) for item in cat])
 
    rand_result1 = rand_results.replace('_RAND_RANGE_START_', message.text.split()[1])
    rand_result2 = rand_result1.replace('_RAND_RANGE_END_', message.text.split()[2])
    rand_result3 = rand_result2.replace('_RAND_COUNTS_', str(is_count))
    rand_result_list = rand_results_list.replace('_RAND_RESULT_LIST_', single_str)
    THIS_BOT.reply_to(message, rand_result3, parse_mode='html')
    THIS_BOT.send_message(message.chat.id, rand_result_list, parse_mode='html')
 
 
@THIS_BOT.message_handler(commands=['rand_item'])
def rand_item(message: telebot.types.Message):
    string_args: list[str] = message.text.split()
    if not all(map(str.isdigit, string_args[1:])):
        THIS_BOT.send_message(message.chat.id, err_rand_item_isdigit)
        return
    if len(string_args[1:]) < 1 or len(string_args[1:]) > 2:
        THIS_BOT.send_message(message.chat.id, err_rand_item_la)
        return
    count_items = string_args[1]
 
    THIS_BOT.reply_to(message, rand_item_islist, parse_mode='html')
    photo = open('all_list.jpg', 'rb')
    THIS_BOT.send_photo(message.chat.id, photo)
    rand_item_inf = rand_item_islist_inf.replace('_COUNTS_ITEMS_', count_items)
    rand_item_inf_result = rand_item_inf.replace('_F_NAME_', message.from_user.first_name)
    out = THIS_BOT.send_message(message.chat.id, rand_item_inf_result, parse_mode='html')
    THIS_BOT.register_next_step_handler(out, rand_list_item, count_items)
 
 
def rand_list_item(message, value):
    item_list = message.text.split()
 
    if message.text == "-":
        THIS_BOT.reply_to(message, rand_item_cansel, parse_mode='html')
        THIS_BOT.clear_step_handler_by_chat_id(chat_id=message.chat.id)
        return
    if len(item_list) < 2:
        err1 = THIS_BOT.send_message(message.chat.id, err_rand_item_not_list, parse_mode='html')
        THIS_BOT.register_next_step_handler(err1, rand_list_item, value)
        return
    if len(item_list) < int(value):
        err_rand_ill = err_rand_item_len_list.replace('_ITEM_LIST_COUNT_', len(item_list))
        err_rand_ill2 = err_rand_ill.replace('_ITEM_LIST_RANGE_', value)
        err2 = THIS_BOT.send_message(message.chat.id, err_rand_ill2, parse_mode='html')
        THIS_BOT.register_next_step_handler(err2, rand_list_item, value)
        return
 
    items = random.sample(item_list, int(value))
    delimiter = '\n'
    single_str = delimiter.join([str(item) for item in items])
    rand_item_list = rand_item_result_list.replace('_COUNTS_ITEMS_LIST_', single_str)
    THIS_BOT.reply_to(message, rand_item_result, parse_mode='html')
    THIS_BOT.send_message(message.chat.id, rand_item_list, parse_mode='html')
 
 
@THIS_BOT.message_handler()
def msg(message):
    if (message.text == "debug_info") and (message.from_user.id in ADMIN_USER_ID) is True:
        THIS_BOT.send_message(message.chat.id, message, parse_mode='html')
        return
 
 
THIS_BOT.polling(none_stop=True)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.11.2022, 16:24
Помогаю со студенческими работами здесь

Бот для Телеграмм, использование клавиатур и команд
Доброго дня! Можно ли как то сделать так, чтобы текст на кнопке был один, но когда нажимаешь он отправлял и выполнял команду. ...

Бот discord.py Проблема с обработкой(Обновлением) таблицы в async методе, sqllite3
Заранее извиняюсь за всю корявость, спасибо за вашу помощь и уделённое время :) Суть проблемы состоит в том, что это попытка обновить...

Бот в телеграмм на Питоне
Подскажите, может я чего то не вижу? Приложу часть кода, не могу понять, что делаю не так Первая часть: def name(message): if...

Бот в телеграмм на Питоне
Я только начал изучать это дело... Успел прочитать первую главу питона Марка Саммерфилда, читаю по возможности, но время поджимает. ...

Vk api бот на питоне
Короче ребята траблы такие хелпуйте. Делаю бота,код в основном как у всех на этом форуме т к с одного ресурса брали.У меня вопрос,что код...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru