You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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)拆分命令,确保包含空格的内容能被完整获取
  • 错误反馈:捕获并打印异常信息,方便快速定位问题

使用方式

  1. 运行机器人后,终端会显示"输入命令:"提示
  2. 按照格式输入命令:send_something 1234567890 0987654321 这是要发送的内容
  3. 回车后即可完成消息发送

内容的提问来源于stack exchange,提问作者Joee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:54:23