如何查询持有指定token的用户钱包信息 基于Python实现Discord bot发持币标签
实现方案:Python + Discord Bot 自动校验持币并发放持币者标签
前置依赖
先安装需要的第三方库:
discord.py:用于实现Discord机器人的基础功能web3.py:用于EVM兼容链(以太坊、BSC、Polygon等)的链上数据查询,若你发行的是其他公链代币,替换为对应公链的Python SDK即可
pip install discord.py web3
核心实现代码
以下示例默认你发行的是EVM链上的ERC20标准代币:
import discord from web3 import Web3 from discord.ext import commands # -------------------------- 配置项 -------------------------- DISCORD_BOT_TOKEN = "你的Discord机器人令牌" RPC_URL = "对应公链的RPC节点地址" TOKEN_CONTRACT_ADDRESS = "你发行的代币合约地址" HOLDER_ROLE_ID = 123456789 # 替换为你的服务器内持币者标签的ID,整数类型 MIN_TOKEN_REQUIRED = 1 # 用户需要持有的最低代币数量,可自定义 TOKEN_DECIMALS = 18 # 你的代币的精度,按实际情况调整 # ----------------------------------------------------------- # 初始化实例 intents = discord.Intents.default() intents.members = True bot = commands.Bot(command_prefix="!", intents=intents) w3 = Web3(Web3.HTTPProvider(RPC_URL)) # ERC20代币最小ABI,仅用于查询余额 ERC20_ABI = [ { "constant": True, "inputs": [{"name": "_owner", "type": "address"}], "name": "balanceOf", "outputs": [{"name": "balance", "type": "uint256"}], "payable": False, "stateMutability": "view", "type": "function" } ] token_contract = w3.eth.contract(address=w3.to_checksum_address(TOKEN_CONTRACT_ADDRESS), abi=ERC20_ABI) # 用户提交钱包地址触发校验的指令 @bot.command() async def verify(ctx, wallet_address: str): # 校验钱包地址格式 if not w3.is_address(wallet_address): await ctx.send("输入的钱包地址格式无效,请检查后重试", ephemeral=True) return checksum_address = w3.to_checksum_address(wallet_address) # 查询代币余额 try: raw_balance = token_contract.functions.balanceOf(checksum_address).call() token_balance = raw_balance / 10**TOKEN_DECIMALS except Exception as e: await ctx.send("链上数据查询失败,请稍后重试", ephemeral=True) return # 校验持币标准 if token_balance >= MIN_TOKEN_REQUIRED: holder_role = ctx.guild.get_role(HOLDER_ROLE_ID) await ctx.author.add_roles(holder_role) await ctx.send(f"校验通过!已为你发放持币者标签,当前持有量:{token_balance:.2f}", ephemeral=True) else: await ctx.send(f"校验失败,当前持有量为{token_balance:.2f},未达到最低持有要求", ephemeral=True) @bot.event async def on_ready(): print(f"机器人启动成功,当前登录账号:{bot.user}") if __name__ == "__main__": bot.run(DISCORD_BOT_TOKEN)
注意事项
- 必须在Discord开发者后台开启
Server Members Intent权限,且给机器人分配身份组管理权限,否则无法正常给用户发放标签 - RPC节点可以选择公链提供的公共节点,也可以自行部署节点避免请求频率限制
- 若需要避免用户冒用他人钱包地址领标签,可以增加钱包签名校验逻辑:要求用户用提交的钱包地址签名一段随机字符串,校验签名合法性后再发放标签
- 如果你的代币部署在非EVM公链,只需要替换对应链的余额查询逻辑即可,Discord机器人部分的代码不需要调整
内容的提问来源于stack exchange,提问作者Usama Khalid
相关产品推荐
相关产品推荐

