Discord机器人被邀入服务器后自动发感谢消息的实现咨询
解决Discord机器人被邀请后自动发感谢消息的可行方案
哥们,我太懂你这种头疼了——旧版Discord库的方案全失效,想让机器人被拉进服务器后自动给主人发感谢消息却卡壳。我特意整理了几个适配新版库的可行办法,你照着来绝对能搞定:
一、用新版Discord.py的on_guild_join事件(最省心)
新版Discord.py把事件逻辑捋得很清楚了,直接监听机器人加入服务器的事件,然后找到服务器所有者发消息就行。注意一定要开对权限和意图!
import discord from discord.ext import commands # 配置必要的意图,没开的话根本监听不到事件 intents = discord.Intents.default() intents.guilds = True # 必须开启,才能收到服务器相关事件 intents.messages = True # 确保机器人能发消息 bot = commands.Bot(command_prefix='!', intents=intents) @bot.event async def on_guild_join(guild): # 拿到服务器所有者 owner = guild.owner if owner: try: # 优先发私信,更礼貌 await owner.send(f"感谢邀请我加入**{guild.name}**!有任何问题随时喊我,输入`!help`就能看我的功能哦~") except discord.Forbidden: # 怕用户关了陌生人私信,那就退而求其次找个能发消息的频道 for channel in guild.text_channels: if channel.permissions_for(guild.me).send_messages: await channel.send(f"@{owner.mention} 感谢邀请我加入**{guild.name}**!没法给你发私信,就在这儿跟你说啦😎") break bot.run('你的机器人令牌')
划重点:去Discord开发者门户的机器人设置里,一定要开启Server Members Intent,不然guild.owner可能拿不到,事件也监听不了!
二、精准追踪邀请人(进阶玩法)
如果你想给实际邀请机器人的人发消息,而不是只给服务器所有者,那就结合invite_create事件缓存邀请记录,再在加入服务器时匹配:
# 先整个缓存存邀请记录 invite_cache = {} @bot.event async def on_invite_create(invite): # 把服务器ID和邀请人ID绑定存起来 invite_cache[invite.guild.id] = invite.inviter.id @bot.event async def on_guild_join(guild): inviter_id = invite_cache.get(guild.id) if inviter_id: inviter = guild.get_member(inviter_id) if inviter: try: await inviter.send(f"嘿,感谢你邀请我加入**{guild.name}**!以后有需求随时吩咐~") except discord.Forbidden: # 同样处理发不了私信的情况 for channel in guild.text_channels: if channel.permissions_for(guild.me).send_messages: await channel.send(f"@{inviter.mention} 感谢邀请我!没法给你发私信,就在这儿道谢啦🥳") break # 用完就删缓存,避免重复触发 del invite_cache[guild.id]
注意:这个得开Invites Intent,而且只对新生成的邀请链接有效,旧链接可能追踪不到邀请人哦。
三、其他库的适配思路(比如Nextcord/Pycord)
如果你用的是Nextcord、Pycord这类Discord.py的衍生库,逻辑其实大同小异:
- 先去开发者平台开好对应的意图
- 监听
on_guild_join事件 - 找到目标用户(所有者/邀请人)发消息,记得处理发不了私信的异常
必看的关键细节
- 权限给够:机器人得有发消息的权限,还有查看服务器成员的权限,不然要么拿不到用户,要么发不出消息
- 意图别忘开:这是很多人踩坑的点!开发者平台里的
Server Members Intent和Guilds Intent必须勾上 - 异常要处理:很多用户会关闭陌生人私信,一定要加个 fallback 方案,不然机器人会报错
内容的提问来源于stack exchange,提问作者Mateo Elias
相关产品推荐
相关产品推荐

