如何让discord.py机器人支持在终端执行send_something命令?
实现Discord机器人同时支持Discord命令与终端命令
核心思路
- 抽离发送消息的核心逻辑为独立异步函数,供Discord命令和终端命令共同调用
- 借助
asyncio监听终端输入,解析命令参数后执行对应操作
完整代码示例
import discord from discord.ext import commands import asyncio # 配置机器人权限与前缀 intents = discord.Intents.default() intents.message_content = True bot = commands.Bot(command_prefix='!', intents=intents) # 封装核心发送逻辑 async def send_to_channel(bot, guild_id, channel_id, content): try: # 查找目标服务器 guild = bot.get_guild(int(guild_id)) if not guild: print(f"未找到ID为{guild_id}的服务器") return # 查找目标频道 channel = guild.get_channel(int(channel_id)) if not channel: print(f"服务器{guild.name}中未找到ID为{channel_id}的频道") return # 发送消息 await channel.send(content) print(f"消息已成功发送到{guild.name}的频道{channel.name}") except Exception as e: print(f"发送失败: {str(e)}") # Discord平台命令 @bot.command() async def send_something(ctx, guild_id: str, channel_id: str, *, content): await send_to_channel(bot, guild_id, channel_id, content) await ctx.send("消息已发送") # 终端命令监听任务 async def terminal_listener(): while True: # 在异步环境中处理终端输入,避免阻塞事件循环 command = await asyncio.to_thread(input, "输入命令: ") parts = command.split(maxsplit=3) # 校验命令格式 if len(parts) < 4: print("命令格式错误,请使用: send_something {服务器ID} {频道ID} {内容}") continue cmd_name, guild_id, channel_id, content = parts if cmd_name == "send_something": await send_to_channel(bot, guild_id, channel_id, content) else: print(f"未知命令: {cmd_name}") # 机器人启动后启动终端监听 @bot.event async def on_ready(): print(f'已登录为 {bot.user}') bot.loop.create_task(terminal_listener()) # 替换为你的机器人TOKEN并运行 bot.run("你的机器人TOKEN")
关键说明
- 逻辑复用:
send_to_channel函数统一处理消息发送的核心流程,避免冗余代码 - 异步兼容:用
asyncio.to_thread将同步的input操作转为异步,防止阻塞机器人的事件循环 - 参数容错:使用
split(maxsplit=3)拆分命令,确保包含空格的内容能被完整获取 - 错误反馈:捕获并打印异常信息,方便快速定位问题
使用方式
- 运行机器人后,终端会显示"输入命令:"提示
- 按照格式输入命令:
send_something 1234567890 0987654321 这是要发送的内容 - 回车后即可完成消息发送
内容的提问来源于stack exchange,提问作者Joee
相关产品推荐
相关产品推荐

