|

楼主 |
发表于 2011-4-30 16:21:36
|
显示全部楼层
回复 129# 788555
这些大站一般都比较复杂,表现在代码加密,代码格式乱,多,特别是经常用单个字母代表变量对象,让人第一眼就吓趴下
搜搜的核心js文件是- http://www.soso.com/js/sosoweb_result.js?5618
复制代码 ,对象的事件函数都可以在这里找到,当鼠标经过预览时的处理函数也在其中,代码太复杂,我没有找到预览时的处理函数,不过通过几个零散的函数,最后模糊的找出了获得预览内容的请求地址的格式
获得预览内容的请求地址的格式:- http://www.soso.com/interface/preview.q?from=web&url=预览网站的网址
复制代码 路http://www.soso.com/interface/pr ... //www.lady8844.com/ 就是一个获得预览内容的地址
下面是一些分析:
当鼠标经过预览时发生的是ajax,
预览失败时重试函数:
function tryAgain(a,b)
{_$("tryAgain").style.display="none";
_$("tryAgainWaiting").style.display="block";
downloadUrl(a,function(f,e){if(f){_$("prevshow").className="main";_$("prevshow").innerHTML=f}
else
{_$("prevshow").className="main1";_$("prevshow").innerHTML="<br /><br />对不起,您所查看的预
览暂时无法打开,请您直接查看网页。"}})}
其中downloadUrl(a,function(f,e)可以找到ajax地址,是比较重要的
downloadUrl函数:- function downloadUrl(b,k,g){method=g?g:"GET";if(window.XMLHttpRequest){var a=new
- XMLHttpRequest()}else{var f=
- ["Msxml2.XMLHTTP.6.0","MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","Msxml2.XMLHTTP.3.0","Msxml2
- .XMLHTTP","Microsoft.XMLHTTP"];for(var j=0;j<f.length;j++){try{var a=new ActiveXObject(f
- [j]);break}catch(h){}}}a.open(method,b,true);if(method=="POST"){setRequestHeader("Content-
- Type","application/x-www-form-urlencoded; charset=UTF-8")}a.onreadystatechange=function()
- {if(a.readyState==4){k(a.responseText,a.status);delete (a)}};a.send(null)}
复制代码 这个函数作用是建立ajax请求对象,a.open(method,b,true);是发送请求,那么b就是请求地址了,而b
并且设置了状态改变的处理函数:- a.onreadystatechange=function()
- {if(a.readyState==4){k(a.responseText,a.status);delete (a)}};a.send(null)}
复制代码 这里k(a.responseText,a.status);k是传入的一个函数,见下面的代码:- downloadUrl(r,function(z,y){if(v==e&&g_eCurPrv){if(y==200){if(z.trim().length<1)
- {_$("prevshow").className="main1";_$("prevshow").innerHTML="<span id='tryAgain'><br /><br />
- 预览内容暂时无法显示,请<a href='#' onclick="javascript:tryAgain('"+r+"','"+u+"');return
- false;" >重试</a>。</span><span id='tryAgainWaiting' style="display:none">正在载入,请稍
- 候...</span>"}else{_$("prevshow").innerHTML=z}}else
- {_$("prevshow").className="main1";_$("prevshow").innerHTML="<br /><br />预览内容暂时无法显示
- ,请<a href='#' onclick="javascript:tryAgain('"+r+"','"+u+"');return false;" >重试
- </a>。"}}});
复制代码 可以看出a.responseText是function(z,y)参数z,a.status是参数y,最后成功后,把结果设置在prevshow div中,变量用单字母替代,看上去眼花缭乱
通过downloadUrl(r,function(z,y),这是个执行的过程,那摩r就是请求地址,
js文件代码里有- var x=n(w);
- b(w,x);_$("prevshow").innerHTML="正在载入,请稍候...";
- var v=++e;
- var t=parseInt(w.getAttribute("id").substr(3));
- var r="/interface/preview.q?from=web&url="+encodeURIComponent(x);if(t>=40&&t<1000){r=r+"&w="+encodeURIComponent
- (__qrkw)}else{r=r+"&w="+encodeURIComponent(__previewkw)}
复制代码 所以var r="/interface/preview.q?from=web&url="+encodeURIComponent(x);
由x=var x=n(w);
n(w)函数:- function n(t){var q=t.getAttribute("id").split("_");var r=_$("res"+q[0].substr
- (3)).getAttribute("href",2);var u=r.indexOf("http://www.soso.com/warn");if(u!==-1)
- {splitstr=r.split("u=");return decodeURIComponent(splitstr.slice(1).join())}return r}
复制代码 函数作用:n(w);根据需要信息,w参数肯定预览的那个对象了,路id="pws1_normal">,获得当前记录预览网址- ,<a href="http://www.lady8844.com/" id="res1"
复制代码 ,最后r就是这里的url,有2种情况,网址包含http://www.soso.com/warn的,要把u=后的才是要的url,而没有的就直接是了,一般都不包含http://www.soso.com/warn
这样var r="/interface/preview.q?from=web&url="+encodeURIComponent(x);
经测试encodeURIComponent可以不用,
r就是ajax地址,x是目标网址,这样地址格式就是- http://www.soso.com/interface/preview.q?from=web&url=目标地址
复制代码 ,这个网站我是一知半解,大概知道了请求的过程
当然用抓包会快很多,应该可以抓到这样的地址,是get方式的
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?加入会员
x
|