Форум программистов, компьютерный форум, киберфорум
Python: API, боты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 0
Регистрация: 20.11.2022
Сообщений: 11
Telegram Bot

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

20.11.2022, 22:24. Показов 1955. Ответов 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
Ответ Создать тему
Новые блоги и статьи
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru