欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

获取软件下载的真实地址!再谈获取Response.redirect重定向的URL

程序员文章站 2022-06-15 10:45:26
http://www.im286.com/viewthread.php?tid=1550010&extra=page%3d1 其实这个问题落伍谈了n次了其中care4也说...

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>