autoproxy.pac解密

2011年7月18日 | 分类: 翻墙相关 | 标签: ,

加密后浏览网站效率可能会降低一些.Opera不被支持
Google Code项目地址 点击进入
附上代码 自由发挥

<?php
/*
 * This is a php implementation of autoproxy2pac
 */

function reg_encode($str) {
	$tmp_str=$str;
	$tmp_str=str_replace('/', "\\/", $tmp_str);
	$tmp_str=str_replace('.', "\\.", $tmp_str);
	$tmp_str=str_replace(':', "\\:", $tmp_str);
	$tmp_str=str_replace('%', "\\%", $tmp_str);
	$tmp_str=str_replace('*', ".*", $tmp_str);
	$tmp_str=str_replace('-', "\\-", $tmp_str);
	$tmp_str=str_replace('&', "\\&", $tmp_str);
	$tmp_str=str_replace('?', "\\?", $tmp_str);
	$tmp_str=str_replace('+', "\\+", $tmp_str);

	return $tmp_str;
}

function get_pac($proxy_type, $proxy_host, $proxy_port, $proxy_google) {
	$gfwlist_url='http://autoproxy-gfwlist.googlecode.com/svn/trunk/gfwlist.txt';

	$ch=curl_init();  
	curl_setopt($ch, CURLOPT_URL, $gfwlist_url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	$gfwlist_raw=curl_exec($ch);
	curl_close($ch);
	if(isset($_GET['raw']))
	{
		header('Content-Type: text/plain');
		echo $gfwlist_raw;
		exit(0);
	}
	$rulelist=base64_decode($gfwlist_raw);
	$gfwlist=explode("\n", $rulelist);

	//echo $proxy_google;
	if($proxy_google=="true") {
		$gfwlist[]='.google.com';
	}

	$pac_content='//Generated by ptp gfwlist2pac'."\n";
	$find_function_content.='function FindProxyForURL(url, host){var PROXY = "'.$proxy_type.' '.$proxy_host.':'.$proxy_port.'";var DEFAULT = "DIRECT";';

	foreach($gfwlist as $index=>$rule){
		if(empty($rule))
			continue;
		else if(substr($rule,0,1)=='!' || substr($rule,0,1)=='[')
			continue;
		$return_proxy='PROXY';
		if(substr($rule,0,2)=='@@')
		{
			$rule=substr($rule,2);
			$return_proxy="DEFAULT";
		}

		if(substr($rule,0,2)=='||')
		{
			$rule_reg = "^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?".reg_encode(substr($rule,2));
		}
		else if(substr($rule,0,1)=='|')
		{
			$rule_reg = "^".reg_encode(substr($rule,1));
		}
		else if(substr($rule,0,1)=='/'&&substr($rule,-1)=='/')
		{
			$rule_reg = substr($rule,1,strlen($rule)-2);
		}
		else
		{
			$rule_reg=reg_encode($rule);
		}
		if(eregi("\|$", $rule_reg))
		{
			$rule_reg=substr($rule_reg,0,strlen($rule_reg)-1)."$";
		}
		//echo '//'.$rule_reg."\n\t";
		$find_function_content.= 'if(/'.$rule_reg.'/i.test(url)) return '.$return_proxy.';';
	}
	$find_function_content.='return DEFAULT;'."}";

	$pac_content.='eval(decode64("'.base64_encode($find_function_content).'"));';
	//$pac_content.=$find_function_content;

	$pac_content.="\n";

	$pac_content.='function decode64(_1){var _2="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var _3="";var _4,_5,_6;var _7,_8,_9,_a;var i=0;_1=_1.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{_7=_2.indexOf(_1.charAt(i++));_8=_2.indexOf(_1.charAt(i++));_9=_2.indexOf(_1.charAt(i++));_a=_2.indexOf(_1.charAt(i++));_4=(_7<<2)|(_8>>4);_5=((_8&15)<<4)|(_9>>2);_6=((_9&3)<<6)|_a;_3=_3+String.fromCharCode(_4);if(_9!=64){_3=_3+String.fromCharCode(_5);}if(_a!=64){_3=_3+String.fromCharCode(_6);}}while(i<_1.length);return _3;}';

	return $pac_content;
}

function main() {
	if($_GET['proxy_name']=='free-gate') {
		$proxy_type='PROXY';
		$proxy_host='127.0.0.1';
		$proxy_port='8580';
	}else if($_GET['proxy_name']=='tor') {
		$proxy_type='SOCKS5';
		$proxy_host='127.0.0.1';
		$proxy_port='9050';
	}else if($_GET['proxy_name']=='ssh-d') {
		$proxy_type='SOCKS5';
		$proxy_host='127.0.0.1';
		$proxy_port='7070';
	}else if($_GET['proxy_name']=='gappproxy') {
		$proxy_type='PROXY';
		$proxy_host='127.0.0.1';
		$proxy_port='8000';
	}else if($_GET['proxy_name']=='jap') {
		$proxy_type='PROXY';
		$proxy_host='127.0.0.1';
		$proxy_port='4001';
	}else if($_GET['proxy_name']=='your-freedom') {
		$proxy_type='PROXY';
		$proxy_host='127.0.0.1';
		$proxy_port='8080';
	}else if($_GET['proxy_name']=='puff') {
		$proxy_type='PROXY';
		$proxy_host='127.0.0.1';
		$proxy_port='1984';
	}else if($_GET['proxy_name']=='privoxy') {
		$proxy_type='PROXY';
		$proxy_host='127.0.0.1';
		$proxy_port='8118';
	}else if($_GET['proxy_name']=='wu-jie') {
		$proxy_type='PROXY';
		$proxy_host='127.0.0.1';
		$proxy_port='9666';
	} else {
		if($_GET['proxy_type']=='http')
			$prroxy_type='PROXY';
		else if ($_GET['proxy_type']=='socks')
			$proxy_type='SOCKS5';
		else
			$proxy_type=$_GET['proxy_type'];

		$proxy_host=$_GET['proxy_host'];
		$proxy_port=$_GET['proxy_port'];
	}

	$proxy_google = $_GET['proxy_google'];

	$pac = get_pac($proxy_type, $proxy_host, $proxy_port, $proxy_google);

	header('Content-Type: text/plain');
	header('Content-Length: '.strlen($pac));
	echo $pac;
}

main();
?>

原文:http://blog.xiaohai.co/archives/autoproxy-pac%E8%A7%A3%E5%AF%86/

  1. Anteek
    2011年7月19日10:02

    我现在最需要的是’http://autoproxy-gfwlist.googlecode.com/svn/trunk/gfwlist.txt’这个清单里面的东西,有可能把它明文读出来不?

    • iGFW
      2011年7月19日10:58

      文中的方法貌似就可以。

      • Anteek
        2011年7月19日11:31

        弱弱地问一下,应该怎么用呢?是上传到自己的PHP主机么?

        • iGFW
          2011年7月19日12:09

          应该是,大概是这样,在http://code.google.com/p/phptunnelproxy/downloads/list下载ptpremote-1.0.109.tar.bz2文件,解压把里面的pac.php上传到你的php空间访问pac.php网址看看。

          • Anteek
            2011年7月19日12:45

            谢谢,可以用啦 (这东西真坑爹,项目主页没有说明,我访问了index.php和remote.php,就是没想到访问pac.php 囧)

          • iGFW
            2011年7月19日21:33

            这个项目主要是用php空间做代理翻墙的,这个功能只是它附加的。

    • 匿名
      2011年7月23日14:58

      它只是base64编码了而已。找个在线base64解码的就可以了。