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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:05:24