【问题标题】:Socks proxy in tornado AsyncHttpClient龙卷风 AsyncHttpClient 中的 Socks 代理
【发布时间】:2014-04-05 15:12:25
【问题描述】:

如何在 tornado AsyncHttpClient 中使用 socks 代理? 我发现可以只使用 HTTP 代理而不更改库...

【问题讨论】:

    标签: python tornado


    【解决方案1】:

    根据文档,代理支持仅适用于AsyncHTTPClientlibcurl 实现。

    如果您深入了解您传递给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 代理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 1970-01-01
      相关资源
      最近更新 更多