开发Python版Telegram Bot遇ImportError:无法从telegram导入Chat类
解决python-telegram-bot 21.x版本的导入错误及代码适配问题
错误原因
python-telegram-bot从v20版本起进行了重大重构,你代码中使用的Updater、CallbackContext等旧API已被移除,同时Chat类的导入路径也发生变更,旧代码写法与v21.2版本完全不兼容,导致出现导入错误。
解决方案
适配python-telegram-bot v21.x的新API,调整代码结构如下:
修改后的代码
from telegram import Update from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes import random BOT_TOKEN = "sdfdsf" def generate_luhn_digit(num): digits = [int(d) for d in str(num)] checksum = 0 reverse_digits = digits[::-1] for i, digit in enumerate(reverse_digits): if i % 2 == 0: double = digit * 2 checksum += double - 9 if double > 9 else double else: checksum += digit return str((10 - (checksum % 10)) % 10) async def handle_cc_command(update: Update, context: ContextTypes.DEFAULT_TYPE): try: query = update.message.text.split(" ")[1] if not query[:-1].isdigit() or not query[-1].isdigit(): await update.message.reply_text("Invalid input. Please provide a numeric credit card base.") return luhn_num = generate_luhn_digit(query[:-1]) if "|" in query: expiry_data = query.split("|")[1].split() if len(expiry_data) == 2: expiry_month, expiry_year = expiry_data else: expiry_month = expiry_data[0] expiry_year = str(random.randint(20, 30)) + str(random.randint(0, 9)) else: expiry_month = str(random.randint(1, 12)).zfill(2) expiry_year = str(random.randint(20, 30)) + str(random.randint(0, 9)) cvv = str(random.randint(100, 999)) full_cc = f"{query[:-1]}{luhn_num}|{expiry_month}|{expiry_year}|{cvv}" await update.message.reply_text(f"Generated Credit Card Number: {full_cc}") except (IndexError, ValueError): await update.message.reply_text("Please provide a valid input format.") async def handle_unknown_message(update: Update, context: ContextTypes.DEFAULT_TYPE): await context.bot.send_message(chat_id=update.effective_chat.id, text="Unknown command") def main(): application = Application.builder().token(BOT_TOKEN).build() application.add_handler(CommandHandler("cc", handle_cc_command)) application.add_handler(MessageHandler(filters.COMMAND, handle_unknown_message)) application.run_polling() if __name__ == "__main__": main()
关键改动说明
- 用
Application替代旧的Updater,这是v20+版本的核心入口类 - 所有命令处理函数需改为异步函数(添加
async关键字),回复消息使用await - 用
ContextTypes.DEFAULT_TYPE替代旧的CallbackContext - 过滤器常量改为大写形式,比如
filters.COMMAND而非filters.command - 启动方式改为
application.run_polling(),并封装到main函数中
内容的提问来源于stack exchange,提问作者Kamal
相关产品推荐
相关产品推荐

