Discord Bot 获取使用者输入的办法
on_message()使用 ctx 参数里的内容这是我目前使用的两种方法(或许还有其他方法)
一、@commands.Cog.listener() 的 on_message()
@commands.Cog.listener()async def on_message(self, msg): Help = ["Help", "help", "H", "h"] Commands = ["./help"] for words in Help: if msg.content.find(words) >= 0 and msg.author != self.bot.user and msg.content not in Commands: await msg.channel.send("pls input ***./help*** to see more information.") break
Q1 : 程式码功能说明:
A1 :
利用 on_message() 特性,侦测到 Help List 里面的任一个字串,便会发出「pls input ./help to see more information.」的讯息。
目的为製作 bot 引导程式。
Q2 : 程式码 on_message() 原理说明:
A2 :
on_message() 会在 bot 启动时,自动检测在所有频道内输入的所有文字,一直执行。
可以藉由此特性撰写侦测特定关键字的程式。
Q3 : 实际运行状况:
A3 :
例如 使用者A 想了解么用你的 bot ,于是他打出 「help」 这个讯息在有你 bot 的群组里。
这时程式便会侦测到讯息并跳出资讯,可以当成引导程式来提供使用 bot 的必要讯息。
小节结论
特点:具有全域性、不是可被使用者呼叫的程式优点:方便入手使用缺点:容易触发此程式,造成程式程序错乱二、@commands.command() 善用 ctx 参数
ctx,context,上下文。此参数包括了许多讯息。
其中,ctx.message 包括了使用者资讯,我们可以藉由此特性来撷取特定资讯。
使用者资讯:使用者输入的字串使用者发言所在频道的 id使用者的 id、名称...@commands.command(aliases = ["t-3"])async def test_3(self, ctx): def user_input() -> str: message = ctx.message.content # 取出完整的 input 内容,(去除指令名称 <test_3> + 一个空格即可) """ e.g. input : ./test_3 你好 index : 012345678 9 10 撷取字串中 char 9 10 为使用者输入 """ user_message = "" + message[9 : len(message)] return user_message await ctx.send(f"output : \n{user_input()}")
Q1 : 程式码功能说明:
A1 :
提取 ctx 中使用者的纯文字输入讯息
message = ctx.message.content去除 指令提示语(字串前面的 ./test_3 ),获取使用者真正的输入讯息。
user_message = "" + message[9 : len(message)]Q2 : 程式码 @commands.command() 原理说明:
A2 :
@commands.command() 会在 discord 被呼叫时才有所动作,是一种命令。
可以藉由此特性撰写更高自由度的程式。
Q3 : 实际运行状况:
A3 :
可以完美的撷取到使用者的输入,之后也可以藉由分割字串的动作完成子命令的规划。
小节结论
特点:具有局部性、可被使用者呼叫的程式优点:可用範围广、自由度大,也较实用缺点:需要有字串的前置处理动作,如果使用 aliases 简化命令的要多加注意备注:关于在 bot 上撰写自定义函数
可以先在本地先单纯用 python 做好,编译执行。
之后再放到 bot 里,只需要改输入、输出的部分。(记得注意变数的型态变化)