一、环境准备与依赖安装
元宇宙圈层运营的核心在于身份认证与权限管理。本指南将教你如何构建一个基于 Discord 的 Web3 钱包验证机器人,实现持有特定资产的用户自动获取核心圈层身份。首先需要准备本地开发环境。
请确保你的电脑已安装 Node.js,版本要求在 16.x 以上。如果尚未安装,请访问 https://nodejs.org/ 下载 LTS 版本并完成安装。安装完成后,打开终端(Terminal 或 CMD),输入以下命令检查版本:
```bash
node -v
```
确认环境无误后,新建一个项目文件夹 meta-bot,并进入该目录执行初始化命令:
```bash
mkdir meta-bot
cd meta-bot
npm init -y
```
接下来安装项目所需的核心依赖包,包括 Discord.js(SDK)、Ethers.js(Web3交互库)和 Dotenv(环境变量管理):
```bash
npm install discord.js ethers dotenv
```
二、Discord 应用配置与机器人创建
技术实现的第一步是在 Discord 官方后台创建应用并获取 Token。请打开浏览器访问 https://discord.com/developers/applications。
点击右上角的 New Application 按钮,在弹出的窗口中输入应用名称(例如 "MetaVerify"),点击 Create。进入应用详情页后,按照以下步骤操作:
- 在左侧菜单点击 Bot,点击 Reset Token 获取令牌。请务必立即复制并保存该 Token,它只显示一次。
- 在 Privileged Gateway Intents 部分,开启 Message Content Intent 和 Server Members Intent。这两个选项是机器人读取消息内容和管理成员权限的必要条件。
- 在左侧菜单点击 OAuth2 -> URL Generator。在 Scopes 选项中勾选 bot 和 applications.commands。在 Bot Permissions 中勾选 Administrator 以便机器人拥有最高权限。
- 复制页面底部的 Generated URL,粘贴到浏览器地址栏访问,在弹出的页面中选择你要运营的 Discord 服务器进行授权。
三、项目代码编写与逻辑实现
在项目根目录下创建一个名为 .env 的文件,用于存储敏感信息。请将上一步获取的 Token 填入,同时配置你的服务器 ID 和验证通过后的角色 ID:
```env
DISCORD_TOKEN=你的Discord_Bot_Token
CLIENT_ID=你的应用ID
GUILD_ID=你的服务器ID
ROLE_ID=验证通过后要赋予的角色ID
RPC_URL=https://eth.llamarpc.com
```

注意:RPC_URL 使用了公共节点,生产环境建议替换为 Infura 或 Alchemy 的私有节点。获取 GUILD_ID 和 ROLE_ID 的方法是开启 Discord 开发者模式,右键点击服务器或角色即可复制 ID。
在根目录下创建 index.js 文件,写入以下完整的逻辑代码。这段代码实现了监听指令、验证钱包地址格式、检查链上余额以及分配角色的功能。
```javascript
require('dotenv').config();
const { Client, GatewayIntentBits, EmbedBuilder } = require('discord.js');
const { ethers } = require('ethers');
// 初始化客户端,开启必要的 Intents
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent
]
});
const provider = new ethers.JsonRpcProvider(process.env.RPC_URL);
client.once('ready', () => {
console.log(`机器人已上线,登录为: ${client.user.tag}`);
});
// 监听消息事件
client.on('messageCreate', async (message) => {
// 忽略机器人自己的消息和非指令消息
if (message.author.bot) return;
if (!message.content.startsWith('!verify')) return;
// 获取钱包地址参数
const args = message.content.split(' ');
const walletAddress = args[1];
// 基础校验:是否提供了地址
if (!walletAddress) {
message.reply('请提供你的钱包地址。格式:`!verify 0x...`');
return;
}
// 格式校验:是否符合以太坊地址格式
if (!ethers.isAddress(walletAddress)) {
message.reply('❌ 无效的钱包地址格式,请检查后重试。');
return;
}
try {
// 发送处理中提示
const loadingMsg = await message.reply('⏳ 正在链上查询资产,请稍候...');
// 链上交互:查询余额
const balance = await provider.getBalance(walletAddress);
const balanceEth = ethers.formatEther(balance);
// 验证逻辑:这里设定余额大于 0 即通过(可根据需求改为合约NFT持有检测)
if (parseFloat(balanceEth) > 0) {
const role = message.guild.roles.cache.get(process.env.ROLE_ID);
if (!role) {
await loadingMsg.edit('❌ 配置错误:未找到指定的角色 ID。');
return;
}
// 分配角色
await message.member.roles.add(role);
const successEmbed = new EmbedBuilder()
.setColor('00FF00')
.setTitle('✅ 验证通过')
.setDescription(`欢迎加入核心圈层!\n检测到地址余额:${balanceEth} ETH`)
.setTimestamp();
await loadingMsg.edit({ content: null, embeds: [successEmbed] });
} else {
const failEmbed = new EmbedBuilder()
.setColor('FF0000')
.setTitle('❌ 验证失败')
.setDescription('未检测到符合条件的资产,无法加入圈层。')
.setTimestamp();
await loadingMsg.edit({ content: null, embeds: [failEmbed] });
}
} catch (error) {
console.error(error);
message.reply('查询链上数据时发生错误,请稍后重试。');
}
});
// 登录 Discord
client.login(process.env.DISCORD_TOKEN);
```
四、3D 入口页面构建(可选增强)
为了增加元宇宙的沉浸感,建议在圈层内搭建一个简单的 3D 入口页面。在根目录创建 index.html,使用 Three.js 快速生成一个可交互的 3D 立方体作为传送门。
```html
元宇宙圈层入口
点击立方体进入 Discord 圈层
```
五、部署运行与测试
代码编写完成后,回到终端,在项目根目录下运行以下命令启动机器人:
```bash
node index.js
```
终端显示 机器人已上线 即表示运行成功。此时进入你的 Discord 服务器,发送 !verify 0xYourAddress(替换为一个有余额的以太坊地址)。
机器人会立即回复一个查询状态,几秒钟后根据链上结果反馈验证通过或失败的信息。如果验证通过,你的用户名旁边将自动出现配置好的角色徽章。
对于 3D 入口页面,直接使用 VS Code 的 "Live Server" 插件打开 index.html,或者在本地启动一个简单的 HTTP 服务:
```bash
npx http-server
```
访问终端显示的本地地址,即可看到旋转的 3D 立方体,点击它将直接跳转回 Discord 社区,完成从 Web 端到社群的闭环引流。