2

也许这是一个愚蠢的问题,但对于 web3.js,可以选择使用另一个 API 服务 Ankr,而不是 Infura。Ankr 允许访问费用较低的 BSC 网络。我似乎无法弄清楚如何通过 python web3 连接到 Ankr,因为它需要使用用户名和密码进行身份验证。当我运行 python 代码时它返回 false。我不确定我应该为 web3.py 使用哪些键,或者调用的语法可能是错误的,当我使用请求库时一切正常,所以地址不是问题。

# Python Code Unsuccessful 
Ankr_bsc_url = 'https............' 
web3 = Web3(Web3.HTTPProvider(Ankr_bsc_url, request_kwargs={'headers': {'Username': user, 'Password': password}}))

print(web3.isConnected())



//Node.js Code web3.js Works
const web3Provider = new Web3.providers.WebsocketProvider(url, {
 headers: { authorization: `Basic ${Buffer.from(`${user}:${password}`).toString('base64')}`}
})
4

2 回答 2

2

您应该将标题保存在 Session 对象上,并将其作为参数传递HTTPProvider

from web3 import Web3
import requests

s = requests.Session()
s.headers.update({'authorization': 'Basic ZZZZ'})

# HTTPProvider:
w3 = Web3(Web3.HTTPProvider('https://apis.ankr.com/XXXX/YYYY/binance/full/main', session=s))
w3.isConnected()

在我的情况下w3.isConnected返回True

于 2021-05-10T10:38:33.710 回答
2

当连接到需要用户名和密码的“基本身份验证”方法时,我发现下面的方法效果很好。

或者,使用“令牌”方法不需要用户名和密码,这也成功地为您提供了一个 Ankr API 端点。

from web3 import Web3
import requests
import base64

ankr_eth_url = 'INSERT_ANKR_API_ENDPOINT'
s = requests.Session()

# Make sure to use the Project Username and not your log-in username
# myProjectUsername:password
upass = "myProjectUsername:12345678".encode("ascii")
b64 = base64.b64encode(upass).decode("ascii")

s.headers.update({'Authorization': 'Basic ' + b64})

w3 = Web3(Web3.HTTPProvider(ankr_eth_url, session=s))
print(w3.isConnected())
于 2021-08-04T06:39:35.410 回答