如何使用discord.py在Discord中主动发送消息(无需接收触发消息)
如何用discord.py让机器人自主发送消息?
别担心,discord.py完全支持机器人自主发送消息,我给你分享两种最常用的实现方式,你可以根据自己的需求来选:
1. 机器人上线时自动发消息到指定频道
这是最基础的场景,比如机器人启动后给管理员发个通知。操作步骤很简单:
首先你得拿到目标频道的ID——打开Discord设置里的「开发者模式」,右键你要发消息的频道,选择「复制ID」就行。
然后写代码:
import discord from discord.ext import commands # 初始化机器人,设置命令前缀(如果不需要命令可以去掉prefix,用Bot(intents=...)) bot = commands.Bot(command_prefix="!", intents=discord.Intents.default()) @bot.event async def on_ready(): print(f"已登录为 {bot.user}") # 把这里的数字换成你复制的频道ID target_channel_id = 123456789012345678 channel = bot.get_channel(target_channel_id) if channel: await channel.send("嘿!我已经上线待命啦😉") else: print("找不到指定频道,请检查ID是否正确,或者机器人是否有权限访问该频道") # 替换成你自己的机器人令牌,从Discord开发者平台获取 bot.run("YOUR_BOT_TOKEN_HERE")
这里的核心是用bot.get_channel()拿到频道对象,然后通过await channel.send()发送消息——因为discord.py是异步框架,所以必须加await哦。
2. 主动触发消息(定时/外部事件)
如果想让机器人在特定时间发消息,比如每天定时提醒,或者根据外部条件触发,可以用discord.py的tasks扩展来实现定时任务:
import discord from discord.ext import commands, tasks from datetime import datetime bot = commands.Bot(command_prefix="!", intents=discord.Intents.default()) # 定义一个每24小时执行一次的定时任务 @tasks.loop(hours=24) async def daily_check_in(): # 检查当前时间是否是早上9点整 current_time = datetime.now() if current_time.hour == 9 and current_time.minute == 0: channel = bot.get_channel(123456789012345678) if channel: await channel.send("各位早!今天也要加油干活呀💪") # 机器人启动后启动这个定时任务 @bot.event async def on_ready(): print(f"已登录为 {bot.user}") daily_check_in.start() bot.run("YOUR_BOT_TOKEN_HERE")
要是你需要通过外部脚本触发机器人发消息,只要确保机器人的事件循环在运行,然后用bot.loop.create_task(channel.send("消息内容"))来异步执行发送操作就行。
几个关键注意点
- 权限要到位:在服务器里给机器人的角色开启「发送消息」权限,如果要发带嵌入内容的消息,还要开启「嵌入链接」权限。
- Intents设置:discord.py v2.x版本必须设置Intents,
discord.Intents.default()已经包含了基础的频道访问权限,要是有特殊需求可以调整Intents的参数。 - 异步规则:所有发送消息的操作都必须是异步的,一定要加
await,不能直接调用send()方法,不然会报错。
内容的提问来源于stack exchange,提问作者tommyzan
相关产品推荐
相关产品推荐

