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

如何用Python获取Solana钱包地址的指定SPL代币总余额

解决Solana SPL代币余额查询返回空结果的问题

原代码的核心问题

  • 变量名不匹配:定义了MY_WALLET_ADDRESS,但payload里引用的是未定义的MY_WALLET,这会直接导致请求逻辑错误(若你实际测试时已修正此问题,那第二个问题是关键)。
  • 查询过滤条件太宽泛:仅按programId过滤会返回钱包下所有SPL代币账户,但要精准查询指定代币,必须以代币的mint地址(即你提供的MY_TOKEN_ADDRESS)作为过滤条件,而非只过滤Token程序ID。

修正后的可运行代码

import requests
import os

# 从环境变量读取RPC地址,确保已正确配置Alchemy的主网/测试网节点地址
url = os.getenv("SOLANA_RPC_URL")

# 替换为实际的钱包地址和目标代币mint地址
MY_WALLET_ADDRESS = "你的钱包地址"
MY_TOKEN_ADDRESS = "目标代币的mint地址"
TOKEN_PROGRAM_ID = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"

payload = {
    "id": 1,
    "jsonrpc": "2.0",
    "method": "getTokenAccountsByOwner",
    "params": [
        MY_WALLET_ADDRESS,  # 修正变量名匹配问题
        {"mint": MY_TOKEN_ADDRESS},  # 改为按代币mint地址精准过滤
        {"encoding": "jsonParsed"},
    ],
}
headers = {"accept": "application/json", "content-type": "application/json"}

response = requests.post(url, json=payload, headers=headers)
data = response.json()

# 解析并输出可读的代币余额
if data.get("result", {}).get("value"):
    token_account = data["result"]["value"][0]
    # 获取最小单位余额和代币小数位
    raw_amount = token_account["account"]["data"]["parsed"]["info"]["tokenAmount"]["amount"]
    decimals = token_account["account"]["data"]["parsed"]["info"]["tokenAmount"]["decimals"]
    # 转换为用户可读的代币数量
    actual_amount = int(raw_amount) / (10 ** decimals)
    print(f"钱包{MY_WALLET_ADDRESS}的{MY_TOKEN_ADDRESS}代币余额:{actual_amount}")
else:
    print("该钱包未持有指定代币,或地址/节点配置有误")

额外排查要点

  • 确认RPC节点网络与代币所在网络一致:若代币在Solana主网,RPC地址必须对应主网节点;若在Devnet/Testnet,需切换为对应测试网的Alchemy节点地址。
  • 验证地址正确性:Solana地址为Base58格式,确保钱包地址和代币mint地址无拼写错误(地址大小写不敏感,但建议直接复制避免手动输入错误)。
  • 确认钱包持有该代币:可通过区块浏览器查询钱包地址,验证是否存在目标代币的关联账户。

内容的提问来源于stack exchange,提问作者Patrick Collins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:45:23