如何用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
相关产品推荐
相关产品推荐

