中国式P2P骗局全解密——变异的基因

 

 
六年时间,P2P在中国经历了从天堂到地狱的轮回。2012年,第一批P2P开始爆发,代表技术的互联网和代表财富的金融相结合,没有什么比这个概念更性感。不到三年的时间,中国已经能成长为全球最大的P2P市场,平台数量全球第一,交易额是美国的数倍,比当年的A股还要疯狂。但飞的越高、摔得越惨,当潮水褪去的时候,裸泳的P2P在2018年开始一个个倒下。半年多时间已经700多家停业或出问题,仅7月就有165多家跑路,日均5家以上,维权事件频发,甚至让人闻到了一丝金融危机的味道。为什么会出现这样的动荡?未来我们应该如何看待中国的P2P投资?
本文将从中国P2P的基因入手,帮助大家识别P2P投资的风险,建立P2P的投资逻辑。
 
一、中国式P2P基因:我们不一样
 
看名字就知道,P2P是个舶来品。英文全称Peer to Peer,意思就是点对点的网贷平台。中国的P2P最早起源于2007年,第一家P2P公司拍拍贷成立,进入2012年之后P2P平台如雨后春笋快速兴起,2015年最高峰时有近2600多家平台,成为全球第一大P2P市场。为什么发展如此之快?因为中国的P2P在发展中完全变异了。按照国外的定义,P2P本质上是金融信息中介,撮合出借人和借款人产生债权债务关系,P2P受到严格的准入和过程监管,而中国式P2P从一开始就变异了,和国外很不一样:
 
第一,监管模式不一样。中国式P2P是监管真空的产物,在很长时间监管机构缺位,直到2015年才正式纳入银监会监管体系;而其他国家监管相对成熟,比如美国的P2P监管就非常严格。由于美国P2P借贷行业具有明显的证券化属性,投资者认购的是贷款凭证,由证券交易委员会(SEC)予以监管,而SEC一方面设定了很高的准入门槛,屏蔽掉了很多骗子,另一方面实施严格的行为监管,甚至要求每天都向SEC提交报告。
 
第二,市场定位不一样。中国式P2P大多强调金融属性,多为小贷平台,科技含量不高,有的甚至充当了网络银行的角色,没有做到点对点,而是出借人借款给平台,平台再借给借款人,不是直接融资,是间接融资;国外P2P平台多强调互联网背景,多为高科技公司,如美国最知名的P2P平台LengdingClub 2014年在纽交所上市,是当年最大的科技股IPO。
 
第三,运作模式不一样。中国式P2P多为线上和线下结合模式,线上筹集资金,线下开发客户、审核和风控等,不少平台通过设立线下实体店增强获客能力;而国外P2P采用线上操作一体化操作,基本上所有的流程都在线上完成。
 
第四,保障机制不一样。中国式P2P通常被打上了刚性兑付的烙印,通过增信和担保提供本息保障。刚性兑付是中国金融体系一切风险的来源,同样也是P2P风险的来源;而国外P2P平台作为信息中介不提供本息保障,投资者自行承担风险,平台不承担借贷违约风险。
图1 美国P2P平台运作流程
资料来源:罗兰贝格咨询 如是金融研究院
 中国P2P平台线上线下模式运作流程
资料来源:罗兰贝格咨询 如是金融研究院
 
二、中国式P2P骗局:那些年你踩过的“雷”
 
中国式P2P的黄金时代已经结束,随着金融去杠杆推进、融资环境恶化和金融监管升级,一场迟到的出清已经到来。截至2018年7月底,现存正常运营的P2P平台仅有1645家,而出现问题平台就有4740家,占比高达74%,“爆雷”事件频发,尤其是今年以来,出现了超过700多家停业及问题平台,涉及投资人数占比从3.7%上升至6.2%,涉及贷款余额占比从2.7%增至7.7%, P2P行业违约风险加速蔓延,导致P2P投资者恐慌不已,市场信心降至冰点。
 中国P2P停业及问题平台不断增加
数据来源:Wind  如是金融研究院
 中国P2P停业及问题平台涉及人数和规模占比同步回升
 数据来源:Wind  如是金融研究院
 
1、风险爆发的三个原因
 
中国式P2P集中爆发问题的原因有三点:
 
一是金融去杠杆,市场流动性收紧。金融去杠杆逐步从资金端转向资产端,导致流动性收缩、利率抬升、金融业态规范收缩、金融案件增多、违约事件频发、金融风险从点到面释放,P2P风险也随之显现。
 
二是融资企业经营恶化,还款能力下降。在行政去产能和环保常态化等因素的共同作用下,中小企业、民营企业首当其冲,被迫关停限产,经营效益下滑,资金承压,到期无法还款,从而导致平台资金链断裂提现困难。
 
三是监管升级,违规平台加速出局。2014年4月银监会着手牵头研究监管P2P事宜,并在2015年正式将P2P纳入监管,接连出台多项监管政策,全面规范P2P行业运作,结束了长期以来的监管真空,违规平台加速被清洗,倒逼行业出清。
 
2、常见的三类P2P骗局
 
尽管P2P监管趋严、投资者的风险意识逐步增加,但P2P投资陷阱还是防不胜防,前有e租宝、快鹿、中晋,现有善林金融、银票网、唐小僧,不少投资人重蹈覆辙。问题平台假借互联网金融、P2P之名,行诈骗集资“伪金融”之实,突破监管红线,涉嫌违规操作,常见的有自融自用、短期诈骗、庞氏骗局等形式,下面将梳理分析这三类骗术的特点,以期帮助投资者识别投资陷阱,规避P2P投资风险。
 
第一类是自融自保。自融自保是银监会明确为P2P划定的红线,自融是平台发标为自身融资,借款人即为平台或平台关联方,自保是平台为投资人提供本息保障,这和P2P平台信息中介的定位完全不符。P2P平台的本质是中介机构,作为第三方平台连接借款人和投资人,但现在不少P2P平台的设立是为了更好地为平台实际运营方或关联方融资,严重偏离P2P的运行逻辑,完全丧失了应有的中立立场,失去了第一道风控保护,后续资金的用途更是无法监控,甚至会出现虚构融资项目、伪造抵押担保等乱象,潜在风险极大。
 
P2P平台自融自保常见的漏洞有三点:一是虚构投资标的,多为高息、高额、短期,借款资料十分简陋,信息模糊甚至缺失;二是单一反复借款,通常借款人数偏少,且与平台方有关联,借款用途模糊不清;三是托管信息缺失,未进行第三方资金托管或托管不合规范,P2P平台账户和资金账户混为一体,无法实现风险隔离。
 
由《叶问3》票房造假扯出快鹿集团自保和自融嫌疑。借款方是大银幕(北京)发行控股有限公司;平台方是金鹿财行、趣逗理财、当天投资、菜苗网络等18家融资平台;担保公司是上海东虹桥融资担保股份有限公司。快鹿系用自己的影视公司,走自己的通道公司,靠自己的担保公司,用自家的P2P平台,最终投向了自家的影视项目《叶问3》。
 
还有2017年停止运营的P2P平台88财富发布的产品大多涉及自融自保,以周盈宝0808为例,融资总额度1000万,投资期限7天,年化收益率6%,借款人为深圳市黄檀集雅二期文化产业投资合伙企业(有限合伙),募集资金用于当代青年艺术家扶助计划及推广,第一还款来源为画作保管展览、展示收益,第二来源为质押的12幅画作公开售卖或拍卖形成的收益,看似信息披露较为完善、有担保保障,实际上存在很大的漏洞:一是虚构标的,经向中国美术家协会求证,根本没有“当代青年艺术家扶助计划”;二是单一借款人,周盈宝系列产品均为同一借款人,不管是否满标,持续募集;三是借款人为P2P平台88财富、借款人黄檀集雅、担保公司中科创融资担保公司为同一控制人,变相自融自保。
 
 
第二类是短期诈骗。由于中国P2P多定位为小贷公司,准入门槛低,诈骗成本低,所以有些P2P平台建立的目的就是为了短期诈骗,利用投资者赚快钱的心理,冒用投资背景包装平台,采用高额返现、“秒标”“天标”等手段吸引客户投资,干一票就走人。
 
P2P平台短期诈骗有两大常见特点:一是多为新设平台,成立时间短,没有尚未经过市场检验,缺乏历史业绩作为参考;二是经常出现“秒标”,平台为聚集人气偶尔发一些高收益、超短期限的借款标的是比较正常的,但经常出现“秒标”可能就存在猫腻,很有可能是虚构的借款标的,借机敛财。
 
如2012年6月3日上线的淘金贷,通过假造营业执照,大发收益奇高、期限超短的“秒标”,制造赚钱的假象骗取投资者争相投资,募集金额超过100万,6月6日,资金账户就被限制交易,资金被全部支取,6月8日淘金贷网站就无法登录,从上线到“跑路”只用了短短一周。
 
第三类是庞氏骗局。与短期诈骗不同的是,庞氏骗局通过借新还旧,存续期较长,融资体量较大,社会危害更严重。这类平台通常看起来较为正规,通过承诺高额收益吸引投资者,但实际投资收益无力覆盖投资者利息,只能用新增投资者的本金支付前期投资者的本息,一旦新增资金放缓或者停止进入时,整个体系就会崩盘,投资者基本血本无归。
 
大部分P2P问题平台都有庞氏骗局的影子,甚至超过百亿规模,如e租宝、钱宝网、中晋、快鹿等,还有前不久出事的善林金融、中融民信、钱宝网、唐小僧等,P2P平台庞氏骗局常见的手法有以下四种:
 
一是包装平台。对平台资质、背景、业绩进行全方位包装,使平台看起来正规,值得信赖。如善林金融,做足包装宣传,曾为中国女排高级赞助商,在央视黄金段、各大卫视甚至纽约时代广场、伦敦希思罗机场都有投放广告,在全国开设1000余家线下门店,表面看起来“家大业大”、“大而不倒”骗取投资者信任,非法吸纳了超过600亿的投资。事实上,善林金融有4条以上的行政处罚,主要聚焦在无照经验、虚假宣传等,并没有宣传的那么美好。善林金融的实际控制人周伯云控股的“天津佳伦宏业房地产有限公司”曾27次被最高法院列为失信公司。
二是虚构标的。为了能够持续募集资金,不少平台利用信息披露监管不严的漏洞,编造借款信息。如e租宝表面上看是为下属的融资租赁公司融资,实际上超过95%的项目都是虚假的,不少项目反复融资,平台上公布的多为假项目、假三方的虚构信息,甚至出现过租赁物为价值4.5亿的翡翠原石这样匪夷所思的投资标的。
 
三是高息诱惑。向投资者承诺高于市场水平的年化收益率或者高额返利,大肆宣传高收益,引诱鼓动投资者参与。在实体经济利润率下行的背景下,过高的收益水平不太现实,往往是你盯着别人的利率,别人看中你的本金,如四大高额返利P2P平台联璧金融、唐小僧、钱宝网、雅堂金融已全部“爆雷”, 联璧金融的“零元购”模式年化收益高达31%,唐小僧的“平台返利”年化收益率高达40%-60%,钱宝网的“微商平台”年化收益高达40%左右,雅堂金融的信用标收益率最高收益率达到50%,如此高昂的收益率自然难以为继。
 
四是资金池运作。资金池在金融业务中较为常见,也是金融监管的重点。每一个合规的P2P标里,应该是借款人的债权和投资人的资金匹配对应,并进行第三方资金托管,P2P平台账户和资金账户隔离开来,而资金池是先将资金汇集到平台指定账户,然后通过“拆标”匹配投资项目,以短养长实现期限错配,以小拼大实现金额错配,一旦其中的某个项目出现问题或者投资者集中提现,很容易引发流动性危机,80%以上的问题平台都未上银行托管。如近期“爆雷”唐小僧,自2015年5月成立以来,交易量高达800亿元,但并未进行银行托管,信息披露也是极度敷衍,投资者在投标前几乎看不到任何借款项目信息,投标后也只能看到借款人名字,资金用途等有价值信息无从知晓,进行资金池运作,“拆东墙补西墙”。
 
虽然上述三类骗局操作模式不尽相同,但通常P2P问题平台存在许多共性,惯用伎俩大同小异,大致表现为包装平台、虚构投资标的,采用高息诱惑、密集短标等方式吸纳资金,但对募集资金缺乏监管,既无银行托管,又无信息披露,资金去向无法追溯,所以有上述表现的P2P平台应予以重点关注。
 
三、中国式P2P投资:如何筛选靠谱的平台和产品?
 
从短期来看,中国式P2P经过前期的快速发展后,如今已经开始大洗牌,问题平台接连“爆雷”,监管升级倒逼规范发展,亟待去伪存真。长期来看,中国式P2P作为互联网金融新业态,契合小微企业融资的融资需求,规范的P2P平台有一定的生存空间。在正本清源的关键时期,中国式P2P投资难度加大,需要综合评估,筛选出靠谱的平台和产品。
 
1、选择平台的四个要点
P2P投资最重要的是选平台。平台作为中介机构,连接借贷双方,满足各自的需求。由于现有P2P多是通过线上交易,在这一过程中,借贷双方存在信息不对称,需要平台充当信息中介,保障借贷交易顺畅有序进行,安全合规可靠的平台是产品存续盈利的基础。P2P平台选择需重点关注以下四点:
 
第一,平台实力。
P2P平台作为互联网公司,轻资产运营,跑路的成本较低,风险较大。从这个视角来看,平台的注资股东很重要,股东背景强大,平台就能相对稳定发展。从股东背景看,P2P平台一般分为银行系、风投系、上市系、国资系、民营系五大类。
 
最安全的是银行系,由银行自建平台或子公司投资入股,现有15家,目前尚未出现问题平台,但收益相对较低,综合收益率为6.27%。理论上,银行系P2P平台受到层层监管,运行较为规范,安全性有保障,现在市场影响力较高的有平安集团旗下的陆金服、国开行旗下的开鑫贷、招商银行旗下的小企业E家等。
 
其次是风投系,有风险机构参与投资的P2P平台并不多,现存156家,累计4家问题平台,淘汰率为2.50%,整体表现较好。一般而言,在选择风投系P2P平台时主要看风投机构的知名度、持股比例、风投轮次等,一般有知名风投机构如IDG、AIG、红杉资本、北极光创投、晨兴资本、经纬中国等参与投资、持股比例较高、融资轮次越多的平台可信度越高。
 
接着是上市系,平台与上市公司有一定的关联,现有112家,累计4家问题平台,淘汰率为3.34%,不到5%。上市系平台选择时要重点关注含金量,上市系种类较为多样,可以是平台直接上市如宜人贷,或是上市公司直接参股、上市公司全资子公司参股、上市公司参股公司投资,需要关注上市公司自身的实力和上市公司与平台的股权结构关系,通常上市公司实力越强,参股比例越高,安全指数越高。还有一种是上市公司相关公司投资,这种相关性通常很弱,和上市公司没有股权关系,这类平台风险值得警惕。
 
再就是国资系,一般来说,依托强大的央国企,信用更有保障,但国资系平台爆雷率超过10%,为12.16%,需要重点关注股东国企实力和持股比例,可能存在“扯虎皮拉大旗”的情形,仅由国企集团下属各层子公司少量参股,如银豆网对外宣称由央企中国恒天持股,实际上是中国恒天的“子公司”以及“孙公司”投资的恒天资产参与融资,与央企中国恒天关联不大。另外,在选择过程中要警惕伪国资系,本质上和国资完全没有关系,如江苏P2P平台365易贷的股东实际上是25个自然人,却一直打着国资系平台旗号虚假宣传。
 
最后是民营系,不属于四类的平台,可谓是重灾区,平台问题数量最多,累计问题平台2131家,正常运营的仅有1376家,淘汰率为60.76%,在累计问题平台中占比高达98.20%。因此民营系平台选择难度较大,预计经过本轮出清后,民营系平台头部化更为明显,可结合历史运营状况择优选择。
 中国P2P问题平台中民营系占比超过60%
资料来源:Wind  如是金融研究院
表1  2017年排名前十的P2P平台统计,无一是单纯的民营系
资料来源:网贷之家 天眼查  如是金融研究院
 
虽然在这波P2P“爆雷潮”中,不少有背景的平台也未能幸免,相继阵亡,6月停业及问题平台中有1家为上市系参股,9家为国资系平台,70家为民营系平台,但总体上看,有背景的P2P平台仍相对安全,平台背景依旧是平台选择时应重点关注的因素,具体可通过国家企业信用信息公示系统或者天眼查等第三方软件查询企业工商信息,查看企业股东及出资信息情况,并结合分析平台的运营情况,如注册用户量、贷款余额、年成交规模等信息,综合评估平台实力。 
图6 第三方软件上有详细的平台信息
 
第二,合规保障。
合规经营是P2P平台的底线。虽然57号文给出的6月备案登记大限并未能如期执行,但P2P平台未来的监管方向已经十分明确,统一全国备案标准是大势所趋。机构信用代码证、ICP许可证、信息安全等级备案、银行存管已然成为P2P网贷行业合规性的四大重要标准。机构信用代码证即营业执照,可视作企业的“身份证”,是识别机构身份、查询机构信用记录等的重要依据。三证合一后,信用代码即现在开发票通常用到的税号,可通过国家企业信用信息公示系统或者天眼查等第三方软件查询。ICP许可证是互联网信息服务业务经营许可,否则就属于非法经营,对于P2P平台十分重要,可通过工信部ICP/IP地址/域名信息备案管理系统查询。信息安全等级备案是对信息系统安全等级保护状况的检测评估,等级越高,安全保护能力越强,由各地区市级公安局机构颁发,可通过公安系统的网络安全等级保护网查询。等级保护三级认证是平台备案的必要条件,是非银行机构的最高级认证,仅有不到200家平台通过等级保护三级认证。平台上线银行资金存管系统,存管银行根据协议进行资金划转支付,严格监管资金流向,为用户资金的安全提供保障,可通过平台官网和第三方P2P门户网站如网贷之家和网贷天眼等查询。
机构信用代码证、ICP许可证、信息安全等级备案、银行存管是P2P平台备案的必要条件,也是平台合规经营的基础,需予以重点关注。此外,还要求及时进行信息披露,积极进行平台备案信息、组织信息、审核信息等信息公示,接受用户及监管部门的审视。
 
第三,风险控制。
信用风险是P2P业务中最大的风险。平台要有完善的风控流程、严密的风控体系、强大的风控团队进行支持和配合,可通过平台的运营报告、安全保障介绍页面、标的详情页面等综合评判平台风控保障力度。之前不少平台提取了部分风险备付金用于解决信用风险,也是平台宣传的一个亮点,但这明显与信息中介定位不符,属于违规行为,监管已禁止平台新增风险备付金,积极消化存量。平台的风险保障成效可通过逾期坏账率这一指标来进行度量,可从平台年报、运营数据、官网等渠道获取,一般来说,经营良好的P2P平台会将坏账率控制在2%以下。  
但需要注意的是很多平台公布的逾期和坏账明显偏低,甚至是“自欺欺人”,如牛板金和银豆网均为零坏账,结果均“爆雷”。
 
第四,团队能力。
人才是金融业的核心竞争力,在P2P行业也不例外,甚至更加重要,这是因为P2P这一新兴业态较传统金融更为复杂,需要有严格缜密的风控团队、思维活跃的运营团队、可靠过硬的技术团队等共同配合,因而,团队能力是选择P2P平台重要的考量的因素之一,但是能力这一指标难以直接量化,通常用以下三个指标度量:一是团队结构,高管团队除了通常的CEO、COO、CFO,还应有配置主管技术的首席信息官和主管风险控制的风控总监等职位,共同保障平台专业安全运营。二是学历背景,高管团队若能有良好的学历背景,在金融知识和IT技能上有充足的储备,会在平台运营管理上更有优势。三是从业经验,高管团队有大型传统金融机构、新兴互联网机构的从业经历,能在平台运营管理上更游刃有余。
 
2、选择产品的三个要点
挑选出靠谱的P2P平台后,P2P投资就成功了一半,接下来就是靠谱P2P产品的选择了。在具体P2P产品选择过程中,应重点关注以下三点:
第一,资金投向。也就是P2P的资产端,投资者资金究竟借给了谁,资产端是投资P2P风险的源头。根据借款对象,P2P模式较为多样,可以是“to C”,对个人,可以是“to B”,对企业,还可以是“to G”,对政府。按照借款模式,可以是纯信用贷,如消费贷和小微企业用于经营的贷款,可以是抵/质押贷,如房/车抵押贷。不同对象的不同模式对应着不同风险,通常来说有抵押的相对安全,一旦借款人出现逾期坏账后,平台能将抵押资产进行处置变现,从而保障投资者的权益。另外,需要关注的是尽管P2P的资金用途十分广泛,底层资产相对丰富,可以投向消费贷、信用贷、车贷、房贷、供应链金融、委贷、配资、保理等多个方向,但根据监管有些投向是明令禁止的,如现金贷、校园贷、首付贷、股票投资、股票配资、期货合约、机构化产品、其他衍生品、股权众筹等。投资者可在规定的投向内根据平台给出的产品借款人相关信息,结合自身的风险偏好进行初步选择。
 
第二,投资收益。投资收益是不少P2P投资者最为关注的因素。虽然P2P产品相对银行理财、银行存款等理财方式收益明显较高,但是需要注意的是高收益伴随着高风险,切勿盲目追求高收益,投资者应结合自身的风险承受能力慎重选择。日前中国银保监会主席郭树清在“2018陆家嘴论坛”上提出“高收益意味着高风险,收益率超过6%的就要打问号,超过8%的就很危险,10%以上就要准备好损失全部本金的风险”,2018年7月P2P行业的综合收益率9.76%,主流综合收益率区间分布在8%-12%,占比为65.50%,甚至超过22.68%的平台收益率超过12%,这也难怪P2P投资存有危险。因此,P2P投资者应时刻谨记这句话,将其作为P2P产品选择的重要指南,透过产品收益正视背后的投资风险。
图7  近一年中国P2P综合收益率在9.50%-10%区间
数据来源:网贷之家  如是金融研究院
图8 中国P2P收益率集中于8%-12%区间,占比高达65.50% 
数据来源:网贷之家  如是金融研究院
第三,担保机制。担保是借款人违约后的最后一道屏障。P2P产品常见的有三种担保机制,除了上文提到不合规的平台提取风险备付金外,还有第三方担保和保险公司两种担保机制。第三方担保是担保公司为借款人提供担保,一旦借款人无力偿还,担保公司代为履约,保障投资人的本金与收益。这种情况下,重点关注担保公司的实力,避免关联互保。另一种担保机制是保险公司为平台提供信用保证保险,分为履约险和账户安全险,履约险较为靠谱,如果借款人无法履约,由保险公司进行赔付,不过要事先留意赔付的范围,分清赔付的是本金还是本息。账户安全险仅保障投资人资金在平台账户中的安全,不保障投资本息。因此,投资人在选择产品时,应仔细查阅产品说明,明确是否有担保机制及其对应的担保范围。
 
综上所述,我们可以得出几点结论:第一,中国式P2P和国外P2P存有很大的差异,之前由于监管不到位积累了很多问题,现在金融去杠杆的大环境下,自融自用、短期诈骗、庞氏骗局等雷点被引爆,行业将加速出清。第二,P2P模式本身没有原罪,未来中国式P2P不会绝迹,规范的P2P平台仍有生存空间。投资者应理性看待P2P投资。第三,P2P投资最重要的是选平台,应结合平台实力、合规判断、风险保障、团队能力四个方面选择,并重点关注产品的资金投向、投资收益、担保机制,选择靠谱P2P产品。 
扫描下面二维码即可关注投行圈子
 
文章来源:如是金融研究院

敢偷用我的WiFi? 看我怎么治你

 

我的邻居正在盗用我的WiFi,唔,对此我可以直接选择加密口令,或者…作为一名极客我也可以耍耍他。
划分网络
那么,我就从划分网络开始吧。我把网络划分成两部分,受信任部分和非受信任部分。受信任部分组成一个子网,而非受信任的部分组成另一个不同的子网。我通过DHCP服务器来辨识MAC地址,以此得到相关的地址信息。下面就是我的/etc/dhcpd.conf配置文件。

Iptables太好玩了!
嗯,接下来我用iptables工具来对流量做些手脚。我是这么干的:
/sbin/iptables –A PREROUTING –s 192.168.0.0/255.255.255.0 –p tcp –j DNAT –to-destination 64.111.96.38
噢,突然所有东西都变成小猫咪了!对于那些缺乏经验的新手,现在他们所有的流量都会重定向到http://www.kittenwar.com/去,小猫咪可爱吗?
还不够,我想玩的更爽一些。我继续设定iptables规则,让所有流量转发到我的一台运行有squid代理程序的本地计算机上,端口设为80。
/sbin/iptables –A PREROUTING –s 192.168.0.0/255.255.255.0 –p tcp –m tcp –dport 80 –j DNAT –to-destination 192.168.0.1
这台本地机器上运行有squid,其中带有一个小的重定向功能,可以自动下载图片,然后通过mogrify(一个图片修改程序)将图片弄成上下颠倒,再输出到本地的Web服务器上。
下面就是我的重定向脚本代码,这是个小的perl程序:

好了,大功告成!现在浏览网页时会变成下面这样:

再来一张,:D

如果你修改一下上面的代码,将-flip替换为-blur 4,那么你的图片就会有模糊效果。

这些人不会以为他们的电脑坏了吧?:D
对此,我甚至做了一副漫画,很酷吧?
之后我收到了一封邮件,噢,是kittenwar网站的人发给我的,他是这么说的:
Hi Pete,
抱歉没跟你打招呼就给你发了这封邮件,但是,我想告诉你的是,对于你把图片弄的上下颠倒以此来捉弄那些偷用WiFi的人,这个点子真是太赞了。
我常常会收到措辞语气极为愤怒的邮件,这些人说我的网站kittenwar在玩弄一些邪恶的病毒,阻止他们正常浏览网页,他们控告我不要再搞这些黑暗的法术了。对这些人我只会有礼貌的回复到:对此我真的很不好意思,但这种情况只会发生在您盗用别人的WiFi连接时才会出现。过去几年里这种事情发生了数十次,但是你知道吗?当我指出他们盗用WiFi的事实之后,就再也没有收到回复了。

汪中求:中日国民素质有30年的差距

一位中国精细化管理专家,准备利用一年的时间考察精细化管理开展最好的日本、德国、新加坡三国。在第一站日本,我们的专家认识到:过去我们只知道日本企业家长于精细化管理,而这种精细化的思想,其实早已根植于日本社会的方方面面。

  今年夏天,笔者作为中国精细化管理考察团的一员,对日本的企业、大学和政府的招商机构进行了为期一周的考察。一周的所见所闻,我们对日本企业、机构的精细化管理有了深切的体会,更让我们感到震撼的是,这种精细化思想已经深深根植于这个国家的方方面面之中。一位中国教授说:“即使中国现在跟日本在一个起跑线上,我们也未必能够赶上日本。”

  虽然时隔半年,但我觉得有必要将一些见闻记录下来。而当我准备将此文公开发表的时候,我却不由得担心:会不会有人看了此文,就认定汪中求没有民族自尊心了呢,甚或干脆就说我已经是今日的汉奸?

  压力驱使着日本人拼命工作

  日本人背后似乎有一只看不见的手,驱使着他们拼命地工作,而且在工作中互相督促、精益求精。

  自觉遵守与相互督促

  工作时间,日本男性白领最常见的装束是西装、衬衫加领带,即使夏天室外40多摄氏度的高温也是如此。大热天裹着这么正规的装束,因此业务员在街上中暑昏倒的事情也就不足为奇了。不仅是白领,连出租车司机也都西装革履,尽管热得不停擦汗,但就是不会把外套脱下来。事实上可能没有谁管,但这是他们的职业化习惯。

  在日本街头,经常可以看到60多岁的警察或保安在跑步指挥车辆,专心致志。书店的工作人员趴在地上擦地,跪下来工作是再正常不过的事情了。我们去酒店用餐,进餐厅时把鞋子乱糟糟地脱在一起,出来时发现服务员都给我们摆好了,一律头朝外,一伸脚就可以穿上。

  在任何单位,如果有人做事不努力或者把事做砸了,就会有好多“好管闲事”的人上来指责:“哎呀,纯子小姐,怎么这么做事啊?”“木村先生,你的失误,让我为你没面子啊!”我跟日本朋友总结说:“日本人是宁可自己付出更多,也必须要获得或保留干预和指责他人的权利。”朋友回答说:“真的是这样。这是一种氛围,逼着你提高。”

  忙工作忙得没时间做梦

  如果工作的事情没有做完,日本人是不可能下班的,这是他们的一种习惯,很多根本没法一下做完工作的人就只好推迟下班。一天晚上8点来钟,我们路过世界500强之一的住友公司门口,大批员工那个时候才下班。我们很迷惑,是集体加班还是其他什么原因?晚上11点半,我们在地铁站看到人流如潮。不少人一天打两份工,一上车就睡着了,太累了。

  在日本,男士平均结婚年龄是35岁,当父亲的平均年龄是36岁。很多人甚至都不敢结婚,不敢生孩子的人更多,特别是职业女性。因为女人一生孩子往往就意味着职业生涯的结束。女人不出来工作,主要原因是小孩没有办法给别人带。请一个人带孩子,比自己打一份工还贵,自己带孩子五六年,没办法再跟得上社会的发展,只好继续做家庭妇女。

  我觉得是政治家在逼日本人拼命,政府的政策迫使你不得不努力。日本人的所得税非常高,45% ;遗产税更高,70%.不能让你把钱存在那里,为自己养老做准备。到65岁,才有可能靠政府的津贴来养活自己,这个时候才可以不拼。

  国家给你的压力太大了,所以必须拼命地干。有位日本朋友跟我说:“日本人不做梦,哪有时间做梦!”听完,我莫名其妙地伤感。

  人际互信与秩序共守

  尽管压力巨大,但日本人的生活却从容而有秩序。这点从东京市容的细节上就能感受得到,绿化率极高,几乎没有见到裸露的土地,即使偶尔有一个小角落空出来,都会种上一株树或摆上几盆花。

  路不拾遗

  东京的房子一般不装防盗门,很多门是非常薄的木板门和玻璃门。偶尔一楼有防盗网,二楼以上我从未看到防盗网。我们很惊讶,他们怎么不担心入室盗窃的问题?此外,多数自行车是不上锁的,连摩托车晚上也是丢在外面,根本不担心什么。

  在火车上、在旅店、在会议室,甚至在餐厅,再值钱的包,放在那里根本没有人动。京都火车站人流如织,旁边的餐厅人来人往,餐桌上七八个包丢得零零散散,并不见一个人。所以西方人老听中国人说,“你先去,我在这儿看着。”人家始终不懂这话什么意思,你“看”它干什么?

  我们住过的几个酒店没有“查房”之说,你走了就走了,把牌子放在那里,把费用结清就可以。而在中国住酒店,离开时“查房”的程序必不可少,很多酒店还有物品损害赔偿价格表,表现出一种非常深刻的不信任。我们的一位老师,在日本坐地铁,西装放在衣架上忘了取。而捡到的人帮他寄到下一站,等他来取,而且烫好、折好。

  在商业闹市区,经常看见女士将翻盖手机架在牛仔裤后兜上逛街,就这么着,谁也不在乎。还见过一个女士,背一个很大的包,朝外的第一个口袋就是钱包,我在1米外都可以看得见,她就这么逛,没有觉得有什么危险。

  我们总觉得贫富差距过大才会有抢劫盗窃,实际上不完全是这样。日本也有穷的,至少从各地去的人也有穷的,而且也有流浪者。我这次还找了一个街头艺术家给我画了一幅漫画像,标价1600日元。他画完以后,自己感觉画得不好,就只收了1000日元,还一个劲地道歉。

  堵车但秩序井然

  日本人很讲究秩序。排队是正常的,而且自觉保持1米距离。在自动扶梯上,人们都很谦和地站在左侧,让有急事的人从右侧快速通过。

  在东京,我们见过几百人在一个路口等红灯,没有一个人乱闯的。车辆在通过路口时也没有减速的意思,因为所有的人都一定会遵守交通规则,不需要减速,也不可能出现意外。但是,在红灯转为绿灯的时候车辆反而慢下来,车可以通行,走到一半的行人也可以通行,只要有一个人还在穿越,车辆就会让人,这个时候就体现出了“以人为本”。

  日本的路并不一定都很宽阔,很少看见超过单向四车道,甚至还有主要公路是双向单车道。有一次高速路堵车,但还不至于堵得不能行走,只是慢,绝对没有人插队,更没有人急着猛打喇叭。

  我们的团队每到一家酒店,酒店都有人到前面的路口迎接,指挥车辆怎么开进去,停在什么地方。我们住过的几家酒店,都有一个牌子竖在大堂,写明“某某团队”什么时候出团,并按照时间顺序排好,这样可以避免若干团队一起出发造成拥挤。如果时间安排出现冲突,酒店会建议某些团队推迟五分钟或者十分钟出发。

  深刻的危机意识

  日本的版图大概相当于我们一个四川省,但人口密度却比四川还要大。地狭人多,又没什么资源,而且台风、海啸、地震非常频繁,从这个角度来讲,日本是一个非常可怜的国家。正因为如此,日本人有深刻的危机意识。

  吃一次涮肉也会觉得无比幸福

  日本的学校每月一次防火演习,每季度一次防震演习。每个家庭都备有压缩防灾包,里边搁压缩饼干、纯净水、保暖衣、手电筒和雨披。日本全社会从上到下都只有一个信念,我自己要拼命,如果不拼命这个国家就完了。

  我们去考察丰田汽车公司,丰田做汽车之前,整个日本是没有汽车工业的,那时的汽车他们叫“自动车”。造“自动车”最早也是由丰田第二代领导人提出来的。他去考察英国的汽车,回来就发奋自己做,把原本很挣钱的纺织放弃了。由于不分白天和黑夜地努力,这个人只活了50来岁。为了民族的发展和国家的进步,日本很多人都是甘愿做出自我牺牲。

  日本虽然是汽车大国,但企业中层及以下员工几乎都不可能开车上班,因为停车费奇贵。东京的许多停车场,100日元只能停车15分钟。多数日本人都买得起车,但是没多少人负担得起停车费!

  在我们看来,日本这么发达一个社会,一般人吃饭应该不成问题。但日本人正餐也吃得很少:菜只能遮住一个小碟子的底部,米饭也只有一小碗。我总怀疑日本人很少吃饱饭。至少我在日本工作的朋友,如果哪天能开怀吃一次涮肉,会觉得幸福无比。真不懂日本人这样是为了健康保持七分饱呢,还是为了贯串一种压力意识?

  租房要给房东感恩费

  日本人住房压力非常大。我大胆猜测这也是日本政府刻意为之。

  日本房价高是全球出了名的,东京的住房均价是每平方米60万日元(约合人民币4万元),一个人辛苦一辈子可能也只能混一个小房间。普通人根本买不起住房,买得起的白领也不过买四五十平方米的小房子。

  最奇怪的是日本的租房方式:不仅租金特别高,而且首付得5个月租金。除了当月租金、押金(相当于两个月租金)、中介费,还有一笔感恩费要付给房东。很难理解,日本市场化程度那么高,房客反而要向房东支付感恩费?我觉得他们的政府是故意这么干的,使得整个民族从上到下都特别紧张。

  出租车司机给学生上社会课

  日本学生上课并不完全在学校内,他们经常把学生拖出去学习。到风景点去参观,去看祖先怎么拼的;到企业去参观,看企业是怎么发展的。让你去思考,看你能否跟得上时代,能否适应社会需要。严格来讲,这是他们的公民意识教育和思想教育,或者叫德育。

  他们对德育很重视,投入也非常大。我们去参观世界文化遗产清水寺,就碰到很多中学生。学生不是老师带队,而是由出租车司机领着。一个出租车司机带四个学生,他会把社会上很多事情讲给学生听,一两个小时不停地跟学生讲,这是司机必须做的。学生做笔记,回学校还要写感想。

  日本整个民族忧患意识非常重,小学课本就告诉学生:这个国家生存是很艰难的;这个国家处境是非常危险的;这个国家是可能随时被别人打垮的。尽管日本历史上,从来没有外来侵略者能够深入日本的本土(二战美国的占领不算侵略),但是日本政治家始终认为外族强盛了,就一定会打进来,别人发达了日本的生存空间就相对萎缩了。

  中日国民素质30年的差距

  日本社会流传一句话:“管好自己,不给社会添麻烦。”每个人都是这么一个信念,整个社会公民素质就非常高。

  瓶子扔掉前还要将商标撕掉

  日本居民在街上如果一时找不着垃圾桶,就把垃圾带在身上,回家放进自家的垃圾桶。有一位陪同我们的女士,我们有人告诉她:“小姐,你身上有两根头发。”“很抱歉。”她一边说一边把头发取下来,用一张餐巾纸包好,放进自己的口袋。

  在自助餐厅吃饭,人人用完餐都会自己收拾桌面,桌上洒的几滴汤会用纸巾擦去,杯盘碗筷收到集中存放的地方。

  抽烟的人当然还有,但绝不会有人乱弹烟灰、乱扔烟头,在街边吸烟都会带上一个便携式的烟灰缸(我就特意从日本买回来两个便携式烟灰缸)。

  在公共场所遛狗的人士,身上一定带着垃圾袋,狗一拉屎,马上小心翼翼地扫起来装到垃圾袋带走,再用纸巾把地面擦干净。

  我认为人类的文明和垃圾的处理紧密相关。垃圾的处理可分为四个文明阶段:

  第一个阶段是“随地吐痰阶段”,既然随地吐痰就会随地甩垃圾;

  第二个阶段是“集中堆放阶段”,北京现在处于这个阶段,垃圾开始集中堆放,不乱丢;

  第三个阶段是“分类处理阶段”,日本把垃圾分成三类:可燃物、不可燃物、瓶罐器皿。个人认为中国包括北京在内的大部分城市还没有真正到达这个阶段;

  第四个阶段是“精细管理阶段”,就不止是三类分放了。比如,通常人们会在可乐喝完后把瓶子扔到垃圾桶了事,而日本人会把可乐瓶上的商标纸撕掉,丢进可燃物的垃圾桶,再把瓶子塞到装瓶罐的垃圾桶内(因为瓶罐回收后也需要工人把商标纸撕掉)。

  同样,家里用完了的酱油瓶,日本人往往会用清水把瓶子先洗一洗,再放到垃圾桶里,因为回收后也需要清洗的。摩丝类产品的空瓶子,日本人在扔进垃圾桶之前,会先给瓶身扎一个孔,以免存在不安全隐患。

  顺便提及,日本东京有若干大型垃圾处理厂,当然有很高的烟囱,只是烟囱并不冒烟,而且垃圾厂附近必有一个体育场。垃圾焚烧的余热可以供体育场的游泳池保持水温,还可以让大家健身的时候理解自己和垃圾的关系、人和环境的关系。

  管好自己,不给社会添麻烦

  日本人出门都喜欢带一把伞,而且是长柄的伞(很多出门的人,旅行箱旁边也插一把长柄伞)。所有的公共场所都有一个机器,里面是塑料袋,把伞往里面一插,套一个袋子再拉出来,提着雨伞进屋内就不会有水滴出来。我们在日本那么多天,只有一天是晴天,但从未感到哪儿湿漉漉的。连公交车上也都有一个放置雨伞的桶。到一些名胜参观,进室内,得把雨伞和鞋子放在门外,等回来再取;如果不从原路返回,就用垃圾袋将鞋装着,提在手上,出口处必定会有一个箱子,用来收集装鞋的垃圾袋。

  日本人非常彬彬有礼,一天到晚地鞠躬。我觉得,这种东西不只在表面,是从内心深处对社会的一种认同,知道自己的渺小。大公司的高层也总是低着头走路,微闭着眼睛,自我收缩,甘为渺小。这事实上是一种境界:把别人看得比较高大,把自己看得很卑微。

  我们去参观了两所大学,和中国的大学很不一样,没有围墙,也没有气派的门楼,不起眼的大门上只有很小的一块牌子,非常普通。就连丰田那么大的公司,总部大楼也并不奢华,牌子也是很小的一块,很低调,不那么嚣张。

  一位在中国、美国、日本三地的大学都工作过很多年的中国教授曾跟我说:“即使中国现在跟日本在一个起跑线上,我们也未必能够赶上日本。国民素质相差30年。”

  虽然我们不喜欢听,但是我能理解,确实国民素质是不一样。

  作者简介:汪中求,清华大学特聘教授,精细化管理研究专家,著有《细节决定成败》

  来源:中国商业评论

用代理自动配置文件PAC给iPhone和iPad设备添加socks代理

iOS实际上支持socks代理的,但在 iPhone和iPad设备的

Setting -> WLAN 下只能看到HTTP Proxy

HTTP Prxoy有3种模式: 关闭Off/手动Manual/自动Auto

用自动配置文件,就可以支持socks代理

1
2
3
4
function FindProxyForURL(url, host)
{
     return "SOCKS proxy_host:proxy_port";
}

将上面的proxy_host和proxy_port换成socks服务器实际的IP地址和端口
然后保存为 proxy.pac
放到 http://you_http_server/proxy.pac

在 iPhone设备中,添加自动配置 URL 为上面的地址,就可以使用socks代理了

扩展1:
局域网流量不要用代理

1
2
3
4
5
6
7
function FindProxyForURL(url, host)
{
    if (isInNet(host, "192.168.1.0", "255.255.255.0"))
        return "DIRECT";
 
    return "SOCKS proxy_host:proxy_port";
}

参考资料  代理自动配置(Proxy Auto Config)

一个PAC文件包含一个JavaScript的函数”FindProxyForURL(url, host)”. 这个函数返回一个包含一个或多个访问规则的字符串。用户代理根据这些规则适用一个特定的代理其或者直接访问。 当一个代理服务器无法响应的时候,多个访问规则提供了其他的后备访问方法。 浏览器在访问其他页面以前,首先访问这个PAC文件。PAC文件中的URL可能是手工配置的,也可能是是通过网页的网络代理自发现协议(Web Proxy Autodiscovery Protocol)自动配置的。

为了完整性和最佳的兼容性,我们应该设置网页服务器(apache或者nginx,lighttpd等等)将这个pac文件的MIME类型声明为 application/x-ns-proxy-autoconfig 或者 application/x-javascript-config
对于现代浏览器来说,两种mime类型都没有问题, 但 application/x-ns-proxy-autoconfig 相对 application/x-javascript-config 被更多的客户端所支持, 因为它被定义在最初的Netscape规范里

FindProxyForURL的返回值,可以是以下3种之一,或者是它们的组合

DIRECT
直接连接,不使用代理

PROXY host:port
   使用指定的http代理

SOCKS host:port
   使用指定的SOCKS代理
如果是多个组合,要用 分号;拼接起来
并且,放在最左边的优先级最高,如果最左边的失败,依次往右边尝试

如果最左边的代理服务器挂掉了,并且你在右边没有指定DIRECT选项, 浏览器应该会问你
代理服务器挂了,能不能临时忽略它,直接连接网络?

参考资料  PAC Functions (强烈推荐)
Navigator Proxy Auto-Config File Format (NetScape原始规范)
The Practical Proxy PAC file guid (最最强烈推荐)

shExpMatch(str, shexp)
第1个参数str, 待比较的任意字符串,一般是url或者host
第2个参数shexp是shell表达式,随意可以有*号通配符

isPlainHostName(host)
如果host是不含有”.”, 说明是一个主机名, 就返回true;
如果有点号,说明是一个域名, 返回false
host是从URL中分离出来的主机名(不包括端口号)

isInNet(host_or_ip, pattern, mask)
这个函数将会考察第1个参数 ip地址 (如果传入的参数是主机名,会被自动转换为ip地址)
看它是否在 第2个参数pattern 和 第3个参数 mask 决定的子网络范围内

例如

1
2
3
4
5
if (isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0"))
    return "DIRECT";
 
if (isInNet(myIpAddress(), "10.10.1.0", "255.255.255.0"))
    return "PROXY 10.10.5.1:8080";

其中myIpAddress() 返回 浏览器所在的主机的当前IP地址, 很多时候这是个局域网地址

dnsResolve(host) 将host解析为ip地址

1
2
3
4
5
6
var resolved_ip = dnsResolve(host);
if (isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
    isInNet(dnsResolve(host), "172.16.0.0""255.240.0.0") ||
    isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
    isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))
    return "DIRECT";

这段必须用上啊

dnsDomainIs(host, domain)

if (dnsDomainIs(host, “.google.com”))
return “DIRECT”;

其中host是从URL分离出来的主机名

localHostOrDomainIs(host, hostdom)

if (localHostOrDomainIs(host, “www.google.com”))
return “DIRECT”;

hostdom 是 域名全称
host 既可以是 域名,也可以是 简短主机名
如果是域名,必须完全同 hostdom 匹配
如果是主机名,必须同 hostdom的主机名 要完全匹配

isResolvable(host)

dnsResolve(host)

dnsDomainLevels(host)

dnsDomainLevels(“www”)

返回 0

dnsDomainLevels(“www.netscape.com”)
返回 2
调试是个大问题
PAC是一个javascript脚本,浏览器在每次请求一个URL之前,都会运行它.
但它和普通的js脚本有点不同

1)在PAC中,有个几个特殊的函数,它只能在PAC运行,在普通的js脚本运行会报告
“is not defined”
比如 shExpMatch

2)PAC的执行,也不支持js的所有特性.

3)在不同的浏览器中,对pac脚本的执行有着不同的实现方式.
可以用Firefox的错误控制台来查看错误信息
IE也支持alert()
并且 pac文件可以存在于本地文件系统
用 file:///var/run/x.pac 这样的路径
而不要用 http ,方便调试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function FindProxyForURL(url, host)
   {
       if (isPlainHostName(host) || dnsDomainIs(host, ".mydomain.com"))
           return "DIRECT";
       else if (shExpMatch(host, "*.com"))
           return "PROXY proxy1.mydomain.com:8080; " +
                  "PROXY proxy4.mydomain.com:8080";
       else if (shExpMatch(host, "*.edu"))
           return "PROXY proxy2.mydomain.com:8080; " +
                  "PROXY proxy4.mydomain.com:8080";
       else
           return "PROXY proxy3.mydomain.com:8080; " +
                  "PROXY proxy4.mydomain.com:8080";
   }

我的最终版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function FindProxyForURL(url, host)
{
    url  = url.toLowerCase();
    host = host.toLowerCase();
 
    if (isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
        isInNet(dnsResolve(host), "172.16.0.0""255.240.0.0") ||
        isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
        isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))
        return "DIRECT";
 
    if (shExpMatch(url,"*twitter*")  ||
        shExpMatch(url,"*facebook*") ||
        shExpMatch(url,"*blogspot*") ||
        shExpMatch(url,"*youtube*") ||
       )
    {
       return "SOCKS 1.2.3.4:1080; DIRECT";
    }
}

Chrome在Linux下没有代理配置界面,但可以通过命令行参数配置

–proxy-server=host:port
–no-proxy-server
–proxy-auto-detect
–proxy-pac-url=URL

pac就用
–proxy-pac-url=file:///var/run/autoproxy.pac

新的浏览器支持正则表达式
如果需要做一些较为复杂的判断,那可直接抛弃 shExpMatch 函数,而自己使用正则表达式或别的工具来进行判断,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
var regexpr = /[a-zA-Z]{4}.microsoft.com/;
    if(regexpr.test(host))
        return "PROXY w3proxy:8080; DIRECT";
 
调试,使用alert,在IE上没问题
 
 
function isMatchProxy(url, pattern) {
    try {
        return new RegExp(pattern.replace('.', '.')).test(url);
    } catch (e) {
        return false;
    }
}
 
function FindProxyForURL(url, host) {
    debugPAC ="PAC Debug Informationn";
    debugPAC +="-----------------------------------n";
    debugPAC +="Machine IP: " + myIpAddress() + "n";
    debugPAC +="Hostname: " + host + "n";
    if (isResolvable(host)) {
        resolvableHost = "True"
    } else {
        resolvableHost = "False"
    };
    debugPAC += "Host Resolvable: " + resolvableHost + "n";
    debugPAC += "Hostname IP: " + dnsResolve(host) + "n";
    if (isPlainHostName(host)) {
        plainHost = "True"
    } else {
        plainHost = "False"
    };
    debugPAC += "Plain Hostname: " + plainHost + "n";
    debugPAC += "Domain Levels: " + dnsDomainLevels(host) + "n";
    debugPAC += "URL: " + url + "n";
    alert(debugPAC);
    var Proxy = 'SOCKS 1.2.3.4:9625; DIRECT';
 
    var list = [
        't.co',
        'twitter.com',
        'twimg.com',
        'posterous.com',
        'tinypic.com',
        'twitpic.com',
        'bitly.com',
        'yfrog.com',
        'youtube.com',
        'facebook.com',
        'appspot.com',
        'dropbox.com',
        'flickr.com',
        'youtube.com',
        'ytimg.com',
        'plus.google.com',
        'ggpht.com',
        'talkgadget.google.com',
        'picasaweb.google.com',
        'googleusercontent.com',
        'hzmangel.info',
        'slideshare.net',
        'code.google.com',
        'golang.org',
        'vimeo.com',
        'wordpress.com',
        'dxtl.net',
        '123cha.com'
    ];
 
    for(var i=0, l=list.length; i<l; i++) {
        if (isMatchProxy(url, list[i])) {
            alert("Match");
            return Proxy;
        }
    }
 
    alert("direct");
    return 'DIRECT';
}

在PAC中,Firefox和Internet Explore都支持alert语句,IE的表现同普通js一样
Firefox是在  ”浏览器控制台”(Ctrl+Shift+J快捷键调出来) JS标签 里显示出来:


[21:32:29.568] PAC-alert: PAC Debug Information

Machine IP: 192.168.1.99
Hostname: zhiwei.li
Host Resolvable: True
Hostname IP: 199.188.204.95
Plain Hostname: False
Domain Levels: 1
URL: http://zhiwei.li/

正则表达式的另外一个例子

由于.pac 文件支持整个 JavaScript 语言,可以使用正则表达式对象,并测试方法来测试对照正则表达式的字符串。下面的代码示例演示如何使用.pac 文件中的正则表达式对象:

1
2
3
4
5
6
7
8
9
10
11
function FindProxyForURL(url, host)
{
    // For instance, if the server has 4 alphabetic characters,
    // such as "MSDN", route it through a specific proxy:
   var regexpr = /[a-zA-Z]{4}.microsoft.com/;
   if(regexpr.test(host))
      return "PROXY w3proxy:8080; DIRECT";
 
   // Or else connect directly:
   return "DIRECT";
}

http://technet.microsoft.com/en-us/library/dd361950.aspx (微软给的例子)

验证工具

https://code.google.com/p/pacparser/   (支持Python和C)

http://www.jslint.com/ (验证你的js语法)

Debian Jessie中的IceWeasel 24.1.0 对 PAC的支持有问题,
Windows版本的Firefox 26.0就能很好的支持
解决方法,安装 扩炸  foxyproxy
xul-ext-foxyproxy-standard 或者从mozilla addons下载

SOCKS SOCKS4 SOCKS5的问题

“SOCKS host:port”
有的浏览器使用SOCKS4协议,也支持DNS 解析  (IceWeasel 的代理管理,就是这个做法, 但是SOCKS4实际上是不支持 DNS解析的,socks5服务看到协议版本是4, dns请求是未知的,就会直接关掉连接
所以, 你在 firefox里选中socks4协议,就不要 让 extensions.foxyproxy.socks_remote_dns 这个选项为true
但是,如果不做远程dns的话,伟/大的-城_墙 会污染DNS)

有的浏览器使用SOCKS4协议,但不支持 DNS解析
有的浏览器直接使用SOCKS5协议,当然就支持 DNS解析了 (foxyProxy扩展,看到 SOCKS,就直接用SOCKS5了,相当聪明)

“SOCKS5 host:port”   明确说明要用 SOCKS5 代理
据说 Safari (OSX, iOS)只认识SOCKS,虽然它默认也是使用SOCKS5协议

SOCKS5 127.0.0.1:1080; SOCKS 127.0.0.1:1080; DIRECT
这种写法可以兼容绝大数浏览器
对于不认识的SOCKS5,丢掉,认识的SOCKS直接用.

---------------

使用 pac 文件来实现自动代理

pac(proxy autoconfiguration)文件其实就是一个 JavaScript 文件,文件扩展名是什么其实没有关系,但一般都名为 pac

pac 文件中必须包含 FindProxyForURL(url, host) 的函数,支持 pac 自动代理的浏览器将会根据这个函数来判断当前访问的网址走何种通道。最简单的示例如下

function FindProxyForURL(url, host) {
    return 'DIRECT';
}

上面那段代码说明对于所有 url,都直连,不走任何代理。

FindProxyForURL 函数除了可以返回 “DIRECT” 外,还可以返回指定类型、主机和端口的代理。如:

// 本地 3721 端口的 http 代理
"PROXY 127.0.0.1:3721"

// 本地 8080 端口的 socks5 代理
"SOCKS5 127.0.0.1:8080"

可以同时指定多个方式,从第一种开始,一种无法连接使用下一种,直到成功或最后失败,如:

return "PROXY 127.0.0.1:3721; SOCKS5 127.0.0.1:8080; DIRECT";


pac 文件可使用很多已预定义的函数,但在目前为应对封锁的环境中,常用的是功能是让被封锁网址走代理,普通的直连。因此,常用的一个功能函数是:shExpMatch(str, shexp)

shExpMatch 函数是判断字符串 str 是否满足 shexp 表达式。需要注意的是,尽管有着 exp 之名,但 shexp 是仅支持 ? 和 * 通配符的表达式,而非 JavaScript 中的正则表达式,如:

// google 网站走代理,别的直连
function FindProxyForURL(url, host) {
    if (shExpMatch(url, "*.google.com/*")) {
        return 'PROXY 127.0.0.1:3721';
    }

    return 'DIRECT';
}

如果需要做一些较为复杂的判断,那可直接抛弃 shExpMatch 函数,而自己使用正则表达式或别的工具来进行判断,如:

function FindProxyForURL(url, host) {
    // For instance, if the server has 4 alphabetic characters, 
    // such as "MSDN", route it through a specific proxy: 

    var regexpr = /[a-zA-Z]{4}.microsoft.com/;
    if(regexpr.test(host))
        return "PROXY w3proxy:8080; DIRECT";

    // Or else connect directly:
    return "DIRECT";
}

这样,当浏览器支持 pac 自动代理的话,所需要做的工作就是写好 FindProxyForURL 函数,收集好所有的网站数据,然后启用即可,如:

function isMatchProxy(url, pattern) {
    try {
        return new RegExp(pattern.replace('.', '\\.')).test(url);
    } catch (e) {
        return false;
    }

}

function FindProxyForURL(url, host) {
    var Proxy = 'SOCKS5 127.0.0.1:7070; DIRECT;';

    var list = [
        't.co',
        'twitter.com',
        'twimg.com',
        'posterous.com',
        'tinypic.com',
        'twitpic.com',
        'bitly.com',
        'yfrog.com',
        'youtube.com',
        'facebook.com',
        'appspot.com',
        'dropbox.com',
        'flickr.com',
        'youtube.com',
        'ytimg.com',
        'plus.google.com',
        'ggpht.com',
        'talkgadget.google.com',
        'picasaweb.google.com',
        'googleusercontent.com',
        'hzmangel.info',
        'slideshare.net',
        'code.google.com',
        'golang.org',
        'vimeo.com',
        //'appengine.google.com',
        'wordpress.com' 
    ];


    for(var i=0, l=list.length; i<l; i++) {
        if (isMatchProxy(url, list[i])) {
            return Proxy;
        }
    }
    return 'DIRECT';
}
----------------------

Chrome 使用 pac 来自动代理

之所以有此文,是因为忘记在哪个版本起 Chrome 的如 ProxySwitchy 等扩展就有问题了,在代理方面很有问题,没有 Firefox 下的 autoproxy 稳定。在过了一阵子需要翻只能开 FF 的时间后,决定还是看看 Chrome 下该如何解决这个问题。

查看 chromium / google-chrome 的帮助命令,将可以看到和代理(proxy)有关的有:

--proxy-server=host:port
--no-proxy-server
--proxy-auto-detect
--proxy-pac-url=URL

可以看到,Chrome 是支持指定 pac 文件来自动代理的。这样,便可以使用"使用 pac 文件来实现自动代理"一文提到的 pac 文件了。

这样,便可以通过类似下面的命令来启动带自动代理功能的 Chrome 了。

google-chrome --proxy-pac-url=file:///home/user/autoproxy.pac

对于 Windows 环境,直接把 --prox-pac-url=pac-file-path 参数加到快捷方式属性中的『目标』属性的后面即可。

对于 Ubuntu 环境,Chromium 可以通过把这个参数写进 /etc/chromium-browser/default 文件中的 CHROMIUM_FLAGS 变量;对于 google-chrome,暂时没找到方便写配置的地方,干脆直接写个 sh 文件,把整条命令加进去吧(可在命令后加 & 来达到终端关闭浏览器依然存在的目的)

------------------------------------

PAC一般使用一个proxy.pac文件作为配置,若使用http服务器提供pac文件,建议使用的MIME是application/x-ns-proxy-autoconfig

pac文件中其实是javascript代码,其中包含一个重要的函数:

1
function FindProxyForURL(url, host);

浏览器会将请求的URL与主机名传入到这个函数进行查询,函数FindProxyForURL返回一个包含代理服务器信息的字符串,浏览器根据这个字符串使用对应的代理服务器链接网络。

一个简单的pac文件如下:

1
2
3
function FindProxyForURL(url, host) {
return "PROXY proxy.example.com:8080; DIRECT";
}

在这个文件中,所有的网络访问都会使用proxy.example.com:8080代理,若这个代理不可用,则会直接连接(DIRECT)。

 函数列表

在pac文件中可以使用的其他javascript函数如下:

dnsDomainIs 若host匹配google.com例如map.google.com等,则直接连接:

1
2
if (dnsDomainIs(host, ".google.com"))
return "DIRECT";

shExpMatch 若url以.local结尾或在domain.com/folder/目录下则直接连接:

1
2
if (shExpMatch(url, "*.local") || shExpMatch(url, "http://domain.com/folder/*"))
return "DIRECT";

dnsResolve DNS反查IP:

isInNet 若IP在127.16.0.0/12子网内则直接访问:

1
2
if (isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0"))
return "DIRECT";

myIpAddress 返回我当前的IP

1
2
if (isInNet(myIpAddress(), "10.10.1.0", "255.255.255.0"))
return "PROXY 10.10.5.1:8080";

isPlainHostName 若host中不包含“.”则直接访问:

1
2
if (isPlainHostName(host))
return "DIRECT";

localHostOrDomainIs

1
2
if (localHostOrDomainIs(host, "www.google.com"))
return "DIRECT";

isResolvable 若DNS可以被反查则使用代理:

1
2
if (isResolvable(host))
return "PROXY proxy1.example.com:8080";

dnsDomainLevels host中“.”的个数大于0则使用代理:

1
2
3
4
if (dnsDomainLevels(host) > 0)
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";

weekdayRange 周一到周五使用代理:

1
2
3
4
if (weekdayRange("MON", "FRI"))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";

dateRange 一月到三月使用代理:

1
2
3
4
if (dateRange("JAN", "MAR"))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";

timeRange 8:00到18:00使用代理:

1
2
3
4
if (timeRange(8, 18))
return "PROXY proxy1.example.com:8080";
else
return "DIRECT";

alert 函数并没有在PAC规范中指定,但IE与FireFox是支持的,用于调试:

1
2
resolved_host = dnsResolve(host);
alert(resolved_host);

 高级应用

一个复杂的pac文件示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function FindProxyForURL(url, host) {
 
// 一些不使用代理的域名
if (dnsDomainIs(host, ".intranet.domain.com") || shExpMatch(host, "(*.abcdomain.com|abcdomain.com)"))
return "DIRECT";
 
// 对于FTP和abcdomain.com/folder/下的请求不使用代理
 
if (url.substring(0, 4)=="ftp:" || shExpMatch(url, "http://abcdomain.com/folder/*"))
return "DIRECT";
 
// 局域网中的访问不使用代理
if (isPlainHostName(host) ||
shExpMatch(host, "*.local") ||
isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))
return "DIRECT";
 
// 如果我当前的IP地址在10.10.5.0/24子网内则使用代理
if (isInNet(myIpAddress(), "10.10.5.0", "255.255.255.0"))
return "PROXY 1.2.3.4:8080";
 
// 默认的,使用下面的两个代理做负载均衡
return "PROXY 4.5.6.7:8080; PROXY 7.8.9.10:8080";
}

 注意事项

有些浏览器,例如Firefox和Internet Explorer只支持系统缺省编码的PAC文件,不支持Unicode编码的PAC文件,例如UTF-8编码的PAC文件。

函数dnsResolv(及其他类似函数)在执行DNS查询时,如果DNS服务器没有回应,这个会导致你的浏览器被阻塞很长时间.