获取软件下载的真实地址!再谈获取Response.redirect重定向的URL
http://www.im286.com/viewthread.php?tid=1550010&extra=page%3d1
其实这个问题落伍谈了n次了 完整代码:
其中care4也说了两次所以如果你有问题最好先搜索一下 说不定问题早有人解决了
http://www.im286.com/viewthread. ... ;highlight=%2bcare4
http://www.im286.com/viewthread. ... ;highlight=%2bcare4
care4的代码有一个小缺点 就是需要组件。
第一个是.net组件 二不是 但用组件始终不太方便有没有asp直接获取的方式呢
答案是有的
我写的一个vb简单的winsock获取的代码
http://www.im286.com/viewthread. ... t=response.redirect
当时我说用asp好像不能获得,那是当时没有去csdn混去,现在搞定了
首先我们要了解为什么xmlhttp组件无法获得这样的跳转真实地址
用response.redirect跳转,php里面是header("location",$url);
这两种方式都是一样的原理,就是在输出的http头里面加上一个location字段
同时把返回的http状态值设为302,浏览器就会认为当前请求的页面已经
被移动到location指定的路径
那么为什么xmlhttp无法获得呢?
原因很简单
xmlhttp组件在处理包含location头的302消息时太智能了,直接给跳转到最后的页面,也就是说~我们看不到中间的过程!比尔自作聪明阿 !
不过还好msxml4里面提供了一个可用的新的组件:winhttp.winhttprequest.5.1,这个也是msxml4 xmlhttp组件的核心。 winhttp.winhttprequest有一个十分关键的属性:option,这个属性的第六个索引就是指示是否自动跳转,然后就可以轻松的使用xmlhttp组件的getresponseheader和getallresponseheaders方法来获取返回的http头信息了。
好接下来就看代码了
dim ohttp
set ohttp=server.createobject("winhttp.winhttprequest.5.1"
ohttp.option(6)=0 '禁止自动redirect,最关键的 剩下的就简单读取数据都估计大家都会
ohttp.settimeouts 5000,5000,30000,5000 '设置超时~和serverxmlhttp组件一样
ohttp.open "get",surl,false '以同步模式打开url
if ohttp.status<>200 and ohttp.status<>302 then
'ohttp.status对应返回的http状态,如果是200,表示这个就是最终页面,没有location跳转
'如果是302,表示当前请求的url已经被移动,需要根据http头来跳转
'对于其他数值的状态,基本上我们不要处理,但是你要处理也可以比如 440或者别的状态你自己处理就可以了!
else
'在这里对返回的http头和文档内容进行处理
end if
好了比较完整的代码比较长
我传了个到空间上自己看去
默认的输入栏里的代码是crsky的一个下载地址你可以测试一下就知道了
点查看源代码就可以看见这个asp文件的源代码!
一切搞定 over 继续去csdn混分去了<%
public function bytes2bstr(v)
dim r,i,t,n : r = ""
for i = 1 to lenb(v)
t = ascb(midb(v,i,1))
if t < &h80 then
r = r & chr(t)
else
n = ascb(midb(v,i+1,1))
r = r & chr(clng(t) * &h100 + cint(n))
i = i + 1
end if
next
bytes2bstr = r
end function
'==========================================================================================
if request.querystring="viewsource" then
dim ofso : set ofso=server.createobject("scripting.filesystemobject")
dim ofil : set ofil=ofso.opentextfile(server.mappath("url.asp"))
dim stxt : stxt=ofil.readall()
ofil.close : set ofil=nothing : set ofso=nothing
response.contenttype="text/plain"
response.write stxt
response.end
end if
%><?xml version="1.0" encoding="gb2312" standalone="yes"?>
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<html xmlns:v="http://www.eglic.com/">
<head>
<title></title>
<meta name="generator" content="editplus" />
<meta name="author" content="eglic" />
<meta http-equiv="content-type" content="text/html; charset=gb2312" />
<meta name="charset" content="gb2312" />
<link rel="stylesheet" type="text/css" href="/styles/default.css" />
<style type="text/css">
@media all{
}
</style>
<script language="javascript" src="/scripts/default.js"></script>
<script language="javascript" src="/scripts/xml.js"></script>
<script language="javascript">//<!--
//--></script>
</head>
<body>
<form action="" method="post">
要检测的url:<input type="text" name="url" size="50" value="<%
if request.form("url")<>"" then
response.write trim(request.form("url"))
else
response.write "http://www.crsky.com/view_down.asp?downd_id=8&downd=0&id=20780&down=yes"
end if
%>" />
<input type="submit" value="提交" />
<input type="button" value="查看源代码" onclick="javascript:window.open('<%=urlself%>?viewsource');" />
</form>
<%
public function getabsoluteurl(surl,byref istep)
dim burl,bdat
if istep>15 then
err.raise vbobejcterror,"递归错误","递归嵌套超过15层可能会引起程序崩溃"
end if
if instr(surl,"://")<=0 then surl="http://" & surl
if instr(surl,"?")>0 then
dim tmpurl : tmpurl=split(surl,"?")
burl=tmpurl(0)
bdat=tmpurl(1)
else
burl=surl
bdat=""
end if
response.write "<p style=""border:solid 1px silver;border-top:solid 2px red;padding:5px;margin:2px;"">"
response.write "第 " & istep & " 步:"
response.write "正在准备获取 " & burl & "<br />"
istep=istep+1
if bdat<>"" then response.write " >>参数: " & bdat & "<br />"
dim ohttp : set ohttp=server.createobject("winhttp.winhttprequest.5.1")
ohttp.option(6)=0 '禁止自动redirect,最关键的
'ohttp.option()
ohttp.settimeouts 5000,5000,30000,5000
ohttp.open "get",surl,false
on error resume next
ohttp.send bdat
if err.number<>0 then
response.write "<font color=""red"">发生错误:" & err.description & "</font><br />"
err.clear
getabsoluteurl=""
set ohttp=nothing
response.write "</p>"
exit function
end if
on error goto 0
response.write " >>http 状态:" & ohttp.status & "<br />"
if ohttp.status<>200 and ohttp.status<>302 then
response.write "<font color=""red"">http错误:" & ohttp.statustext & "</font><br />"
err.clear
getabsoluteurl=""
set ohttp=nothing
response.write "</p>"
exit function
end if
dim sloca
on error resume next
sloca=ohttp.getresponseheader("location")
if err.number<>0 then
err.clear
sloca=""
end if
on error goto 0
if sloca = "" then
response.write " >>content-type:" & ohttp.getresponseheader("content-type") & "<br />"
response.write " >>content-length:"
on error resume next
response.write ohttp.getresponseheader("content-length")
if err.number<>0 then err.clear
on error goto 0
response.write "<br />"
response.write " >>没有返回location头,继续分析页面<br />"
if ohttp.getresponseheader("content-type")="text/html" then '是html类型才继续处理
dim sbody : sbody=bytes2bstr(ohttp.responsebody)
dim r : set r=new regexp
r.multiline=true
r.global=true
r.ignorecase=true
r.pattern="<meta.+http\-equiv\=\""refresh\"".+content=\""[^\;]+;url\=([^\""\s\>]*).*$"
if r.test(sbody) then
response.write " >>发现 refresh 地址<br />"
dim m : set m=r.execute(sbody)
dim trefurl : trefurl=r.replace(m(0).value,"$1")
if instr(trefurl,"://")<=0 then '没有指定协议,按当前url的位置重新设置
dim ind1 : ind1=instrrev(surl,"/")
surl=left(surl,ind1)
trefurl=surl & trefurl
end if
set r=nothing
set ohttp=nothing
response.write " >>准备分析 <u>" & trefurl & "</u><br />"
response.write "</p>"
getabsoluteurl=getabsoluteurl(trefurl,istep)
exit function
else
response.write " >>没发现 refresh meta 转向,这可能就是最终的url<br />"
getabsoluteurl=surl
set r=nothing
set ohttp=nothing
response.write "</p>"
exit function
end if
else
getabsoluteurl=surl
set ohttp=nothing
response.write "</p>"
exit function
end if
'这里要继续分析网页内容
else
response.write " >>content-type:" & ohttp.getresponseheader("content-type") & "<br />"
response.write " >>content-length:"
on error resume next
response.write ohttp.getresponseheader("content-length")
if err.number<>0 then err.clear
on error goto 0
response.write "<br />"
response.write " >><u>location : " & sloca& "</u><br />"
response.write "</p>"
'这里要生成新的url
if instr(sloca,"://")<=0 then
'没有指定协议,按当前url的位置重新设置
dim ind : ind=instrrev(surl,"/")
surl=left(surl,ind)
sloca=surl & sloca
end if
getabsoluteurl=getabsoluteurl(sloca,istep)
end if
end function
if request.form("url")<>"" then
dim istep : istep=1
dim sabs : sabs=getabsoluteurl(trim(request.form("url")),istep)
response.write "<strong style=""color:white;background-color:red;font-size:15px;padding:3px;margin:10px;"">最终结果是:" & sabs & "</strong>"
end if
%>
<script src="/t/mystat.asp?siteid=1"></script>
</body>
</html>
上一篇: asp 多字段模糊搜索的函数
下一篇: jb51内容分页函数 原创