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

如何实现可主动调用send_msg方法发送消息的Python Discord Bot

实现主动调用发送消息的Discord Python Bot

可行性说明

完全没问题!你想要的「仅在外部调用方法时才发送消息」的需求是可以实现的。不过要注意,Discord.py(Python生态里最常用的Discord Bot库)是基于异步事件循环的,不能像普通同步类那样直接实例化就调用方法,得确保Bot客户端已经完成登录、连接到Discord服务器,并且事件循环在后台正常运行。

完整实现代码

下面是符合你需求的代码实现,包含Bot类和调用示例:

DiscordBot类实现

import discord
import asyncio

class DiscordBot:
    def __init__(self, token: str):
        self.token = token
        # 初始化客户端,需要指定Intents(Discord要求的权限设置)
        self.client = discord.Client(intents=discord.Intents.default())
        # 用一个事件标记客户端是否已经就绪
        self._client_ready = asyncio.Event()

        # 绑定on_ready事件,当Bot登录成功后触发
        @self.client.event
        async def on_ready():
            print(f"Bot已登录,账号:{self.client.user}")
            self._client_ready.set()  # 标记客户端就绪

        # 获取当前事件循环,把Bot启动任务放到后台运行
        self.loop = asyncio.get_event_loop()
        self.loop.create_task(self.client.start(self.token))

    async def send_msg(self, channel_id: int, message: str):
        # 先等待客户端就绪,避免还没登录就发消息
        await self._client_ready.wait()
        # 根据频道ID获取频道对象
        channel = self.client.get_channel(channel_id)
        if not channel:
            raise ValueError(f"找不到ID为{channel_id}的频道")
        # 发送消息
        await channel.send(message)

    def sync_send_msg(self, channel_id: int, message: str):
        # 提供同步调用的接口,方便在普通同步代码里使用
        self.loop.run_until_complete(self.send_msg(channel_id, message))

外部调用示例

# 在你的其他脚本中调用
if __name__ == "__main__":
    # 替换成你的Bot Token
    my_notifier = DiscordBot("YOUR_DISCORD_BOT_TOKEN")
    
    # 等待几秒确保Bot完成登录(或者用更优雅的异步等待方式)
    import time
    time.sleep(3)

    # 方式1:同步调用(适合普通同步代码)
    my_notifier.sync_send_msg(123456789, "Hello! 这是同步调用发送的消息")

    # 方式2:异步调用(如果你的主程序是异步的)
    # asyncio.run(my_notifier.send_msg(123456789, "Hello! 这是异步调用发送的消息"))

关键注意事项

  • Intents设置:必须在Discord开发者后台的Bot页面开启对应的Intents(至少开启default权限),否则Bot无法获取频道信息或发送消息。
  • Bot权限:确保你的Bot已经被邀请到目标服务器,并且拥有发送消息的权限(邀请时要勾选Send Messages等相关权限)。
  • 异步与同步:如果你的主程序是异步的,推荐直接调用send_msg异步方法;如果是同步程序,用sync_send_msg接口更方便。
  • 事件循环管理:Bot启动后会在后台运行事件循环,不要手动关闭事件循环,否则Bot会离线。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:27:52