You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查询持有指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 07:06:01