淘宝客链接劫持插件的原理,Chrome版

阅读完本文,你将了解淘宝客链接劫持插件,并且你也可以自己制作一个Chrome版的链接劫持插件。笔者在去年用这种办法成功实现过,作为对阿里妈妈所谓开放平台和限制淘点金代码的不满,公开插件原理!

原理:这里需要一个客户端和一个服务端,客户端就是插件本身,服务端就是用于转换链接的网站,这里需要一个通过阿里妈妈验证的网站,假设网址为http://abc.com。客户端将淘宝单品的URL编码为一个URL参数,比如单品URL,然后和网站的网址组合成一个完整的新的URL,比如http://abc.com?url=单品URL,网站再将参数转换回原来的网址,利用淘点金或者淘宝客API实现转换,网站再重定向到转换完的推广网址上去就实现了劫持。这里有个问题,定向到推广链后淘宝那边会再次被定向回单品URL,这回已经不用再转换了,如何避免再次被插件劫持?有个办法,从推广链定向后的单品URL带有自己的PID,只要让插件在检测到这个PID的时候不再劫持就OK了!

Chrome劫持插件:这里假设你已经知道如何开发Chrome插件,并且了解background。我们使用chrome.tabs.onUpdated这个事件接口,就可以让插件在Chrome要打开新的URL时候得到通知,并且获得即将打开的URL。代码如下:

chrome.tabs.onUpdated.addListener(
	function(tabId, changeInfo, tab){
		var pid = "123456";  // 自己的PID
		var server = "abc.com";  // 服务器端的URL
 
		var u = purl(tab.url);  // 用purl解析即将打开的单品网址
		var host = u.attr('host'); // 获得网址的主机头
 
		if(host.indexOf(".taobao.com") == -1 &&
			host.indexOf(".tmall.com") == -1)
			return; // 判断是不是淘宝或者天猫的链接,如果不是,返回,不转换
 
		var new_id = u.param('id'); // 获得单品id
		var ali_trackid = u.param('ali_trackid'); // 获得PID
 
		if(ali_trackid != null) {
			if(ali_trackid.indexOf(pid) > 0)
				return; // 如果有PID,并且是自己的PID,返回,不转换
		}
		if(host == "item.taobao.com" ||
			(host == "detail.tmall.com" && u.attr('path') == "/item.htm")) {
 
			if(new_id == null ||
				old_id == new_id)
				return;
 
			old_id = new_id;
 
			var url_go = "http://";
			url_go += host;
			url_go += u.attr('path');
			url_go += "?id=";
			url_go += new_id; // 重新组合成URL
 
			chrome.tabs.update(tabId, {url:"http://" + server + "/index.php?url=" + encodeURIComponent(url_go)}); //定向到服务器端转换
		}
	}
);

服务器端代码:PHP,淘点金版

<html dir="ltr" lang="zh-CN">
<head>
	<meta charset="UTF-8" />
	<title></title>
	<script type="text/javascript" src="js/purl.js"></script>
</head>
<body>
	<a id="urlhref" href="<?php echo $_GET['url'];?>" target="_self" data-rd="1" data-other="spm:2013">..</a>
<script type="text/javascript">
(function(win,doc){
var s = doc.createElement("script"), h = doc.getElementsByTagName("head")[0];
if (!win.alimamatk_show) {
s.charset = "gbk";
s.async = true;
s.src = "http://a.alimama.cn/tkapi.js";
h.insertBefore(s, h.firstChild);
}
var o = {
pid: "mm_123456789_1234567_12345678",
appkey: "",
unid: "",
  rd:1
}
win.alimamatk_onload = win.alimamatk_onload || [];
win.alimamatk_onload.push(o);
})(window,document);
 
  function firemousedown(ctrl){
    if (document.createEvent){
      var e1 = document.createEvent('MouseEvent');
      e1.initEvent('mousedown', true, false);
      ctrl.dispatchEvent(e1);
    } else if (document.createEventObject) {
      var evtObj = document.createEventObject();
      evtObj.button = 0;
      ctrl.fireEvent('onmousedown', evtObj);
    }
  }
var old_event = document.onreadystatechange;
document.onreadystatechange = function(){
	function oncomplete(){
		if((/complete/.test(document.readyState))){
			document.onreadystatechange = null;
			if(old_event)
				old_event();
 
			var sub = document.getElementById("urlhref");
			var u = sub.href;
			if(u == null || u == '')
				window.location.replace("http://www.taobao.com");
 
			u = u.replace(/#[^&]*/g, "");
			u = u.replace(/ali_trackid=[^&]*/g, "");
			sub.href = u;
<?php if(isset($_GET["focus"]) && $_GET["focus"] == 1) {?>
			firemousedown(sub);
<?php } else {?>
			var url = purl(u);
			var host = url.attr('host');
			if(host == "item.taobao.com" ||
				(host == "detail.tmall.com" && url.attr('path') == "/item.htm")) {
 
				firemousedown(sub);
			} else {
				window.location.replace(sub.href);
				return;
			}
<?php }?>
			setTimeout(function(){
				if(sub.href.indexOf("click.taobao.com") > 0) {
					window.location.replace(sub.href);
				} else {
                  firemousedown(sub);
				}
			}, 40);
		} else {
			setTimeout(oncomplete, 40);
		}
	}
	oncomplete();
}
</script>
</body>

此段代码先从URL获得单品链接,然后写入标签的href属性中,再用js触发对的标签点击,按照淘点金的说明,这样会进行到推广链的转换,这样转换后就跳转到推广的网址了!如果你用过淘点金,你会马上分辨出中间的淘点金代码。

未完待续。。。

http://www.shenyaocn.com/?p=171 ‎