阅读完本文,你将了解淘宝客链接劫持插件,并且你也可以自己制作一个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