在discord.py中如何从Client对象获取应用令牌以识别消息来源
问题解答
当然可以用令牌来识别消息对应的应用,但要注意Python闭包的延迟绑定问题——直接在循环里定义事件回调会导致所有回调都指向最后一个client的token,得做一点调整。
你的clients列表里每个元素已经保存了token(启动时用的clnt.token就是明证),所以只需要把当前client的token绑定到on_message回调里,避免闭包陷阱。
方法一:用默认参数捕获当前client
修改事件绑定部分的代码:
for client in clients: @client.obj.event async def on_message(message, current_client=client): if message.author.bot: return await message.channel.send(current_client.token)
方法二:用函数工厂创建回调
如果觉得默认参数不够直观,也可以用函数工厂生成绑定了当前client的回调:
import functools def create_message_handler(current_client): async def on_message(message): if message.author.bot: return await message.channel.send(current_client.token) return on_message for client in clients: handler = create_message_handler(client) client.obj.event(handler)
注意:Discord.py的Client实例本身不会存储原始令牌(启动后令牌会被内部处理,不会保留在公开属性里),所以必须依赖你自己在clients元素中保存的token值来实现识别。
内容的提问来源于stack exchange,提问作者Gia Nebieridze
相关产品推荐
相关产品推荐

