Telegram Bot运行bot.polling()报token未定义错误排查
问题根因
报错指向非常明确:Python原生的os.getenv()方法不会自动加载项目目录下.env文件中配置的环境变量。你虽然把Bot Token写入了.env文件,但没有执行加载.env的逻辑,os.getenv('API_KEY')实际返回空值None,初始化TeleBot实例时传入的Token无效,等到执行bot.polling()发起接口请求时就会触发「Bot token is not defined」异常。
解决方案
按以下步骤操作即可修复:
- 安装用于加载.env配置的依赖库
python-dotenv
pip install python-dotenv
- 确认项目根目录下的.env文件配置格式正确,不要给Token值加多余的引号、不要有拼写错误,正确格式示例:
API_KEY=你从@BotFather获取到的完整Bot Token字符串
- 修改代码,在读取环境变量前先加载.env文件,修正后的完整可运行代码如下:
import os import telebot from dotenv import load_dotenv # 加载当前项目根目录下的.env文件配置到系统环境变量 load_dotenv() API_TOKEN = os.getenv('API_KEY') # 增加前置校验,避免等到发起请求才发现Token为空 if not API_TOKEN: raise RuntimeError("未读取到API_KEY配置,请检查.env文件位置和配置内容") bot = telebot.TeleBot(API_TOKEN) @bot.message_handler(commands=['hello']) def send_welcome(message): bot.reply_to(message, "HI!") if __name__ == "__main__": bot.polling()
额外排查点
如果按上述步骤修改后仍然报错,检查以下两点:
- 运行脚本时的工作目录是否为项目根目录,
load_dotenv()默认从当前工作目录查找.env文件,如果工作目录不对会找不到配置文件 - 检查.env文件名是否正确,不要写成
.env.txt这类带后缀的格式,Windows系统默认隐藏文件后缀,很容易踩这个坑
临时测试的话也可以不用.env文件,直接在运行脚本前在终端设置环境变量:macOS/Linux系统执行
export API_KEY=你的BotToken,Windows CMD执行set API_KEY=你的BotToken,之后在同一个终端窗口运行脚本即可,不过这种方式每次新开终端都要重新设置,只适合临时调试用。
内容的提问来源于stack exchange,提问作者Ansh Tyagi
相关产品推荐
相关产品推荐

