在浏览器中使用隧道代理

  1. 配置代理服务器为:dyn.horocn.com,代理端口为:50000
  2. 任意打开一个网址,比如:https://proxy.horocn.com/api/ip
  3. 在弹出的验证窗口中,输入用户名和密码。

备注:订单号即是用户名。

在程序中使用隧道代理

目前,我们使用的是 HTTP 基本认证,在发送请求中,添加Proxy-Authorization头部,值为:Basic b64encode("username:password")

比如,你的用户名是:joker,密码为:12345。将用户名和密码拼接,得到:joker:12345。接着,将其用Base64编码,得到:am9rZXI6MTIzNDU=

最终,添加一个Proxy-Authorization头部,值为:Basic am9rZXI6MTIzNDU=

示例代码

import java.io.IOException;
import java.net.Authenticator;
import java.net.InetSocketAddress;
import java.net.PasswordAuthentication;
import java.net.Proxy;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;


public class ProxyDemo {
    // 代理隧道验证信息
    private final static String ProxyUser = "STZT160xxxxxx";
    private final static String ProxyPass = "password";

    // 代理服务器
    private final static String ProxyHost = "dyn.horocn.com";
    private final static Integer ProxyPort = 50000;

    private static void getUrlProxyContent(String url) {
        Authenticator.setDefault(new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(ProxyUser, ProxyPass.toCharArray());
            }
        });

        Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ProxyHost, ProxyPort));

        try {
            Document doc = Jsoup.connect(url).timeout(3000).header(ProxyHeadKey, ProxyHeadVal).proxy(proxy).get();

            if (doc != null) {
                System.out.println(doc.body().html());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        // 要访问的目标页面
        String targetUrl = "https://proxy.horocn.com/api/ip";

        getUrlProxyContent(targetUrl);
    }
}
from urllib import request

# 要访问的目标页面
targetUrl = "https://proxy.horocn.com/api/ip"

# 代理服务器
proxyHost = "dyn.horocn.com"
proxyPort = "50000"

# 代理隧道验证信息
proxyUser = "STZT160xxxxxx"
proxyPass = "password"

proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
    "host": proxyHost,
    "port": proxyPort,
    "user": proxyUser,
    "pass": proxyPass,
}

proxy_handler = request.ProxyHandler({
    "http": proxyMeta,
    "https": proxyMeta,
})

opener = request.build_opener(proxy_handler)

request.install_opener(opener)
resp = request.urlopen(targetUrl).read()

print(resp)
<?php

// 要访问的目标页面
$targetUrl = "https://proxy.horocn.com/api/ip";

// 代理服务器
$proxyServer = "http://dyn.horocn.com:50000";

// 隧道身份信息
// 这里的用户名,等于订单号
$proxyUser = "STZT160xxxxxx";
$proxyPass = "password";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $targetUrl);

curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

// 设置代理服务器
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt($ch, CURLOPT_PROXY, $proxyServer);

// 设置隧道验证信息
curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_PROXYUSERPWD, "{$proxyUser}:{$proxyPass}");


curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);

curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$result = curl_exec($ch);

curl_close($ch);

var_dump($result);
const http = require("http");
const url  = require("url");

// 要访问的目标页面
const targetUrl = "https://proxy.horocn.com/api/ip";

const urlParsed   = url.parse(targetUrl);

// 代理服务器
const proxyHost = "dyn.horocn.com";
const proxyPort = "50000";

// 代理隧道验证信息
const proxyUser = "STZT160xxxxxx";
const proxyPass = "password";

const base64    = new Buffer(proxyUser + ":" + proxyPass).toString("base64");

const options = {
    host    : proxyHost,
    port    : proxyPort,
    path    : targetUrl,
    method  : "GET",
    headers : {
        "Host"                : urlParsed.hostname,
        "Proxy-Authorization" : "Basic " + base64
    }
};

http
    .request(options, function(res{
        console.log("got response: " + res.statusCode);
    })
    .on("error"function(err{
        console.log(err);
    })
    .end()
;            
// 要访问的目标页面
string targetUrl = "https://proxy.horocn.com/api/ip";

// 代理服务器
string proxyHost = "http://dyn.horocn.com";
string proxyPort = "50000";

// 代理隧道验证信息
string proxyUser = "STZT160xxxxxx";
string proxyPass = "password";

// 设置代理服务器
var proxy         = new WebProxy();
proxy.Address     = new Uri(string.Format("{0}:{1}", proxyHost, proxyPort));
proxy.Credentials = new NetworkCredential(proxyUser, proxyPass);

ServicePointManager.Expect100Continue = false;

var request = WebRequest.Create(targetUrl) as HttpWebRequest;

request.AllowAutoRedirect = true;
request.KeepAlive = true;
request.Method    = "GET";
request.Proxy     = proxy;


using (var response = request.GetResponse() as HttpWebResponse)
using (var sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
    string htmlStr = sr.ReadToEnd();
}                
$ curl --proxy-header "Proxy-Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=" --proxy http://dyn.horocn.com:50000 https://proxy.horocn.com/api/ip

注意

  1. Java8以上版本,请在运行的时候,加上-Djdk.http.auth.tunneling.disabledSchemes=""。具体请参考:Unable to tunnel through proxy since Java 8 Update 111

转载请注明