ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: wcymiss

[原创] 不懂html也来学网抓(xmlhttp/winhttp+fiddler)

    [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-29 14:32 | 显示全部楼层
本帖已被收录到知识树中,索引项:网页交互
本帖最后由 wcymiss 于 2014-10-29 16:20 编辑

像网易这么简单的登录毕竟少见。


很多网站的登录都会发送很多参数。参数是明码的、可以通过抓包搜索得到的,登录方法和第二篇章的获取数据的方法相同,这里就不再举例了。


下面将举一些比较复杂的、抓包后搜索不到明码参数的登录的例子。

复杂的登录需要学习Javascript知识。


Javascript知识入门请到这里:http://www.w3school.com.cn/js/index.asp

javascript知识深入请参阅此书:JavaScript权威指南(第6版)。下载地址:http://pan.baidu.com/s/1dDeOgoh

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-29 15:44 | 显示全部楼层
本帖最后由 wcymiss 于 2014-10-30 18:34 编辑

复杂登录一:搜房网登录

网站:http://agent.soufun.com/

做登录测试不用真实的用户名和密码也可以进行的。它与真实的用户名密码抓到的包,区别就是登录页面的Response信息不同,但Request信息是一样的。Response的内容仅仅是一个参考,不影响我们代码的编写。当然,有真实的用户名密码更好,你可以验证你的登录代码是否编写正确。


登录并用fiddler抓包。

以用户名作为搜索文本,搜到一个POST的session。
看其发送参数:

搜房网登录1.png

该SendData里有四个参数,其中两个参数名是username和userpwd,根据这个可以判断该Session是我们要找的登录session。

再观察webforms里所有的参数:(QueryString有1个,Body里有4个)
str_username是用户名,rememberme应该是对应网页上的“记住我的用户名”的参数,submit1是提交的意思,应该也是固定的值。这样,有动态嫌疑的就是str_userpwd和codev了。str_userpwd很明显是加密过的字符串。

首先处理codev。
搜索codev的值(我这里抓包的是6534),发现找不到。
以“codev”为搜索内容,再次搜索:

搜房网登录2.png

可见,“6534”是变量v_rand的值,而这个值,是由随机函数产生的!

所以我们在vba里也可以定义一个变量v_rand,然后,我们仿照javascript里的赋值语句也给这个vba变量赋值:
  1. v_rand = Round(Rnd() * 10000)
复制代码
这样,动态参数codev就做好了。

接下来搜索str_userpwd参数那个字母数字混合的字符串值,还是搜不到。
于是搜str_userpwd试试。

还是在h t t p://agent.fang.com/ 这个网页里找到了str_userpwd,且这个页面里有多个str_userpwd。我们一个个来看下:
1、var str_userpwd = document.getElementById("str_userpwd").value;
    这句仅仅是取值,没有加密算法;
2、if (str_userpwd == "") {
    这句是判断密码是否为空。为空的话执行后面的提示。
3、function cmdEncrypt() {
            if ($("#str_userpwd").val().length < 17) {
                setMaxDigits(129);
                var key = new RSAKeyPair("010001", "", "一串字母数字混合文本");
                var pwdRtn = encryptedString(key, $("#str_userpwd").attr("value"));
                $("#str_userpwd").attr("value", pwdRtn);
            }
        }
    这个函数先是判断密码是否小于17位。小于17位就执行后面多个语句,最后把密码框的值用变量pwdRtn的内容代替。
  再顺藤摸瓜,查找cmdEncrypt,发现它在函数loginSubmit内。至于函数loginSubmit,一看就是有关登录的。
  再搜索loginSubmit,发现它是点击“登录”按钮触发的函数。于是整个事件就变成:

  点击登录按钮-----触发loginSubmit------执行函数cmdEncrypt-----密码少于17位的话把密码替换成pwdRtn值。
  
  上面的流程就是登录的真相!

  现在的关键是取pwdRtn的值!


pwdRtn值通过3步得到:
   1、setMaxDigits(129);
     2、var key = new RSAKeyPair("010001", "", "一串字母数字混合文本");
     3、var pwdRtn = encryptedString(key, $("#str_userpwd").attr("value"));
在fiddler里搜索这三个函数所在位置:
setMaxDigits在h t t p://img1.soufun.com/secondhouse/image/magent/js/BigInt.js 这个js文件里;
RSAKeyPair和encryptedString在h t t p://img1.soufun.com/secondhouse/image/magent/js/RSA.js 里。
再看RSA.js这个文件的前言:

搜房网登录3.png

我们还需要h t t p://img1.soufun.com/secondhouse/image/magent/js/Barrett.js

我们需要截取上述所有js函数后执行得出pwdRtn值,然后将其放入SendData里。

代码编写:
1、获取js文件的js代码:
  1. .Open "GET", "http://img1.soufun.com/secondhouse/image/magent/js/RSA.js", False
  2.         .Send
  3.         strJS= strJS & ";" & .responsetext
复制代码
另外两个js文件同上一样获取。

2、截取函数cmdEncrypt的执行语句,并把str_userpwd文本框的值替换为我们的密码变量。
  1. .Open "GET", "http://agent.fang.com/ ", False
  2. .Send
  3. strText = .responsetext
  4. strJSFun = Mid(strText, InStr(strText, "setMaxDigits("))
  5. strJSFun = Left(strJSFun, InStr(strJSFun, "$(""#str_userpwd"").attr(""value"", pwdRtn);") - 1)
  6. strJSFun = Replace(strJSFun, "$(""#str_userpwd"").attr(""value"")", UserPwd)
复制代码
3、将strJS和strJSFun结合后执行,取出pwdRtn值:
  1. pwdRtn = JSEval(strJS & ";" & strJSFun & ";pwdRtn")
复制代码
获取到这个pwdRtn后就可以登录了。

完整的代码:
  1. Sub Main()
  2.     Const UserName As String = "vbatest" '假设的账户
  3.     Const UserPwd As String = "12341234"
  4.     Dim strText As String
  5.     Dim strJS As String
  6.     Dim strJSFun As String
  7.     Dim pwdRtn As String
  8.    
  9.     With CreateObject("MSXML2.XMLHTTP")
  10.         '1、获取js文件的js代码:
  11.         .Open "GET", "http://img1.soufun.com/secondhouse/image/magent/js/RSA.js", False
  12.         .Send
  13.         strJS = .responsetext
  14.         .Open "GET", "http://img1.soufun.com/secondhouse/image/magent/js/BigInt.js", False
  15.         .Send
  16.         strJS = strJS & ";" & .responsetext
  17.         .Open "GET", "http://img1.soufun.com/secondhouse/image/magent/js/Barrett.js", False
  18.         .Send
  19.         strJS = strJS & ";" & .responsetext
  20.         
  21.         '2、截取函数cmdEncrypt的执行语句,并把获取str_userpwd文本框的值的代码替换为我们的密码变量。
  22.         .Open "GET", "http://agent.fang.com/", False
  23.         .Send
  24.         strText = .responsetext
  25.         strJSFun = Mid(strText, InStr(strText, "setMaxDigits("))
  26.         strJSFun = Left(strJSFun, InStr(strJSFun, "$(""#str_userpwd"").attr(""value"", pwdRtn);") - 1)
  27.         strJSFun = Replace(strJSFun, "$(""#str_userpwd"").attr(""value"")", "'" & UserPwd & "'")
  28.         
  29.         '3、将strJS和strJSFun结合后执行,取出pwdRtn值:
  30.         pwdRtn = JSEval(strJS & ";" & strJSFun & ";pwdRtn")
  31.         
  32.         '4、登录
  33.         .Open "POST", "http://agent.soufun.com/DealCenterLogin.aspx?codev=" & Round(Rnd() * 10000), False
  34.         .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  35.         .Send "str_username=" & UserName & "&str_userpwd=" & pwdRtn & "&Submit1=%B5%C7++%C2%BC"
  36.         Debug.Print .getallresponseheaders '有三个Set-Cookie表明登录成功
  37.         
  38.     End With
  39. End Sub

  40. Function JSEval(s As String) As String
  41.     With CreateObject("MSScriptControl.ScriptControl")
  42.         .Language = "javascript"
  43.         JSEval = .Eval(s)
  44.     End With
  45. End Function
复制代码
小贴士:
1、整个登录过程都用一个对象,这个对象中间不要关闭,以保留cookie。
2、三个js文件中的js代码都不含操作html的代码,所以可以直接放在ScriptControl控件里使用。如果有操作html的代码,如后面的$(""#str_userpwd"") 这种,那就不能直接JSEval。或者像上述那样更改代码,或者借用HtmlWindow来执行代码。
3、上述提取strJSFun的过程可以自己发挥,反正所需的三条JS语句不要少就行。
4、寻找加密算法的过程也可以借助浏览器的调试器。
5、解密这种网站,经验越多寻找加密算法的时间就越短。



呃,,总算是完工了,,这个寻找过程好像很难写啊。。。希望有人能看懂。。。。看不懂的跟我说啊

补充内容 (2014-11-17 09:24):
这段代码主要是加密参数的计算演示。要继续查询的话需要设置cookie。具体代码见491楼http://club.excelhome.net/forum. ... ;page=50#pid7949122

点评

参考:http://club.excelhome.net/thread-1084264-1-1.html  发表于 2014-10-29 23:25
辛苦了,另外一个JS文件也必须用到 http://img1.soufun.com/secondhouse/image/magent/js/Barrett.js  发表于 2014-10-29 23:24

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-29 16:27 | 显示全部楼层
本帖最后由 moon2778 于 2014-11-17 13:41 编辑

复杂登录二:58同城登录


网站:https://passport.58.com/login

代码运行时可能会跳出信任错误,请事先在internet选项中进行设置:
Internet选项----高级----安全,去掉“检查服务器证书吊销*”前面的勾。


登录并抓包。

找到登录网页,查看参数:
58登录1.png

搜索各参数名:

58登录3.png

上面的这几个是明码(值在网页里能找到)。

58登录2.png

这几个是加密数据,由javascript函数计算所得。

把参数来源列张表更清晰:

58登录4.png

接下来查找包含加密算法函数的JS文件:

找到:  

1、h t t ps://passport.58.com/js/v6/source/828ef34c77a2cbed693ba874ce570dfe.js?version=0.0.2
这个文件是由h t t ps://passport.58.com/static/ppt/js/5_1/comm_js/boot_passport_version.js里的函数产生的,所以我们需要先GET 后面那个js文件,以获取前面那个js文件名;

2、h t t ps://passport.58.com/rsa/ppt_security.js
这个文件里面包含了JQuery代码,所以同时还必须加载h t t ps://passport.58.com/static/js/5_1/jquery1.3.2.js

和上一次登录的例子不同,这次的JS函数包含了操作html的代码(JQuery大部分都是这种),不能在ScriptControl控件里运行了,必须在Html里运行。把js文件名写入DOM的script节点的src属性里,然后DOM的parentwindow就可以执行JS文件里的各种全局函数了。同前,vba代码编写的时候,最好用callbyname调用这些函数。

完整的代码:
  1. Sub Main()
  2.     Const strHost As String = "https://passport.58.com"
  3.     Const Username As String = "vbatest"
  4.     Const Password As String = "12341234"
  5.     Dim strText As String, SendData
  6.     Dim objDom As Object, objWin As Object, objXML As Object
  7.     Dim arrJSFile(), i As Integer, strJS As String
  8.     Dim path, pts, ptk, cd, timesign, timespan, p1, p2, p3, key1, key2
  9.    
  10.     '初始化赋值
  11.     Set objDom = CreateObject("htmlfile")
  12.     objDom.write "<script></script>" '添加一个空script节点
  13.     Set objWin = objDom.parentwindow
  14.     Set objXML = CreateObject("MSXML2.XMLHTTP")
  15.     arrJSFile = Array("jquery1.3.2.js", "ppt_security.js", "boot_passport_version.js") '要加载的js文件名
  16.    
  17.     '获取主页面的源代码
  18.     objXML.Open "GET", strHost & "/login", False
  19.     objXML.Send
  20.     strText = objXML.responsetext
  21.    
  22.     '获取各参数的明码值及运算时所需的值
  23.     path = Split(Split(strText, "name=""path"" value=""")(1), """")(0) '获取参数path
  24.     pts = Split(path, "/?pts=")(1) '用于timesign参数的计算
  25.     timespan = pts - CallByName(objWin, "eval", VbMethod, "new Date().getTime()") '用于timesign参数计算
  26.     ptk = Split(Split(strText, "id=""ptk"" value=""")(1), """")(0) '获取参数ptk
  27.     cd = Split(Split(strText, "id=""cd"" value=""")(1), """")(0) '获取参数cd
  28.     key1 = Split(Split(strText, """#password"").val()),""")(1), """")(0) 'encryptString函数的第二参数
  29.     key2 = Split(Split(strText, """#password"").val()),""" & key1 & """,""")(1), """")(0) 'encryptString函数的第三参数
  30.    
  31.     '先下载JS文件到缓存(GET请求一次即可),以提高DOM加载JS文件的速度。(否则加载会有延迟)
  32.     For i = 0 To 2
  33.         '58的js路径有时会变,用下面这个小函数在HTML代码里寻找js文件的完整路径名
  34.         arrJSFile(i) = FindJSFile(strText, arrJSFile(i), strHost)
  35.         objXML.Open "GET", arrJSFile(i), False
  36.         objXML.Send
  37.     Next
  38.    
  39.     '找到所需的第三个JS文件名并GET到缓存
  40.     strText = objXML.responsetext
  41.     arrJSFile(2) = Split(Split(strText, "try{var d=""")(1), """")(0) & Split(Split(strText, "just"":""")(1), """")(0)
  42.     objXML.Open "GET", arrJSFile(2), False
  43.     objXML.Send
  44.    
  45.     '将JS文件加载进HTML
  46.     For i = 0 To 2
  47.         strJS = strJS & "<script src=""" & arrJSFile(i) & """></script>"
  48.     Next
  49.     objDom.write strJS '加载
  50.    
  51.     '执行函数计算各参数的值
  52.     timesign = CStr(CallByName(objWin, "eval", VbMethod, "new Date().getTime()") + timespan)
  53.     p1 = CallByName(objWin, "getm32str", VbMethod, Password, timesign)
  54.     p2 = CallByName(objWin, "getm16str", VbMethod, Password, timesign)
  55.     p3 = CallByName(objWin, "encryptString", VbMethod, timesign & CallByName(objWin, "encodeURIComponent", VbMethod, Password), key1, key2)
  56.    
  57.     '生成POST用的SendData
  58.     SendData = "isweak=0"
  59.     SendData = SendData & "&path=" & path
  60.     SendData = SendData & "&p1=" & p1
  61.     SendData = SendData & "&p2=" & p2
  62.     SendData = SendData & "&p3=" & p3
  63.     SendData = SendData & "&timesign=" & timesign
  64.     SendData = SendData & "&ptk=" & ptk
  65.     SendData = SendData & "&cd=" & cd
  66.     SendData = SendData & "&username=" & Username
  67.     SendData = SendData & "&password=password"
  68.     SendData = SendData & "&mcresult=undefined"
  69.         
  70.     '登录
  71.     With objXML
  72.         .Open "POST", "https://passport.58.com/dounionlogin", False
  73.         .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  74.         .Send SendData
  75.         Debug.Print .getallresponseheaders '包含58cooper和58passport的Set-Cookie即为登录成功
  76.         Debug.Print .responsetext '成功时这里包含location
  77.     End With
  78.    
  79.     Set objXML = Nothing
  80.     Set objWin = Nothing
  81.     Set objDom = Nothing
  82. End Sub
  83. Function FindJSFile(Html As String, JSName, Host As String)
  84.     '在HTML代码里找到以JSName为名的JS文件的全路径名。没有Host的添加Host
  85.     With CreateObject("vbscript.regexp")
  86.         .Pattern = "[\s\S]+<script\s+(?:type=""text/javascript""\s+)?src=""([^""]+/" & Replace(JSName, ".", "\.") & ")""[\s\S]+"
  87.         FindJSFile = .Replace(Html, "$1")
  88.         If Not FindJSFile Like "http*" Then FindJSFile = Host & FindJSFile
  89.     End With
  90. End Function
复制代码

点评

或者登陆淘宝 https://unit.login.taobao.com/member/login.jhtml  发表于 2014-10-30 16:16
我觉得最复杂莫过登陆 网页版QQ并发送一条消息给好友。  发表于 2014-10-30 15:51

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-31 14:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 wcymiss 于 2014-11-1 16:48 编辑

这里留个空位,有精力就再写个登录。。

接下去是上传了。。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-1 17:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 moon2778 于 2014-11-26 10:17 编辑

上传文件
同样,上传文件也可以用fiddler抓包。

以EH的论坛上传附件为例。我们上传一个很小的压缩文件来测试(太大了的话,Fiddler的Raw里看不完整)。

在fiddler里搜索文件名(不含路径),确认我们需要模拟的网页。

上传1.png

webforms更清晰:

上传2.png


我们看到上传文件的POST的特点:
1、Content-Type是multipart/form-data,而且后面有一个boundary的赋值(10个英文减号+30个随机字母数字混合字符串),普通的POST的Content-Type是application/x-www-form-urlencoded了。
2、SendData的内容,各项内容以Content-Type里的boundary值分隔,但前面还加了两个英文减号,最后的boundary在末尾处也加了两个英文减号。
3、每项内容除文件流外是“Content-Disposition: form-data; name="名称"”+空行+值组成。
4、文件转成了二进制流,作为SendData其中一项内容,Content比其余各项略微复杂些。

我们也只需要按照这样的格式进行POST发送。

但要注意:字符串与字符串可以用“&”连接,但字符串与二进制流不能将流转为文本后用“&”连接,而应将字符串转为二进制流后再进行连接(数组方式、adostream均可连接流数据)。二进制流转为文本后会被系统按照默认编码格式进行编码,这样容易导致上传文件的格式不正确。

EH上传附件的代码(手工填入hash码即可上传了):
  1. Sub Main()
  2.     Const Uid As String = "" '论坛UID
  3.     Const Hash As String = "" '上传的Hash,从Fiddler里取
  4.     Dim Boundary As String
  5.     Dim SendData
  6.     Dim FileFullName As String
  7.     Dim FileShortName As String
  8.     Dim Title As String
  9.     Dim Filetype As String
  10.    
  11.     FileFullName = "D:\测试2.rar"
  12.     FileShortName = Mid(FileFullName, InStrRev(FileFullName, "") + 1)
  13.     Title = Left(FileShortName, InStrRev(FileShortName, ".") - 1)
  14.     Filetype = "rar"
  15.    
  16.     '获取Boundary
  17.     Boundary = GetBoundary()
  18.     '获取上传所需的SendData
  19.     SendData = GetUpLoadSendData(Boundary, FileFullName, _
  20.                 "Filename", FileShortName, _
  21.                 "proid", "0", _
  22.                 "hash", Hash, _
  23.                 "uid", Uid, _
  24.                 "title", Title, _
  25.                 "filetype", Filetype, _
  26.                 "Filedata", FileShortName, _
  27.                 "Upload", "Submit Query")
  28.         
  29.     '上传
  30.     With CreateObject("MSXML2.XMLHTTP")
  31.         .Open "POST", "http://club.excelhome.net/misc.php?mod=swfupload&fid=2&action=swfupload&operation=upload", False
  32.         .setRequestHeader "Content-Type", "multipart/form-data; boundary=" & Boundary
  33.         .Send SendData
  34.         Debug.Print .responsetext '出现一串数字则为成功。到论坛发帖的界面可看到“未使用的附件”的提示。
  35.     End With
  36. End Sub

  37. Function GetBoundary() As String
  38.     '生成Boundary
  39.     Dim i As Integer, r As Integer
  40.     Do While i < 30
  41.         r = Int(Rnd * 75 + 48)
  42.         If r < 58 Or (r > 64 And r < 91) Or r > 96 Then
  43.             GetBoundary = GetBoundary & Chr(r)
  44.             i = i + 1
  45.         End If
  46.     Loop
  47.     GetBoundary = String(10, "-") & GetBoundary
  48. End Function

  49. Function GetUpLoadSendData(Boundary As String, FileFullName As String, ParamArray NameValue()) As Byte()
  50.     'NameValue()必须成双,前一个是名称,后一个是值
  51.     'NameValue()最后一对是文件流之后的名称值对
  52.     'NameValue()倒数第二对是文件流信息相关的两个数据
  53.    
  54.     Dim DataBefore, DataAfter
  55.     Dim arrBytData(1 To 3), bytData() As Byte
  56.     Dim i As Long, j As Long, n As Long
  57.    
  58.     '连接文件流之前的各项名称值对
  59.     For i = 0 To UBound(NameValue) - 4 Step 2 '最后两对单独处理
  60.         DataBefore = DataBefore & "--" & Boundary & vbCrLf
  61.         DataBefore = DataBefore & "Content-Disposition: form-data; name=""" & NameValue(i) & """" & vbCrLf
  62.         DataBefore = DataBefore & vbCrLf
  63.         DataBefore = DataBefore & NameValue(i + 1) & vbCrLf
  64.     Next
  65.    
  66.     '连接文件流此项的Content-Disposition
  67.     DataBefore = DataBefore & "--" & Boundary & vbCrLf
  68.     DataBefore = DataBefore & "Content-Disposition: form-data; name=""" & NameValue(i) & """; filename=""" & NameValue(i + 1) & """" & vbCrLf
  69.     DataBefore = DataBefore & "Content-Type: application/octet-stream" & vbCrLf
  70.     DataBefore = DataBefore & vbCrLf
  71.    
  72.     '文件流前面的字符串转为流
  73.     arrBytData(1) = StrToUTF8Byte(DataBefore)
  74.    
  75.     '文件转流
  76.     arrBytData(2) = FileToByte(FileFullName)
  77.    
  78.     '文件流之后的字符串(一项)
  79.     DataAfter = "--" & Boundary & vbCrLf
  80.     DataAfter = DataAfter & "Content-Disposition: form-data; name=""" & NameValue(i) & """" & vbCrLf
  81.     DataAfter = DataAfter & vbCrLf
  82.     DataAfter = DataAfter & NameValue(i + 1) & vbCrLf
  83.     DataAfter = DataAfter & "--" & Boundary & "--"
  84.     arrBytData(3) = StrToUTF8Byte(DataAfter) '转为流
  85.    
  86.     '合并字符流和文件流
  87.     ReDim bytData(UBound(arrBytData(1)) + UBound(arrBytData(2)) + UBound(arrBytData(3)) + 2)
  88.     For i = 1 To 3
  89.         For j = 0 To UBound(arrBytData(i))
  90.             bytData(n) = arrBytData(i)(j)
  91.             n = n + 1
  92.         Next
  93.     Next
  94.    
  95.     GetUpLoadSendData = bytData
  96. End Function

  97. Function StrToUTF8Byte(strText)
  98.     '文本转UTF-8编码并去除BOM头
  99.     With CreateObject("adodb.stream")
  100.         .Mode = 3 'adModeReadWrite
  101.         .Type = 2 'adTypeText
  102.         .Charset = "UTF-8"
  103.         .Open
  104.         .Writetext strText
  105.         .Position = 0
  106.         .Type = 1 'adTypeBinary
  107.         .Position = 3 '去除UTF-8编码文本前面的BOM头(三个字节)
  108.         StrToUTF8Byte = .Read()
  109.         .Close
  110.     End With
  111. End Function

  112. Function FileToByte(strFileName As String)
  113.     '文件转流
  114.      With CreateObject("Adodb.Stream")
  115.         .Open
  116.         .Type = 1 'adTypeBinary
  117.         .LoadFromFile strFileName
  118.         FileToByte = .Read
  119.         .Close
  120.     End With
  121. End Function
复制代码
yeah ,大功告成

分享下VBS大神Demon的上传文件的代码:

http://demon.tw/programming/vbs-post-file.html


小贴士:
文件流前后的文本如果不用UTF-8编码的话,文件可以上传成功,但文件名里的中文可能无法正确显示。

评分

5

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-3 20:27 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
liangdonghao222 发表于 2014-11-3 17:20
吴姐,类似打开这样的网页,要输入密码   然后这样的能采集内容吗??急求

你有没有具体的网址?

网上搜了下,Silverlight与flash类似,是个浏览器插件。服务器传到客户端的数据,有可能是明码(可以抓包直接看到),也有可能是加密数据。加密数据就需要解密甚至是反编译了。这样的数据仅仅是excel的vba的话是没法处理的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-4 13:09 | 显示全部楼层
liangdonghao222 发表于 2014-11-4 11:20
那估计是办法了,公司内部用的,吴姐  我想再问 既然能抓qq程序的   那能不能抓其它程序的信息呢?

用Http协议通讯的软件你可以试试。Fiddler是抓Http通讯包的。

理论上,只要有足够强大的工具,任何数据都能抓。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-5 13:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 wcymiss 于 2014-11-5 14:17 编辑
liangdonghao922 发表于 2014-11-4 20:38
吴姐,假如抓包这样的地址   get方式     http://www.131458.com/handler/TaobaoInfo.ashx?nickCode=%u4E ...


呃,Token找到算法不难,关键Javascript不熟悉,被那个extend给难了下,最后还是自己草草定义个方法。
  1. Sub Main()
  2.     Dim strText As String
  3.     Dim strJS As String
  4.     Dim Token, c, nickCode
  5.     nickCode = "为y消得人憔悴"
  6.    
  7.     With CreateObject("MSXML2.XMLHTTP")
  8.         .Open "GET", "http://www.131458.com/js/jquery.js?verr=108", False
  9.         .Send
  10.         strText = .responsetext
  11.         
  12.         strJS = Split(strText, "})(window);")(1) '抠出所需Javascript代码
  13.         strJS = "var jQuery={};jQuery.extend=function(a){jQuery.Token=a.Token};" & strJS '定义extend方法
  14.         Token = JSEval(strJS & ";jQuery.Token('" & nickCode & "');") '计算Token值
  15.         
  16.         .Open "GET", "http://www.131458.com/js/taobao.js?ver=1115", False
  17.         .Send
  18.         strText = .responsetext
  19.         c = Split(Split(strText, "token+""&c=")(1), """")(0)

  20.         .Open "GET", "http://www.131458.com/handler/TaobaoInfo.ashx?nickCode=" & JSEval("escape('" & nickCode & "')") & "&token=" & Token & "&c=" & c & "&_=" & Rnd, False
  21.         .Send
  22.         strText = .responsetext
  23.         Debug.Print strText
  24.     End With
  25. End Sub
  26. Function JSEval(s As String) As String
  27.     With CreateObject("MSScriptControl.ScriptControl")
  28.         .Language = "javascript"
  29.         JSEval = .Eval(s)
  30.     End With
  31. End Function
复制代码
这个js文件里的代码前半部分估计和IE6不兼容。否则用htmlfile导入这个文件执行下函数就出来了。现在却要抠来抠去的,还要自己定义extend。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-5 14:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
无姓人 发表于 2014-11-5 14:00
请问吴姐,我为什么运行13楼的代码,逐语句到.send就出现错误。
最开始13楼的代码能正常运行,也能取数,后 ...

试试这样:
关闭excel,用IE浏览器,打开那个链接。

如果能打开,就打开excel运行代码,仍然出错的话,估计是excel的问题了。

如果IE打不开,检查下IE里的设置。比如代理服务器什么的,是不是被设置了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-8 21:17 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 wcymiss 于 2014-11-8 21:23 编辑
renahu 发表于 2014-11-8 20:21
吴老师,在EH中查自己的帖子,我试了不用模拟cookie就能抓到
Sub Main()
     Dim strText As String
你是在IE登录论坛后运行的代码吧?

xmlhttp是可以调用IE的缓存和cookie的。

你试试清除IE缓存和cookie,重启excel后运行这段代码,看还有没有之前的效果。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-25 07:22 , Processed in 0.067155 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表