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

