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

如何在PyScript中向MetaMask发送eth_requestAccounts请求?

在PyScript中实现MetaMask地址获取功能

原代码的问题

  • 语法错误:向window.ethereum.request传递的字典中,键名method未加引号,Python会将其视为变量而非字符串键
  • 多余的pyfetch调用:window.ethereum.request直接返回MetaMask授权的账户列表,无需通过pyfetch处理(pyfetch用于HTTP请求,和MetaMask的交互是Web3 Provider API,不属于HTTP请求范畴)

修正后的PyScript代码

from js import document, alert, window, console
from pyodide import create_proxy

document.getElementById("status").innerHTML = "点击按钮检测MetaMask"

async def Check_if_Metamask(param):
    if not window.ethereum:
        alert("请安装MetaMask钱包")
        document.getElementById("status").innerHTML = "未检测到MetaMask"
        return
    
    document.getElementById("status").innerHTML = "已检测到MetaMask"
    document.getElementById("msg").innerHTML = "正在获取授权地址..."
    
    try:
        # 调用MetaMask授权API,注意字典键名需用字符串
        accounts = await window.ethereum.request({
            "method": "eth_requestAccounts"
        })
        # accounts是数组,第一个元素即为授权的地址
        address = accounts[0]
        document.getElementById("msg").innerHTML = f"授权地址:{address}"
        console.log("获取到的地址:", address)
    except Exception as e:
        document.getElementById("msg").innerHTML = "授权被取消或出错"
        console.error("请求出错:", e)

def setup():
    click_proxy = create_proxy(Check_if_Metamask)
    e = document.getElementById("submit-button2")
    e.addEventListener("click", click_proxy)

setup()

对应的HTML代码(核心结构无需修改,确保PyScript路径正确即可)

<html>
  <head>
    <title>MetaMask地址获取</title>
    <link rel="stylesheet" href="./buttoncss.css" />
    <script defer src="../Illustration 2/pyscript.js"></script>
  </head>

  <body>
    <div id="status">Check Metamask!</div>
    <br />
    <div id="msg"></div>
    <br />
    <button class="button-17" id="submit-button2">获取地址</button>

    <py-script src="./code.py"> </py-script>
  </body>
</html>

扩展:获取账户余额

如果需要获取该地址的余额,可以在获取地址后调用eth_getBalance方法,示例代码如下:

# 在获取address之后添加以下代码:
balance_hex = await window.ethereum.request({
    "method": "eth_getBalance",
    "params": [address, "latest"]
})
# 将十六进制余额转换为以太币(1 ETH = 10^18 Wei)
balance_eth = int(balance_hex, 16) / 10**18
document.getElementById("msg").innerHTML += f"<br>账户余额:{balance_eth:.4f} ETH"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 01:10:36