You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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()

额外优化点

  1. 替换全局变量:用user_data字典存储每个用户的注册信息,避免多用户使用时数据互相覆盖。
  2. 修复年龄输入逻辑:原代码中的while循环无效,因为register_next_step_handler只会触发一次get_age函数。现在改为捕获异常后重新注册步骤处理器,让用户可以重新输入年龄。
  3. 语法简化:去掉不必要的分号,使用f-string拼接字符串更简洁。

内容的提问来源于stack exchange,提问作者Alice T.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 18:09:17