Discord机器人!gender命令返回内存地址而非输入值问题排查
问题根因
你遇到的内存地址输出问题是语法错误导致的:
代码中gender = msg.split(" ")[1].lower这行,你只写了方法名lower,没有加括号()调用这个方法,所以gender变量存储的是字符串对象自带的lower方法本身,而不是方法执行后返回的小写字符串,才会输出类似<built-in method lower of str object at 0x7fc35adfc230>的方法内存引用信息。
另外你的代码还有两处会导致后续运行报错的问题:
- 没有判断用户是否只发送了
!gender而没有附带性别参数,这种情况下msg.split(" ")结果长度只有1,直接取索引[1]会触发索引越界错误 - 新版discord.py(v1.0及以上版本)已经移除了
message.server属性,获取服务器信息需要用message.guild,同时给用户加角色的方法也可以直接通过message.author.add_roles()调用,不需要走client对象
修复后可运行代码
import discord from discord.utils import get import os import requests import json import random from replit import db client = discord.Client() @client.event async def on_ready(): print(f"Successfully logged in as {client.user}") @client.event async def on_message(message): if message.author == client.user: return msg = message.content if msg.startswith("!gender"): msg_split = msg.split() # 校验参数是否完整 if len(msg_split) < 2: await message.channel.send("使用格式错误,请输入 !gender male 或者 !gender female") return # 修复:加()调用lower方法获取小写字符串 gender = msg_split[1].lower() if gender not in ("male", "female"): await message.channel.send(f"性别输入无效,仅支持Male/Female,你输入的内容为:{gender}") return if gender == "male": # 修复:替换废弃的message.server为message.guild role = get(message.guild.roles, name="Male") await message.author.add_roles(role) await message.channel.send("已成功为你添加Male角色!") if gender == "female": role = get(message.guild.roles, name="Female") await message.author.add_roles(role) await message.channel.send("已成功为你添加Female角色!")
修复点说明
- 给
lower补充括号(),正确执行字符串转小写的逻辑,拿到实际的用户输入值 - 新增参数长度校验,避免用户漏输性别时触发报错
- 替换废弃的接口属性,适配新版discord.py的API规范,保证角色分配逻辑正常运行
内容的提问来源于stack exchange,提问作者cloudified
相关产品推荐
相关产品推荐

