Discord机器人翻译命令报错AttributeError: 'coroutine' object has no attribute 'text'求助
让我帮你一步步拆解并解决这个问题,你的代码里有几个关键细节错误导致了当前的异常:
1. 翻译器实例的作用域混淆
你在on_ready里创建的translator = Translator()是局部变量,在translate命令里根本访问不到。更糟的是你的Cog类名字也是translator,这会导致命名冲突——命令里的translator.translate其实是在调用类本身,而不是你想要的翻译器实例。
解决方法:把翻译器实例作为Cog的类属性保存,这样整个类都能正常访问:
class translator(commands.Cog): def __init__(self, client): self.client = client # 在这里初始化翻译器,作为类的全局属性 self.translator = Translator() @commands.Cog.listener() async def on_ready(self): print("Translator is loaded") # 移除这里的局部translator变量
2. 错误的await使用与属性访问
googletrans的translate方法是同步方法,返回的是Translated对象,不是协程,完全不需要用await。而且text是这个对象的属性,不是方法,不需要加括号。你之前写的await translation.text或者await translation.text()都是错误用法。
修正后的翻译调用逻辑:
translation = self.translator.translate(text_to_translate, dest=lang) await ctx.send(translation.text)
3. 命令参数的输入捕获问题
你的translate命令参数texts只会接收用户输入的第一个单词,因为discord.py默认把空格分隔的内容拆分为不同参数。如果要接收完整的待翻译文本,需要用*texts来捕获所有后续参数,再拼接成完整字符串:
@commands.command() async def translate(self, ctx, lang="en", *texts): # 把所有分散的文本参数拼接成完整字符串 text_to_translate = " ".join(texts)
(我把lang和texts的顺序调换了,这样用户输入!translate zh hello world时,zh是目标语言,后面的是待翻译文本,更符合使用习惯)
4. 赋值语句的低级错误
你之前写的lang == "en"是比较运算符,不是赋值操作,应该改成lang = "en"。不过上面的参数默认值写法lang="en"已经帮你处理了默认语言的逻辑,不需要额外判断。
完整修正后的代码
import googletrans from googletrans import Translator, constants import discord from discord.ext import commands class translator(commands.Cog): def __init__(self, client): self.client = client # 初始化翻译器实例为类属性 self.translator = Translator() @commands.Cog.listener() async def on_ready(self): print("Translator is loaded") @commands.command() async def translate(self, ctx, lang="en", *texts): # 处理用户未输入文本的情况 if not texts: await ctx.send("请提供需要翻译的文本!") return # 拼接所有文本参数 text_to_translate = " ".join(texts) # 调用翻译方法(同步方法,无需await) translation = self.translator.translate(text_to_translate, dest=lang) # 格式化发送翻译结果 await ctx.send(f"**翻译结果 ({lang}):** {translation.text}") def setup(client): client.add_cog(translator(client))
额外提示
googletrans是非官方的第三方库,有时候可能会遇到API访问限制,如果后续出现报错,可以考虑使用官方的Google Cloud Translation API,或者更稳定的翻译库比如translatepy。
内容的提问来源于stack exchange,提问作者Dheeraj-Tech

