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

开发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:56:04