使用pyTelegramBotAPI开发Telegram注册机器人遇参数缺失错误
Telegram机器人注册流程中断问题解决
问题描述
我是Python及编程新手,正在使用Python 3.10.6和pyTelegramBotAPI 4.7.0开发一个简单的Telegram机器人,实现用户注册功能。代码运行到输入姓氏步骤前一切正常,但输入姓氏后注册流程中断,发送其他消息机器人仅返回“Sorry, I don't understand that. Write /help”。IDLE Shell中报错:TypeError: TeleBot.send_message() missing 1 required positional argument: 'text',错误栈指向get_surname函数中的bot.send_message('What is your age?')调用。
原代码
import telebot; bot = telebot.TeleBot('*there was my Telegram bot token*'); name = ''; surname = ''; age = 0; @bot.message_handler(commands=['start']) def start_message(message): bot.send_message(message.chat.id,"Hi! I'm another bot for practicing skill :)") @bot.message_handler(content_types=['text']) def get_text_messages(message): if message.text == "hi": bot.send_message(message.from_user.id, "How can I help you?") elif message.text == "/help": bot.send_message(message.from_user.id, "Registration - /reg") elif message.text == '/reg': bot.send_message(message.from_user.id, "Nice! Lets sign you up! What is your name?"); bot.register_next_step_handler(message, get_name); else: bot.send_message(message.from_user.id, "Sorry, I don't understand that. Write /help") def get_name(message): global name; name = message.text; bot.send_message(message.from_user.id, 'Okay! What is your surname?'); bot.register_next_step_handler(message, get_surname); def get_surname(message): global surname; surname = message.text; bot.send_message('What is your age?'); bot.register_next_step_handler(message, get_age); def get_age(message): global age; while age == 0: try: age = int(message.text) except Exception: bot.send_message(message.from_user.id, 'Oops! I need only number.'); bot.send_message(message.from_user.id, 'You are '+str(age)+'yo, your full name is '+name+' '+surname+'?') bot.delete_webhook() bot.infinity_polling()
报错信息
2022-08-16 18:33:33,773 (__init__.py:878 MainThread) ERROR - TeleBot: "Infinity polling exception: TeleBot.send_message() missing 1 required positional argument: 'text'" 2022-08-16 18:33:33,895 (__init__.py:880 MainThread) ERROR - TeleBot: "Exception traceback: Traceback (most recent call last): File "C:\Users\Кирилл\AppData\Local\Programs\Python\Python310\lib\site-packages\telebot\__init__.py", line 874, in infinity_polling self.polling(non_stop=True, timeout=timeout, long_polling_timeout=long_polling_timeout, File "C:\Users\Кирилл\AppData\Local\Programs\Python\Python310\lib\site-packages\telebot\__init__.py", line 946, in polling self.__threaded_polling(non_stop=non_stop, interval=interval, timeout=timeout, long_polling_timeout=long_polling_timeout, File "C:\Users\Кирилл\AppData\Local\Programs\Python\Python310\lib\site-packages\telebot\__init__.py", line 1021, in __threaded_polling raise e File "C:\Users\Кирилл\AppData\Local\Programs\Python\Python310\lib\site-packages\telebot\__init__.py", line 977, in __threaded_polling self.worker_pool.raise_exceptions() File "C:\Users\Кирилл\AppData\Local\Programs\Python\Python310\lib\site-packages\telebot\util.py", line 154, in raise_exceptions raise self.exception_info File "C:\Users\Кирилл\AppData\Local\Programs\Python\Python310\lib\site-packages\telebot\util.py", line 98, in run task(*args, **kwargs) File "C:/Users/Кирилл/Desktop/bot/bot.py", line 32, in get_surname bot.send_message('What is your age?'); TypeError: TeleBot.send_message() missing 1 required positional argument: 'text' "
问题分析与解决
核心错误原因
bot.send_message()的第一个必填参数是聊天ID,第二个才是要发送的文本。你在get_surname函数里只传了文本'What is your age?',漏掉了聊天ID参数,导致触发TypeError。
修正后的代码
import telebot bot = telebot.TeleBot('你的Telegram机器人token') # 用字典存储用户数据,避免全局变量冲突,支持多用户 user_data = {} @bot.message_handler(commands=['start']) def start_message(message): bot.send_message(message.chat.id, "Hi! I'm another bot for practicing skill :)") @bot.message_handler(content_types=['text']) def get_text_messages(message): user_id = message.from_user.id if message.text == "hi": bot.send_message(user_id, "How can I help you?") elif message.text == "/help": bot.send_message(user_id, "Registration - /reg") elif message.text == '/reg': # 初始化当前用户的注册数据 user_data[user_id] = {'name': '', 'surname': '', 'age': 0} bot.send_message(user_id, "Nice! Let's sign you up! What is your name?") bot.register_next_step_handler(message, get_name) else: bot.send_message(user_id, "Sorry, I don't understand that. Write /help") def get_name(message): user_id = message.from_user.id user_data[user_id]['name'] = message.text bot.send_message(user_id, 'Okay! What is your surname?') bot.register_next_step_handler(message, get_surname) def get_surname(message): user_id = message.from_user.id user_data[user_id]['surname'] = message.text # 补上聊天ID参数 bot.send_message(user_id, 'What is your age?') bot.register_next_step_handler(message, get_age) def get_age(message): user_id = message.from_user.id try: age = int(message.text) user_data[user_id]['age'] = age name = user_data[user_id]['name'] surname = user_data[user_id]['surname'] bot.send_message(user_id, f'You are {age}yo, your full name is {name} {surname}?') except ValueError: bot.send_message(user_id, 'Oops! I need only number.') # 重新注册步骤处理器,让用户重新输入年龄 bot.register_next_step_handler(message, get_age) bot.delete_webhook() bot.infinity_polling()
额外优化点
- 替换全局变量:用
user_data字典存储每个用户的注册信息,避免多用户使用时数据互相覆盖。 - 修复年龄输入逻辑:原代码中的
while循环无效,因为register_next_step_handler只会触发一次get_age函数。现在改为捕获异常后重新注册步骤处理器,让用户可以重新输入年龄。 - 语法简化:去掉不必要的分号,使用f-string拼接字符串更简洁。
内容的提问来源于stack exchange,提问作者Alice T.
相关产品推荐
相关产品推荐

