在Tornado AsyncHttpClient中使用Socks代理

3 投票
1 回答
2314 浏览
提问于 2025-04-18 01:29

我该如何在Tornado的AsyncHttpClient中使用socks代理?我发现只可以使用HTTP代理,而不需要更改库...

1 个回答

12

根据文档,代理支持只适用于libcurl实现的AsyncHTTPClient

如果你仔细看看你传给fetch()方法的HTTPRequest对象,你会发现有一个额外的prepare_curl_callback参数,这个参数可以在请求发送之前对PyCurl对象调用setopt

这里有一个简单的prepare_curl_callback函数的例子:

import pycurl

def prepare_curl_socks5(curl):
    curl.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)

还有一个完整的使用示例:

import tornado
import tornado.ioloop
import tornado.gen
import tornado.httpclient
import pycurl

def prepare_curl_socks5(curl):
    curl.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)

@tornado.gen.coroutine
def main():
    # set CurlAsyncHTTPClient the default AsyncHTTPClient
    tornado.httpclient.AsyncHTTPClient.configure(
        "tornado.curl_httpclient.CurlAsyncHTTPClient")

    http_client = tornado.httpclient.AsyncHTTPClient()
    http_request = tornado.httpclient.HTTPRequest(
        "http://jsonip.com",
        prepare_curl_callback=prepare_curl_socks5,
        proxy_host="localhost",
        proxy_port=9050
    )
    response = yield http_client.fetch(http_request)

    print response.body

if __name__ == '__main__':
    tornado.ioloop.IOLoop.instance().run_sync(main)

fetch()调用中添加的额外关键词参数prepare_curl_callback=prepare_curl_socks5就是这个“魔法”,它让CURL使用SOCKS5代理,而不是默认的HTTP代理。

撰写回答