我根据文档实现了以下Python函数https://github.com/tladesignz/bridgedb?tab=readme-ov-file#accessing-the-moat-interface:
import requests
MOAT_SERVER_URL = "https://bridges.torproject.org"
def request_bridges():
transports = ["obfs4"]
payload = {
"data": [{
"version": "0.1.0",
"type": "client-transports",
"supported": transports,
}]
}
headers = {
"Content-Type": "application/json"
}
response = requests.post(f"{MOAT_SERVER_URL}/moat/fetch", json=payload, headers=headers)
if response.status_code == 200:
json_data = response.json()
moat_data = json_data["data"][0] # <- Error
if "challenge" in moat_data:
# captcha_challenge(moat_data)
else:
pass # FIXME: Error Handling
else:
pass # FIXME: Error Handling
但是请求似乎不正确,因为 json_data 有以下值:
{
"errors":[
{
"id":"0",
"type":"",
"version":"0.1.0",
"code":415,
"status":"Unsupported Media Type",
"detail":""
}
]
}
代码应通过 BridgeDB 为用户请求桥,以便用户可以解析 moat_data 中应存在的验证码。 (就像 Tor 浏览器一样)
我已经尝试将有效负载作为数据而不是 json 发送:
import requests
MOAT_SERVER_URL = "https://bridges.torproject.org"
def request_bridges():
transports = ["obfs4"]
payload = {
"data": [{
"version": "0.1.0",
"type": "client-transports",
"supported": transports,
}]
}
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
response = requests.post(f"{MOAT_SERVER_URL}/moat/fetch", data=payload, headers=headers)
# Rest of the code
我还尝试使用 Curl 来检查 Python 用户代理是否可能被阻止:
curl -X POST -H "Content-Type: application/json" -d '{"data": [{"version": "0.1.0", "type": "client-transports", "supported": ["obfs4"]}]}' https://bridges.torproject.org/moat/fetch
但这一切都会返回与上面相同的 JSON 代码。
据我自己发现,BridgeDB 使用标准 https://jsonapi.org/ 规定了内容类型“application/vnd.api+json”。
以下是该函数的正确代码:
import requests
MOAT_SERVER_URL = "https://bridges.torproject.org"
def request_bridges():
transports = ["obfs4"]
payload = {
"data": [{
"version": "0.1.0",
"type": "client-transports",
"supported": transports,
}]
}
headers = {
"Content-Type": "application/vnd.api+json"
}
response = requests.post(f"{MOAT_SERVER_URL}/moat/fetch", json=payload, headers=headers)
if response.status_code == 200:
json_data = response.json()
moat_data = json_data["data"][0] # <- Error
if "challenge" in moat_data:
# captcha_challenge(moat_data)
else:
pass # FIXME: Error Handling
else:
pass # FIXME: Error Handling