在discord.js中如何向非公会内用户发送公会邀请
问题核心原因
- 现有代码未正确获取目标用户的
User实例:你定义的invited仅存储了用户输入的字符串,message.invited也不是Discord.js的原生属性,根本无法调用发送消息的方法 - Discord平台有原生反垃圾限制:机器人无法向未和它处于任何共同服务器、或是开启了陌生人私信屏蔽的用户直接发送私信,该限制无绕过方案,需要做容错处理
修正实现方案
你需要先解析获取到目标用户的实例,再尝试发送私信,发送失败时返回邀请链接给命令触发者手动转发即可,修正后的参考代码如下(适配discord.js v14版本):
if (!args[0]) return message.reply("请输入要邀请的用户,示例:funny#6942"); // 生成单用途服务器邀请 message.channel.createInvite({ unique: true, maxUses: 1, maxAge: 8 * 60 * 60 * 1000 // 有效期8小时,原代码计算错误仅为8分钟,已修正 }) .then(async invite => { try { // 拉取目标用户实例,支持用户ID或者完整用户名#标签格式 const targetUser = await message.client.users.fetch(args[0], { force: true }); // 尝试发送私信 await targetUser.send(`你被邀请加入 ${message.guild.name},邀请链接:https://discord.gg/${invite.code}`); message.reply(`已成功向 ${targetUser.tag} 发送邀请`); } catch (err) { // 发送失败时返回邀请链接给触发者手动转发 message.reply(`无法向目标用户发送私信,你可以手动将以下单用途邀请链接转发给对方:https://discord.gg/${invite.code}`); } });
额外注意事项
- 你需要在Discord开发者后台给机器人开启
GUILD_MEMBERS、MESSAGE_CONTENT两个权限意图,否则无法正常拉取用户信息和读取命令参数 - 如果目标用户确实和机器人没有共同服务器,手动转发邀请是目前唯一可行的实现方案
内容的提问来源于stack exchange,提问作者Grom Thunderfists
相关产品推荐
相关产品推荐

