Python Discord Bot如何嵌入每次执行命令时更新的变量?
问题解决:Discord机器人变量未定义与内容嵌入问题
核心问题分析
你遇到的x未定义错误,本质是局部变量作用域问题:playerlist函数里的x是局部变量,函数执行完后不会自动传递到外部的命令函数中,而且你的函数没有返回值,调用后无法获取处理后的结果。另外函数本身还有几处语法/依赖问题需要修正。
修正后的完整代码
1. 修复数据获取函数
from urllib.request import Request, urlopen from bs4 import BeautifulSoup # 替换成你的目标Battlemetrics服务器页面URL TARGET_URL = "https://your-battlemetrics-server-url.com" def get_player_list(): req = Request(TARGET_URL, headers={'User-Agent': 'Mozilla/5.0'}) webpage = urlopen(req).read() # 正确实例化BeautifulSoup对象 soup = BeautifulSoup(webpage, "html.parser") cleansoup = soup.get_text(strip=True, separator=" ") x = cleansoup.split("Play time")[-1] x = x.split("Most Time Played")[0] return x # 返回处理后的字符串,供外部命令调用
2. 修复Discord命令函数
@commands.hybrid_command( name="playerlist", description="获取服务器玩家列表及游玩时长", ) @checks.not_blacklisted() async def playerlist(self, context: Context) -> None: """从Battlemetrics获取玩家列表""" # 调用函数并接收最新的玩家数据 player_data = get_player_list() embed = discord.Embed( title="玩家列表", description=player_data, color=0x9C84EF ) await context.send(embed=embed)
关键修改说明
- 变量作用域修复:给数据获取函数添加
return x,调用时用变量接收返回值,确保命令函数能拿到每次执行时的最新玩家数据。 - 模块与实例化修复:补充必要的导入语句,把错误的
soup(...)改为BeautifulSoup(...),避免实例化失败。 - 命名优化:把原函数名
playerlist改为get_player_list,避免和Discord命令函数重名(虽然语法允许,但易造成混淆)。 - URL显式定义:新增
TARGET_URL变量,确保请求能正确指向目标Battlemetrics页面。
额外注意事项
- 确保机器人环境已安装依赖:
pip install beautifulsoup4 discord.py - 如果Battlemetrics页面结构发生变化,
split使用的关键词可能需要调整,否则会获取到错误数据。
内容的提问来源于stack exchange,提问作者Japanator 14
相关产品推荐
相关产品推荐

