python ip动态代理_动态代理服务器

// 定义申请获得的appKey和appSecret

String appkey = "XXXXXXXX";

String secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

// 创建参数表

Map paramMap = new HashMap();

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 + '&timestamp=' + 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 requests = new List();

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 dicParams = new Dictionary();

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, 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

感谢网友 大頭 (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("&timestamp=")+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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值