ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何运用xmlhttp绕过asp/aspx页面的文本防盗机制,下载相关文件

如何运用xmlhttp绕过asp/aspx页面的文本防盗机制,下载相关文件

作者:绿色风 分类: 时间:2022-08-17 浏览:121
楼主
xmyjk
Q:如何运用xmlhttp绕过asp/aspx页面的文本防盗机制,下载相关文件。
例子网址:http://www.namejet.com/Pages/Downloads.aspx,如图下载Pre-Release Domains的第二个超链接的文件。

 

A:分析,可以使用xmlhttp去模拟文件下载的发包过程。但是,POST的时候,要POST的有VIEWSTATE和EVENTVALIDATION两个参数,经过多次测试,这两个参数是随机的,应该是页面的一种防盗机制。我们怎么破解这个机制呢。
原来在http://www.namejet.com/Pages/Downloads.aspx的源代码中,就存有这两个参数的文本了。这个是常见的通过服务器在下载前页面的随机参数,防盗链的机制。如图

 

 

我们可以先访问原页面,获取参数,后再次发送下载文件的POST消息头,即可。
  1. Option Explicit
  2. Sub T()
  3.     Dim xmlhttp As Object, Cookie As String, st As String, sd As String
  4.     Set xmlhttp = CreateObject("Microsoft.XMLHTTP") '创建XMLHTTP对象
  5.     With xmlhttp
  6.         .Open "GET", "http://www.namejet.com/Pages/Downloads.aspx", False '访问下载前页面
  7.         .send
  8.         st = URLEncode(Split(Split(.responsetext, "VIEWSTATE"" value=""")(1), """ />")(0)) '获取viewstate参数
  9.         sd = URLEncode(Split(Split(.responsetext, "EVENTVALIDATION"" value=""")(1), """ />")(0)) '获取eventvalidation参数
  10.         .Open "POST", "http://www.namejet.com/Pages/Downloads.aspx", False '向服务器POST下载消息包
  11.         .setRequestHeader "Content-Type", "application/x-www-form-urlencoded" '以下是设置发包HEAD
  12.         .send "__EVENTTARGET=ctl00%24ContentPlaceHolder1%24hlPreRelease1&__EVENTARGUMENT=&__VIEWSTATE=" & st & "&__EVENTVALIDATION=" & sd & "&ctl00%24TextBoxSearch=Search+Domains&ctl00%24HiddenFieldFristNav="
  13.     End With
  14.     With CreateObject("ADODB.Stream") '创建二进制数据流的容器
  15.         .Type = 1
  16.         .Open
  17.         .write xmlhttp.Responsebody '将发包后的数据流导入容器
  18.         .savetofile ThisWorkbook.Path & "\1.text", 2 '另存为所需文件
  19.         .Close
  20.     End With
  21.     Set xmlhttp = Nothing
  22.     MsgBox "Ok"
  23. End Sub
  24. Public Function URLEncode(ByVal strParameter As String) As String 'URL的符合和中午需转码,用此函数转码

  25.     Dim s As String
  26.     Dim I As Integer
  27.     Dim intValue As Integer

  28.     Dim TmpData() As Byte

  29.     s = ""
  30.     TmpData = StrConv(strParameter, vbFromUnicode)
  31.     For I = 0 To UBound(TmpData)
  32.         intValue = TmpData(I)
  33.         If (intValue >= 48 And intValue <= 57) Or _
  34.            (intValue >= 65 And intValue <= 90) Or _
  35.            (intValue >= 97 And intValue <= 122) Then
  36.             s = s & Chr(intValue)
  37.         ElseIf intValue = 32 Then
  38.             s = s & "+"
  39.         Else
  40.             s = s & "%" & Hex(intValue)
  41.         End If
  42.     Next I
  43.     URLEncode = s

  44. End Function

aspdown.zip
2楼
鱼求雨
不是一般的强
3楼
水星钓鱼
终于找到转码函数了
4楼
peterchen
月版主,本想学习XMLHTTP的用法,没想到搜到你的老贴,这么难的VBA都编得出来
5楼
peterchen
月版主,本想学习XMLHTTP的用法,没想到搜到你的老贴,这么难的VBA都编得出来
6楼
老糊涂
学习

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap