QQ群:424699147 点此加入蚂蚁代理官方QQ群

动态代理服务器

自建高质量代理服务器,稳定在线,随机动态IP
专为爬虫采集类业务定制
什么是动态代理

先说说我们常用的代理,比如现在有一个代理:220.101.1.51:9064,这时候用这个代理去访问百度的话,识别出来的IP就是220.101.1.51, 意思就是,百度识别出的代理跟你使用的代理是一致的,要想换IP的话就得不停的换代理。

动态代理相比于上面的代理,使用上没有区别,比如你现在使用了一个动态代理:220.102.2.108:9064,这时你用这个动态代理去访问百度, 识别出来的IP并不是220.102.2.108,而是一个随机的IP,每次都会变化,也就是说,你只需设置一次代理,就可以得到随机变化的IP,免去频繁更换代理的麻烦,示意图如下:

传统代理与动态代理流程比较

相信做过数据采集的人都知道,用同一个IP频繁抓取一个网站,在很大程度上会被该网站屏蔽,一般都会采取更换代理的策略,但是目前网上扫描的代理并不稳定,每次使用前需进行验证, 然并卵,还是会不时出现各种连接不上的情况。这里以爬虫采集程序为例:

接入文档

为了保证代理服务器的稳定运行,蚂蚁动态代理服务器需要对每一个代理使用者进行身份认证,可选的认证方式为:

绑定IP认证,验证代理使用者的IP地址,适合有固定IP的用户

APPKEY认证,在请求头中加入"Proxy-Authorization"字段进行验证,适合需要对请求过程进行控制的用户

如:Proxy-Authorization:MYH-AUTH-MD5 sign=83EAA31C85F9DDE368F5266A90087488&app_key=12345678&timestamp=2015-12-02 15:32:58

参数名 必传 说明
app_keyY

app_key=XXXXXXXX

验证代理使用者的身份,请联系群主进行购买

timestampY

timestamp=2015-12-06 13:52:03

请求时间戳,格式为yyyy-mm-dd HH:mm:ss,24小时制,误差不能大于10分钟,注意这里采用东8区时间,比如程序部署在国外服务器时,需进行时区转换

enable-simulateN

enable-simulate=true | false

是否智能模拟请求头信息,默认为true,当某些请求头缺失时,智能自动添加,受影响的请求头如下:

User-Agent,Accept,Accept-Language,Accept-Encoding,DNT,Connection,Pragma,Cache-Control,Host,Referer

random-useragentN

random-useragent=disabled | pc | mobile , 在enable-simulate为true时生效

是否使用随机User-Agent,默认系统会自动判断,如果请求头中User-Agent字段为空或者其值不为普通浏览器应有的值(Python-urllib/2.0,Apache-HttpClient/release (java 4.0)...等等),这时系统会强行替换

如果使用了随机User-Agent,在本次响应中会加入名为X-User-Agent的字段,比如:
X-User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) Chrome/47

clear-cookiesN

clear-cookies=true | false

是否清除请求头中的cookie,默认为false

decode-chunkN

decode-chunk=true | false

如果你的程序不支持chunked响应,可以偿试使用该参数,这样代理服务器会自动解析chunked响应,但是这会影响效率,默认系统会自动判断,比如请求协议为 HTTP/1.0 时会强行处理

line-location  (待开放)N

line-location=location-id

使用指定地区的IP进行请求

with-transaction  

(独立收费项)

N

with-transaction=[数字编号:1-购买数量]

有些时候,需要将连续的多个请求使用同一个IP进行发送,比如【登陆账号,发贴,回复】等这一连续动作

当请求中传递了该参数时,系统将会申请锁定一个IP,所有传递了同一个编号的请求,将会分配到同一个IP

资源的锁定时间默认最长为30秒,如果在30秒内没有使用release-transaction参数进行释放,系统将强行自动释放。如需更长的锁定时间,可联系我们进行定制。

release-transaction  N

release-transaction=[数字:1-购买数量]

释放被锁定的资源,一般把with-transaction和release-transaction同时使用,系统会优先执行release-transaction操作。

比如现在有一个连续操作分为3步,在第一步请求时,同时传递with-transaction和release-transaction,表示释放上一次的,并锁定新的IP;在后面两步时只需传递with-transaction即可

timeout  N

timeout=5000(单位ms)

希望代理服务器在读取目标服务器数据时,多长时间超时,你自己程序的超时设置应稍大于该值,默认值为10秒,最长100秒。

retrypost  N

retrypost= false | true

代理服务器对于get请求默认具有重试机制,即当对方服务器响应缓慢时,自动选择其它线路进行重试。

但是对于post请求,为了防止数据重复提交,例登陆,注册之类的请求,默认不进行重试。

如果您提交的数据无关紧要,比如只是一次post提交的查询,可以使用该参数开启重试机制,以提高响应速度。

signY参数签名,防止您的app_key被盗用,签名的生成方法请见下文

参数 sign 签名生成规则

1. 将上面表格中除sign外的所有使用到的参数按照参数名的字母先后顺序排序
    如:将foo=1,bar=2,baz=3,app_key=123456 排序为 app_key=123456,bar=2,baz=3,foo=1
2. 将排序后的参数表进行字符串连接
    如:app_key123456bar2baz3foo1
3. 将app_secret拼接到第2步中参数字符串的开头和结尾
    如:app_secretapp_key123456bar2baz3foo1app_secret
4. 对第3步中的字符串进行MD5计算,并转换为全大写形式后即获得签名串
    如:83EAA31C85F9DDE368F5266A90087488

APPKEY认证代码示例

示例代码仅供参考

						    	
// 定义申请获得的appKey和appSecret
String appkey = "XXXXXXXX";
String secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
 
// 创建参数表
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("app_key", appkey);
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
format.setTimeZone(TimeZone.getTimeZone("GMT+8"));//使用中国时间,以免时区不同导致认证错误
paramMap.put("timestamp", format.format(new Date()));
 
// 对参数名进行排序
String[] keyArray = paramMap.keySet().toArray(new String[0]);
Arrays.sort(keyArray);
 
// 拼接有序的参数名-值串
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(secret);
for(String key : keyArray){
    stringBuilder.append(key).append(paramMap.get(key));
}
     
stringBuilder.append(secret);
String codes = stringBuilder.toString();
         
// MD5编码并转为大写, 这里使用的是Apache codec
String sign = org.apache.commons.codec.digest.DigestUtils.md5Hex(codes).toUpperCase();

paramMap.put("sign", sign);

// 拼装请求头Proxy-Authorization的值,这里使用 guava 进行map的拼接
String authHeader = "MYH-AUTH-MD5 " + Joiner.on('&').withKeyValueSeparator("=").join(paramMap);

System.out.println(authHeader);

//接下来使用蚂蚁动态代理进行访问
   
//这里以jsoup为例,将authHeader放入请求头中即可
//原版的jsoup设置代理不方便,这里使用E-lai提供的修改版(https://github.com/E-lai/jsoup-proxy)
//注意authHeader必须在每次请求时都重新计算,要不然会因为时间误差而认证失败
Document doc = Jsoup.connect("http://1212.ip138.com/ic.asp").proxy("test.proxy.mayidaili.com", 8123, null).header("Proxy-Authorization", authHeader).get();
...		

import hashlib
import time
import urllib2

#请替换appkey和secret
appkey = "XXXXXXXX"
secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

paramMap = {
    "app_key": appkey,
    "timestamp": time.strftime("%Y-%m-%d %H:%M:%S")  #如果你的程序在国外,请进行时区处理
}
#排序
keys = paramMap.keys()
keys.sort()
        
codes= "%s%s%s" % (secret,str().join('%s%s' % (key, paramMap[key]) for key in keys),secret)

#计算签名
sign = hashlib.md5(codes).hexdigest().upper()

paramMap["sign"] = sign

#拼装请求头Proxy-Authorization的值
keys = paramMap.keys()
authHeader = "MYH-AUTH-MD5 " + str('&').join('%s=%s' % (key, paramMap[key]) for key in keys)
    
print authHeader

#接下来使用蚂蚁动态代理进行访问

proxy_handler = urllib2.ProxyHandler({"http" : 'http://test.proxy.mayidaili.com:8123'})
opener = urllib2.build_opener(proxy_handler)

request = urllib2.Request('http://1212.ip138.com/ic.asp')

//将authHeader放入请求头中即可,注意authHeader必须在每次请求时都重新计算,要不然会因为时间误差而认证失败  
request.add_header('Proxy-Authorization', authHeader)

response = opener.open(request)  

print response.read()

感谢网友 Terry 150***157 提供Python3示例


# Python 3.x

import hashlib
import time
import requests

# 找群主购买 my_app_key, myappsecret, 以及蚂蚁代理服务器的 mayi_url 地址和 mayi_port 端口
my_app_key = "xxxx"
app_secret = "xxxxxxxxxxxxxxxxxxx"
mayi_url = '127.0.0.1'
mayi_port = '8123'

# 蚂蚁代理服务器地址
mayi_proxy = {'http': 'http://{}:{}'.format(mayi_url, mayi_port)}

# 准备去爬的 URL 链接
url = 'http://1212.ip138.com/ic.asp'

# 计算签名
timesp = '{}'.format(time.strftime("%Y-%m-%d %H:%M:%S"))
codes = app_secret + 'app_key' + my_app_key + 'timestamp' + timesp + app_secret
sign = hashlib.md5(codes.encode('utf-8')).hexdigest().upper()

# 拼接一个用来获得蚂蚁代理服务器的「准入」的 header (Python 的 concatenate '+' 比 join 效率高)
authHeader = 'MYH-AUTH-MD5 sign=' + sign + '&app_key=' + my_app_key + '×tamp=' + timesp 

# 用 Python 的 Requests 模块。先订立 Session(),再更新 headers 和 proxies 
s = requests.Session()
s.headers.update({'Proxy-Authorization': authHeader})
s.proxies.update(mayi_proxy)
pg = s.get(url, timeout=(300, 270))  # tuple: 300 代表 connect timeout, 270 代表 read timeout
pg.encoding = 'GB18030'
print(pg.text)

感谢网友 7天幸福 z.yifan 提供PHP示例


//设置时区(使用中国时间,以免时区不同导致认证错误)
date_default_timezone_set("Asia/Shanghai");
//AppKey 信息,请替换
$appKey = 'XXXXXXXX';
//AppSecret 信息,请替换
$secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';

//示例请求参数
$paramMap = array(
	'app_key'   => $appKey,
	'timestamp' => date('Y-m-d H:i:s')
);

//按照参数名排序
ksort($paramMap);
//连接待加密的字符串
$codes = $secret;

//请求的URL参数
$auth = 'MYH-AUTH-MD5 ';
foreach ($paramMap as $key => $val) {
	$codes .= $key . $val;
  	$auth  .= $key . '=' . $val . '&';
}

$codes .= $secret;

//签名计算
$auth .= 'sign=' . strtoupper(md5($codes));

//接下来使用蚂蚁动态代理进行访问(也可以使用curl方式)
$opts = array(  
    'http' => array(  
        'proxy' => 'test.proxy.mayidaili.com:8123',  
        'request_fulluri' => true,  
        'header' => "Proxy-Authorization: {$auth}",  
    ),  
);  
$context = stream_context_create($opts);
$ip = file_get_contents("http://1212.ip138.com/ic.asp", false, $context); 

echo $ip;   

感谢网友 Mike Cheers 熬夜提供csharp示例


/*
 * 为蚂蚁代理-动态代理服务撰写的C#调用范例
 * 作者:Mike Cheers
 * 2016-01-16
 */
namespace MaYiProxy_Example
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Security.Cryptography;
    using System.Text;

    class Program
    {
        // 定义常量
        static string appKeyName = "app_key";    // 定义appKey名称
        static string appKey = "XXXXX";   // 申请获得的appKey
        static string secret = "XXXXXXXXXXXXXXXXXXXX";   // 申请获得的appSecret
        static string timestampName = "timestamp";    // 定义时间戳名称
        static string signPrefix = "sign=";    // 定义签名固定前缀
        static string authHeaderPrefix = "MYH-AUTH-MD5 ";    // Header值的固定前缀
        static string authHeaderName = "Proxy-Authorization";    // Header名字
        static WebProxy proxy = new WebProxy("test.proxy.mayidaili.com", 8123); // 定义代理服务器位置

        static void Main(string[] args)
        {
            #region 定义请求列表
            List<HttpWebRequest> requests = new List<HttpWebRequest>();

            HttpWebRequest request1 = WebRequest.Create("https://www.baidu.com") as HttpWebRequest;
            HttpWebRequest request2 = WebRequest.Create("http://www.sina.com.cn") as HttpWebRequest;
            HttpWebRequest request3 = WebRequest.Create("http://www.sohu.com") as HttpWebRequest;
            requests.Add(request1);
            requests.Add(request2);
            requests.Add(request3);
            #endregion

            //  实际应用中可使用多线程,为了使示例简单,这里遍历请求列表,模拟多个请求
            foreach (HttpWebRequest request in requests)
            {
                //  在请求发送之前,对请求进行封装;
                //  请在RebuildRequest方法中获取详细信息;
                RebuildRequest(request);

                #region 对请求及回复的信息进行打印,并没有什么特别功能;
                if (null == request)
                {
                    Console.WriteLine("Something wrong with request!");
                }
                else
                {
                    var response = request.GetResponse() as HttpWebResponse;
                    var builder = new StringBuilder(">* Request Uri *-".PadRight(70, '-')
                        + Environment.NewLine
                        + string.Empty.PadRight(8, ' ')
                        + request.RequestUri.ToString()
                        + Environment.NewLine);
                    if (null != request.Headers && null != request.Headers.AllKeys && request.Headers.AllKeys.Length > 0)
                    {
                        builder.AppendLine(">* Request Headers *-".PadRight(70, '-'));
                        foreach (var key in request.Headers.AllKeys)
                        {
                            builder.AppendLine(string.Empty.PadRight(8, ' ') + key + " = " + request.Headers[key]);
                        }
                    }
                    if (null != request.Proxy && request.Proxy is WebProxy && null != (request.Proxy as WebProxy).Address)
                    {
                        builder.AppendLine(">* Request Proxy *-".PadRight(70, '-'));
                        builder.AppendLine(string.Empty.PadRight(8, ' ') + (request.Proxy as WebProxy).Address.ToString());
                    }
                    if (null == response)
                    {
                        builder.AppendLine("Something wrong with response!");
                    }
                    else
                    {
                        if (null != response.Headers && null != response.Headers.AllKeys && response.Headers.AllKeys.Length > 0)
                        {
                            builder.AppendLine("*< Response Headers *-".PadRight(70, '-'));
                            foreach (var key in response.Headers.AllKeys)
                            {
                                builder.AppendLine(string.Empty.PadRight(8, ' ') + key + " = " + response.Headers[key]);
                            }
                        }
                        builder.AppendLine("*< Response Status Code *-".PadRight(70, '-')
                            + Environment.NewLine
                            + string.Empty.PadRight(8, ' ')
                            + response.StatusCode);
                    }
                    response.Close();
                    request.Abort();

                    Console.WriteLine(builder.ToString());
                #endregion
                }

                // 这里做了350ms的延迟
                // 只是为了便于观察不同的时间计算的签名(sign)值结果不同
                // 三次请求中,必有一次签名结果与其它两个不同
                // 强调了每次发送请求重新计算签名的重要性,否则会验证失败
                // 实际应用中并不需要做此延迟
                System.Threading.Thread.Sleep(350);
            }

            Console.ReadLine();
        }

        /// 
        /// 为Http请求指定Header及Proxy
        /// 
        private static void RebuildRequest(HttpWebRequest request)
        {
            if (null == request) return;

            #region 签名计算
            //  定义参与签名计算的参数列表
            Dictionary<string, string> dicParams = new Dictionary<string, string>();
            dicParams.Add(appKeyName, appKey);
            dicParams.Add(timestampName, TimeZoneInfo.ConvertTime(DateTime.Now  // 这里注意时间总是取DateTime.Now,所以每次请求都需要重新计算签名
                , TimeZoneInfo.Local).ToString("yyyy-MM-dd HH:mm:ss")); // 这里注意时区需要使用"GMT+8"(中国时间),以免时区不同导致认证错误

            //  对Key值进行Alpha排序,这里使用了linq方法,可以用其他熟悉的方法代替;
            var akeys = dicParams.OrderBy<KeyValuePair<string, string>, string>(pair => { return pair.Key; });

            //  定义两个StringBuilder用来做字符串拼接
            //  注意构造函数的参数不同
            StringBuilder codes = new StringBuilder(secret)
            , authHeader = new StringBuilder(authHeaderPrefix);

            //  对Key-Value值进行拼接,注意拼接方式的差异;
            foreach (var pair in akeys)
            {
                codes.Append(pair.Key + pair.Value);
                authHeader.Append(pair.Key + "=" + pair.Value + "&");
            }

            //  只有codes需要追加secret值
            codes.Append(secret);

            //  计算签名
            string sign = BitConverter
                .ToString(MD5En(codes.ToString(), Encoding.Default))    // 对codes进行MD5加密
                .Replace("-", "")   // 去掉字符'-'
                .ToUpper(); // 转成大写
            #endregion

            //  在authHeader后追加签名
            authHeader.Append(signPrefix + sign);

            if (null == request.Headers) request.Headers = new WebHeaderCollection();

            //  为请求头加入authHeader信息
            request.Headers.Add(authHeaderName, authHeader.ToString());

            //  为请求设置代理服务器信息
            request.Proxy = proxy;
        }

        /// 
        /// md5加密,不做大小写处理
        /// 
        public static byte[] MD5En(string str, Encoding encoding)
        {
            if (string.IsNullOrEmpty(str)) return null;

            MD5 md5 = new MD5CryptoServiceProvider();
            return md5.ComputeHash(encoding.GetBytes(str));
        }
    }
}

感谢网友 游 (89276***)提供VB示例,在按键精灵下测试通过


appkey="XXXXXX"
secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXX"
mayiip = "test.proxy.mayidaili.com:8123"
timestamp = DatePart("yyyy", now()) & "-" & DatePart("m", now()) & "-" & DatePart("d", now()) & " " & DatePart("h", now()) & ":" & DatePart("n", now()) & ":" & DatePart("s", now())
sign = secret&"app_key"&appkey&"timestamp"&timestamp&secret
sign = Plugin.Encrypt.Md5String(sign)
jimi = "MYH-AUTH-MD5 sign=" & sign & "&app_key=" & appkey & "&timestamp=" & timestamp
urlip="http://1212.ip138.com/ic.asp"
Set visit = CreateObject("WinHttp.WinHttpRequest.5.1")
With visit
    .Open "get", urlip, False
    .SetProxy 2,mayiip
    .SetRequestHeader "Proxy-Authorization",jimi
    .Send 
End With
If visit.waitforresponse(10) Then '单位秒
    Set operate = CreateObject("Adodb.Stream")
    operate.Type = 1
    operate.Mode = 3
    operate.Open
    operate.Write visit.ResponseBody
    operate.Position = 0
    operate.Type = 2
    operate.Charset = "gb2312"
    content= operate.ReadText
    startpop = inStr(content,"[") + 1
    endpop = inStr(content,"]") - startpop
    IP_address = Mid(content, startpop, endpop)
    TracePrint IP_address
End If
visit.Abort
Set operate = Nothing
Set visit = Nothing

感谢网友 原来你**** 提供易语言模块

点此下载易语言签名生成模块

访问HTTPS网站时证书问题

感谢网友 大頭 (646***) 提供Selenium示例


#!coding:utf-8

from selenium import webdriver
import selenium
import random
import time
import sys
import urllib2
import hashlib

reload(sys)
sys.setdefaultencoding('utf-8')


dcap = dict(webdriver.DesiredCapabilities.PHANTOMJS)


def authCode():
    appkey = "xxxxxxxx"
    secret = "xxxxxxxxxxxxxxxxxxxx"

    # 设置HTTP头信息参数
    paraMap = {
        "app_key": appkey,
        "timestamp": time.strftime("%Y-%m-%d %H:%M:%S")
    }

    # 排序
    keys = paraMap.keys()
    keys.sort()

    codes = "%s%s%s" % (secret, str().join('%s%s' % (key, paraMap[key]) for key in keys), secret)

    #计算签名
    sign = hashlib.md5(codes).hexdigest().upper()

    # 拼装请求头Proxy-Authorization的值
    paraMap['sign'] = sign

    keys = paraMap.keys()
    authHeader = "MYH-AUTH-MD5 " + str('&').join("%s=%s" % (key, paraMap[key]) for key in keys)
    return authHeader


# 创建实例
def createSelenium():
    auth = authCode()
    # 此处开始设置头信息
    dcap["phantomjs.page.settings.userAgent"] = ('Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36')
    # 此处带入proxy验证信息
    dcap["phantomjs.page.customHeaders.Proxy-Authorization"] = (auth)

    # By PhantomJS
    args = ['--load-images=false', '--disk-cache=true', '--proxy=ProxyAddress:port']

    # For Windows
    # br = webdriver.PhantomJS(service_args=args, desired_capabilities=dcap, executable_path=r'C:\phantomjs\bin\phantomjs.exe')

    # For MacOSX
    br = webdriver.PhantomJS(service_args=args, desired_capabilities=dcap, executable_path=r'/usr/local/bin/phantomjs')

    # 访问页面
    br.get("http://members.3322.org/dyndns/getip")
    # 设置页面等待时间,不重要
    br.implicitly_wait(10)
    br.set_page_load_timeout(15)
    print br.page_source
    br.quit()
    # 接下来执行具体动作

for i in xrange(0,3):
    createSelenium()
    time.sleep(2)																		

感谢网友 夜丿未央 (97727***) 提供Nodejs示例


/**
 * Created by Mr.Carry on 16/7/10.
 */
var moment = require("moment");
var crypto = require('crypto');
var cheerio = require("cheerio");
var zlib = require('zlib');
var gunzipStream = zlib.createGunzip();
var iconv = require('iconv-lite');
var http = require('http');


function md5 (text) {
    return crypto.createHash('md5').update(text).digest('hex');
};

// 定义申请获得的appKey和appSecret
var app_key = "XXXX";
var secret = "XXXX";

var host = "proxy.XXXX.com";
var port = "8123";
//待抓取对网址(不带http://前缀)
var path = "www.XXX.com";

var keygen = {
    "app_key" : app_key,
    "timestamp" : moment().format('YYYY-MM-DD HH:mm:ss')
}


var getKey = function(){
    var list = [secret];
    var param = [];
    for(var p in keygen){
        str = p + "" + keygen[p];
        list.push(str);
    }
    for(var p in keygen){
        str = p + "=" + keygen[p];
        param.push(str);
    }
    list.push(secret);
    var m5 = "MYH-AUTH-MD5 sign=" + md5(list.join("")).toUpperCase() + "&" + param.join("&");
    return m5;
}



var options = {};

options.host = host;
options.port = port;
options.method = "GET";


options.path = "http://" + path;
options.headers = {
    "Proxy-Authorization": getKey(),
    "Host" : path,
};


var req = http.request(options, function (res) {
    var result = [];
    /**
     * gzip格式数据,先解压缩,再处理数据
     */
    if(res.headers['content-encoding'].indexOf('gzip') != -1) {
        res.pipe(gunzipStream).on("data",function(data){
            /**
             * 163的页面编码格式为gb2312 ,所以解压缩为GB,实际根据抓取的页面编码格式调整
             */
            result.push(iconv.decode(data, 'GBK'))
        }).on("end",function(){
            console.log(result.join(" "))
        })
    }
});

req.end();																	

感谢网友 Cloud 提供C示例


IWinHttpRequestPtr my_pHttpReq=NULL;
	CString myip;
	CString lpszProxyIp=_T("xx.xx.xx.xx");//服务器IP
		int dlPort=xxxx;//端口
int m_nYear = time.GetYear(); ///年
int m_nMonth = time.GetMonth(); ///月
int m_nDay = time.GetDay(); ///日
int m_nHour = time.GetHour(); ///小时
int m_nMinute = time.GetMinute(); ///分钟
int m_nSecond = time.GetSecond(); ///秒
CString timestamp;
timestamp.Format(_T("%d-%d-%d %d:%d:%d"),m_nYear,m_nMonth,m_nDay,m_nHour,m_nMinute,m_nSecond); //时间显示
            do 
	         {
		     try 
		      { HRESULT hr = S_FALSE;	
	           if (!my_pHttpReq) 
			   {hr = my_pHttpReq.CreateInstance(__uuidof(WinHttpRequest));
			   if(FAILED(hr)) return ;}

			if (lpszProxyIp && _tcslen(lpszProxyIp) >= 7 && dlPort > 0 && dlPort < 65535)
		    {
HTTPREQUEST_PROXY_SETTING HTTPREQUEST_PROXYSETTING_DEFAULT   = 0;
			
HTTPREQUEST_PROXY_SETTING HTTPREQUEST_PROXYSETTING_PRECONFIG = 0;
			
HTTPREQUEST_PROXY_SETTING HTTPREQUEST_PROXYSETTING_DIRECT    = 1;
			
HTTPREQUEST_PROXY_SETTING HTTPREQUEST_PROXYSETTING_PROXY     = 2;
			
CString strProxy;
			
strProxy.Format(_T("%s:%d"), lpszProxyIp, dlPort);
			hr = my_pHttpReq->SetProxy(HTTPREQUEST_PROXYSETTING_PROXY, (LPCTSTR)strProxy);
			}
			hr = my_pHttpReq->Open(_T("GET"), _T("http://1212.ip138.com/ic.asp"));	
			if (FAILED(hr)) return ;
	CString  app_key =_T("xxxxxx");
	CString  secret =_T("xxxxxxxxxxx");
	CString stymy=_T("xxxxxxxxxxxapp_keyxxxxxxtimestamp")+timestamp+_T("xxxxxxxxxxx");
				
/*这里是外部调用JS  把stymy的值 转为sign 也可以自己调用md5.h  附上外部JS
	function mysign(strmy) {
	var md5my=hex_md5(strmy);
	var mystr=md5my.toUpperCase();
	return mystr
                   }
*/
        CString  mysign = mystr;
	CString mayiDL=_T("MYH-AUTH-MD5 sign=")+mysign+_T("&app_key=")+app_key+_T("×tamp=")+timestamp;
	my_pHttpReq->SetRequestHeader(_T("Accept"), _T("*/*"));
my_pHttpReq->SetRequestHeader(_T("User-Agent"), _T("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/45.0.2454.101 Safari/537.36"));
	my_pHttpReq->SetRequestHeader(_T("Content-Type"),_T("application/x-www-form-urlencoded"));
	my_pHttpReq->SetRequestHeader(_T("Proxy-Authorization"),(LPCTSTR)mayiDL);
	hr = my_pHttpReq->Send();
	if(FAILED(hr)) return  ;
	CString strIP;
	Get_WinHttp_RspString(my_pHttpReq, strIP);
	myip=GetMidStrByLAndR(strIP, _T("您的IP是:["), _T("]"));  
		      }
	          catch(_com_error &e)
		       {   
			    break;
		       }
	        }while (0); 																	
效果演示

价格说明

动态代理按并发请求数进行收费(并发请求数请参考您程序的线程数)

每个并发数 3元/天

量大可优惠