web3.py如何通过用户名密码认证连接Ankr BSC API
web3.py连接带鉴权的Ankr BSC节点实现
核心问题根因
你当前连接返回False的核心原因是请求鉴权头格式不匹配,和节点地址、密钥有效性无关——你用requests直接请求能正常响应,已经可以证明地址、密钥本身没有问题。
你之前Node.js端能跑通的实现,走的是标准HTTP Basic Auth鉴权流程:将拼接后的用户名:密码字符串做Base64编码,统一放到Authorization请求头中,格式为Basic <Base64编码串>。你之前用requests能成功请求,本质是requests库的鉴权参数会自动按这个格式生成请求头;但你手写的Python web3.py代码,是将Username、Password拆为两个独立的请求头发送,这种非标准的头格式节点无法识别,自然会连接校验失败。
正确实现代码
import base64 from web3 import Web3 # 替换为个人实际配置 ANKR_BSC_RPC_URL = "你的Ankr BSC节点完整接入地址" ANKR_USER = "你的Ankr节点鉴权用户名" ANKR_PWD = "你的Ankr节点鉴权密码" # 按Basic Auth标准格式生成鉴权头 auth_content = f"{ANKR_USER}:{ANKR_PWD}" encoded_auth = base64.b64encode(auth_content.encode("utf-8")).decode("utf-8") web3 = Web3( Web3.HTTPProvider( ANKR_BSC_RPC_URL, request_kwargs={ "headers": { "Authorization": f"Basic {encoded_auth}" } } ) ) # 注意版本兼容:web3.py v6+ 使用is_connected(),旧版本(v5及更早)使用isConnected() print(web3.is_connected())
容易踩的细节问题
- 不要将用户名、密码拆分为两个独立的请求头字段,所有支持Basic Auth的节点均统一识别
Authorization头的固定格式 - 注意web3.py的版本方法名差异:v6版本对之前的驼峰命名方法做了废弃替换,沿用旧的
isConnected()也可能出现连接判断异常 - 如果通过WSS协议连接Ankr节点,鉴权头的生成逻辑完全一致,仅需将
HTTPProvider替换为WebsocketProvider,将生成好的鉴权头传入对应配置即可
内容的提问来源于stack exchange,提问作者Vic Rokx
相关产品推荐
相关产品推荐

