在Python中通过bridges.torproject.org使用/moat/fetch接口请求obfs4桥不起作用

问题描述 投票:0回答:1

我根据文档实现了以下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 代码。

python tor bridge
1个回答
0
投票

据我自己发现,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
© www.soinside.com 2019 - 2024. All rights reserved.