如何从BscScan获取智能合约余额并在网站自动刷新展示
实现从BscScan获取智能合约余额并自动刷新的方案
1. 准备工作
- 注册BscScan账号并生成免费API密钥(免费版每日调用上限10万次,足够新手测试使用)
- 明确查询目标:是合约自身的BNB余额,还是合约持有的某ERC20代币余额
2. 调用BscScan API获取余额
情况1:查询合约的BNB余额
API请求参数:
- 端点:
https://api.bscscan.com/api - 必填参数:
module=accountaction=balanceaddress=目标合约地址tag=latestapikey=你的API密钥
情况2:查询合约持有的ERC20代币余额
API请求参数:
- 端点:
https://api.bscscan.com/api - 必填参数:
module=accountaction=tokenbalancecontractaddress=代币合约地址address=目标合约地址tag=latestapikey=你的API密钥
注意:API返回的是最小单位余额(如BNB的wei、ERC20代币的最小刻度),需要除以10^decimals转换为可读格式。ERC20代币的decimals值可通过BscScan代币详情页查询。
3. 前端完整实现代码(原生JS)
以下代码包含两种余额查询、格式转换及自动刷新功能,直接复制即可测试:
<!DOCTYPE html> <html> <head> <title>合约余额监控</title> <style> .balance-card { margin: 20px; padding: 15px; border: 1px solid #eee; border-radius: 8px; } .balance-value { font-size: 24px; font-weight: bold; color: #2c3e50; } </style> </head> <body> <div class="balance-card"> <h3>合约BNB余额</h3> <div id="bnb-balance" class="balance-value">加载中...</div> </div> <div class="balance-card"> <h3>合约USDT余额</h3> <div id="usdt-balance" class="balance-value">加载中...</div> </div> <script> // 配置信息 const API_KEY = '你的BscScan API密钥'; const TARGET_CONTRACT = '要查询的合约地址'; const USDT_CONTRACT = '0x55d398326f99059ff775485246999027b3197955'; // BSC链USDT合约地址 const REFRESH_INTERVAL = 30000; // 自动刷新间隔(30秒) // 转换最小单位余额为可读格式 function formatBalance(rawBalance, decimals) { return (rawBalance / Math.pow(10, decimals)).toFixed(4); } // 获取合约BNB余额 async function fetchBNBBalance() { try { const response = await fetch(`https://api.bscscan.com/api?module=account&action=balance&address=${TARGET_CONTRACT}&tag=latest&apikey=${API_KEY}`); const data = await response.json(); if (data.status === '1') { const formatted = formatBalance(parseInt(data.result), 18); // BNB的decimals为18 document.getElementById('bnb-balance').textContent = `${formatted} BNB`; } else { document.getElementById('bnb-balance').textContent = '查询失败'; } } catch (error) { document.getElementById('bnb-balance').textContent = '网络错误'; } } // 获取合约USDT余额 async function fetchUSDTBalance() { try { const response = await fetch(`https://api.bscscan.com/api?module=account&action=tokenbalance&contractaddress=${USDT_CONTRACT}&address=${TARGET_CONTRACT}&tag=latest&apikey=${API_KEY}`); const data = await response.json(); if (data.status === '1') { const formatted = formatBalance(parseInt(data.result), 6); // USDT的decimals为6 document.getElementById('usdt-balance').textContent = `${formatted} USDT`; } else { document.getElementById('usdt-balance').textContent = '查询失败'; } } catch (error) { document.getElementById('usdt-balance').textContent = '网络错误'; } } // 初始化查询 fetchBNBBalance(); fetchUSDTBalance(); // 设置自动刷新 setInterval(() => { fetchBNBBalance(); fetchUSDTBalance(); }, REFRESH_INTERVAL); </script> </body> </html>
4. 常见问题排查
- API调用失败:检查API密钥是否正确、是否超出调用次数限制、目标地址是否为BSC链有效地址
- 余额显示异常:确认合约确实持有对应资产,ERC20代币的
decimals值是否设置正确 - 跨域限制:本地文件(
file://协议)运行会触发跨域,建议用本地服务器(如python -m http.server)测试 - 自动刷新失效:检查浏览器控制台报错,确认刷新间隔设置合理(避免过短触发BscScan限流)
内容的提问来源于stack exchange,提问作者JosephResse
相关产品推荐
相关产品推荐

