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