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-26 09:42 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:网页交互
本帖最后由 wcymiss 于 2014-10-27 12:58 编辑

处理xml数据
8楼的例子返回的就是一个xml文档。

在excel里,有一个很快捷的方式导入xml文档:
  1. Sub Main()
  2.     ThisWorkbook.XmlImport _
  3.         URL:="http://www.cffex.com.cn/fzjy/tjsj/pztj/pzrtj/2014/index.xml", _
  4.         ImportMap:=Nothing, _
  5.         Overwrite:=True, _
  6.         Destination:=ActiveSheet.Range("a1")
  7. End Sub
复制代码
如果需要自定义提取的内容,你或者可以这样写:
  1. Sub Main()
  2.     Dim arrEM(1 To 4), arrEMname
  3.     Dim arrData(1000, 1 To 4)
  4.     Dim i As Long, j As Long
  5.     With CreateObject("MSXML2.XMLHTTP")
  6.         .Open "GET", "http://www.cffex.com.cn/fzjy/tjsj/pztj/pzrtj/2014/index.xml", False
  7.         .send
  8.         arrEMname = Array(, "productid", "tradingday", "volume", "openinterest")
  9.         With .responseXML
  10.             For i = 1 To 4
  11.                 Set arrEM(i) = .getElementsByTagName(arrEMname(i))
  12.             Next
  13.             For i = 0 To arrEM(1).Length - 1
  14.                 For j = 1 To 4
  15.                     arrData(i, j) = arrEM(j)(i).Text
  16.                 Next
  17.             Next
  18.         End With
  19.     End With
  20.     Cells.Clear
  21.     Range("a1:d1").Value = Array("品种", "日期", "总成交量", "总持仓量")
  22.     Range("a2").Resize(i, 4).Value = arrData
  23. End Sub
复制代码
xml的dom提取数据的方法有很多。
具体可以参考http://www.w3school.com.cn/xmldom/index.asp

小贴士:
1、当URL是一个格式化的xml文档时,xmlhttp可将服务器返回的数据整理为一个DomDocument对象放在responseXML中。
你也可以CreateObject("MSXML2.DomDocument")然后用load(url)或者loadxml(text)方法获得DomDocument对象。

2、点击Fiddler的Response框的XML按钮,可以很清晰的看到XML数据结构。

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-27 11:35 | 显示全部楼层
本帖最后由 wcymiss 于 2014-10-28 09:29 编辑

初识JSON

JSON数据的特点:
1、用方括号扩住的是数组,数组内元素以逗号分隔。如:["甲","乙","丙"]、[1,2,3]
2、用花括号扩住的是对象,对象内各属性以逗号分隔,属性名和属性值以冒号分隔。同一对象里的属性名不会重复如对象{"name":"甲","age":36},含name、age两个属性,属性值分别为 “甲”和36。
3、对象的属性值可以是数组。数组的元素可以是对象。JSON数据就是数组对象嵌套的大集合。比如,下面的JSON数据记录了甲乙二人的基本信息:
  1. [{"name":"甲","age":36,"children":[{"name":"甲儿","age":10},{"name":"甲女","age":7}]},{"name":"乙","age":28,"children":[{"name":"乙女","age":6}]}]
复制代码
将其格式化后,看起来更清晰:
  1. [
  2.   {
  3.     "name" : "甲",
  4.     "age" : 36,
  5.     "children" :
  6.     [
  7.       {
  8.         "name" : "甲儿",
  9.         "age" : 10
  10.       },
  11.       {
  12.         "name" : "甲女",
  13.         "age" : 7
  14.       }
  15.     ]
  16.   },
  17.   {
  18.     "name" : "乙",
  19.     "age" : 28,
  20.     "children" :
  21.     [
  22.       {
  23.         "name" : "乙女",
  24.         "age" : 6
  25.       }
  26.     ]
  27.   }
  28. ]
复制代码
解读:甲36岁,有10岁的甲儿和7岁的甲女两个子女;乙28岁,有6岁的乙女一个子女。

JSON数据易于解读,字符简短,方便网络传输,在网络中应用相当广泛。

敬请进入http://www.w3school.com.cn/json/index.asp学习更多JSON知识。

小贴士:
点击Fiddler的Response框的JSON按钮,可以很清晰的看到JSON数据结构。


再补个附件,对比下类似效果的table和xml: 对比类似效果的table和xml.rar (457 Bytes, 下载次数: 427)
可以都用excel打开,xml打开的时候选择“xml列表”

吐槽:囧!这篇帖子提交时居然提示我含有不良信息!后来一个个词检查,发现问题竟然在“孩 子”二字上,改成“子女”就没问题了!!!。额滴大神,“孩 子”二字有啥问题涅?

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-27 14:05 | 显示全部楼层
本帖最后由 wcymiss 于 2014-10-31 09:41 编辑

JSON转换成vba对象

1、JSON数组在vba内需要用For Each来获取其元素:(For Each 后面的变量不能定义为Object类型)
  1. Sub Test()
  2.     Const strJSON As String = "[""甲"",""乙"",""丙""]"
  3.     Dim objJSON As Object
  4.     Dim Cell '这里不能定义为object类型
  5.     With CreateObject("msscriptcontrol.scriptcontrol")
  6.         .Language = "JavaScript"
  7.         .AddCode "var mydata =" & strJSON
  8.         Set objJSON = .CodeObject
  9.     End With
  10.     Stop '查看vba本地窗口里objJSON对象以了解JSON数据在vba里的形态
  11.     For Each Cell In objJSON.mydata
  12.         Debug.Print Cell
  13.     Next
  14. End Sub
复制代码
2、JSON对象在vba内可直接用“对象.属性”的方法获取,但当名称不被vba允许时,用CallByName函数获取:
  1. Sub Test()
  2.     Const strJSON As String = "{""name"":""甲"",""age"":36}"
  3.     Dim objJSON As Object
  4.     With CreateObject("msscriptcontrol.scriptcontrol")
  5.         .Language = "JavaScript"
  6.         .AddCode "var mydata=" & strJSON
  7.         Set objJSON = .CodeObject
  8.     End With
  9.     Stop '查看本地窗口
  10.     Debug.Print objJSON.mydata.age
  11.     Debug.Print objJSON.mydata.Name '此句出错
  12. End Sub
复制代码
“name”作为vba对象的属性时会被自动首字母大写。而JavaScript里是区分大小写的,“Name”不能等同“name”,json数据里无“Name”属性,所以代码运行出错。

这时让我们请出“CallByName”吧。(使用前请先查看vba帮助中对此函数的说明

将出错的那句代码改成:
  1. Debug.Print CallByName(objJSON.mydata, "name", VbGet)
复制代码
ok。数据成功获取!

3、综合处理:
  1. Sub Test()
  2.     Const strJSON As String = "[{""name"":""甲"",""age"":36,""children"":[{""name"":""甲儿"",""age"":10},{""name"":""甲女"",""age"":7}]},{""name"":""乙"",""age"":28,""children"":[{""name"":""乙女"",""age"":6}]}]"
  3.     Dim objJSON As Object
  4.     Dim Person, Child
  5.     Dim arrData(1 To 100, 1 To 4)
  6.     Dim i As Long
  7.    
  8.     With CreateObject("msscriptcontrol.scriptcontrol")
  9.         .Language = "JavaScript"
  10.         .AddCode "var mydata =" & strJSON
  11.         Set objJSON = .CodeObject
  12.     End With
  13.     Stop '多多查看本地窗口,你才会进步更快。。。
  14.    
  15.     '为了编写方便,假设每个Person的children数组里至少有一个元素:
  16.     For Each Person In CallByName(objJSON, "mydata", VbGet)
  17.         For Each Child In CallByName(Person, "children", VbGet)
  18.             i = i + 1
  19.             arrData(i, 1) = CallByName(Person, "name", VbGet)
  20.             arrData(i, 2) = CallByName(Person, "age", VbGet)
  21.             arrData(i, 3) = CallByName(Child, "name", VbGet)
  22.             arrData(i, 4) = CallByName(Child, "age", VbGet)
  23.         Next
  24.     Next
  25.     Cells.Clear
  26.     Range("a1:d1").Value = Array("name", "age", "childname", "childage")
  27.     Range("a2").Resize(i, 4).Value = arrData
  28. End Sub
复制代码
个人建议:为了区分vba对象本身的属性,建议JSON对象的属性都用CallByName表示。


更多在vba中使用JavaScript的例子,敬请参考figfig大师的帖子:
http://club.excelhome.net/thread-478544-1-1.html
http://club.excelhome.net/thread-483942-1-1.html
http://club.excelhome.net/thread-484702-1-1.html

评分

5

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-27 15:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 wcymiss 于 2014-10-27 16:51 编辑

编写JavaScript代码处理JSON(一)

个人为了练习分析JavaScript、JSON的能力,常编写JavaScript处理JSON成一个“表格文本”,放入剪贴板后粘贴到工作表内。

此法需要学习JavaScript知识。http://www.w3school.com.cn/js/index.asp

仍以之前的JSON数据为例:
  1. Sub Test()
  2.     Const strJSON As String = "[{""name"":""甲"",""age"":36,""children"":[{""name"":""甲儿"",""age"":10},{""name"":""甲女"",""age"":7}]},{""name"":""乙"",""age"":28,""children"":[{""name"":""乙女"",""age"":6}]}]"
  3.     Dim strJS As String
  4.     Dim strTable As String
  5.    
  6.     '为了编写方便,假设每个Person的children数组里至少有一个元素:
  7.     strJS = "var mydata=" & strJSON _
  8.         & ";var i,j;var s='name\tage\tchildname\tchildage\r';" _
  9.         & "for(i=0;i<mydata.length;i++){for(j=0;j<mydata[i].children.length;j++)" _
  10.         & "{s+=mydata[i].name+'\t'+mydata[i].age+'\t'+mydata[i].children[j].name+'\t'+mydata[i].children[j].age+'\r'}};"
  11.     strTable = JSEval(strJS)
  12.     Debug.Print strTable
  13.    
  14.     CopyToClipbox strTable
  15.     Cells.Clear
  16.     Range("a1").Select
  17.     ActiveSheet.Paste
  18. End Sub

  19. Function JSEval(strJS As String) As String
  20.     With CreateObject("MSScriptControl.ScriptControl")
  21.         .Language = "javascript"
  22.         JSEval = .Eval(strJS)
  23.     End With
  24. End Function

  25. Sub CopyToClipbox(strText As String)
  26.     With CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
  27.         .SetText strText
  28.         .PutInClipboard
  29.     End With
  30. End Sub
复制代码
JavaScript的'\t'相当于 vbTab,'\r'相当于 vbCr,取出值后,每列之间用'\t'连接,每行之间用'\r'连接,这样的文本复制到剪贴板后,可直接粘贴到工作表形成表格数据。

本法非主流,不喜勿用!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-27 16:45 | 显示全部楼层
本帖最后由 wcymiss 于 2014-10-28 09:53 编辑

编写JavaScript代码处理JSON(二)

70楼的获取QQ群成员列表的数据为例,再上一个处理JSON的例子:
  1. Sub Main()
  2.     Const gc As String = "" '群号
  3.     Const bkn As String = "" '从fiddler中获取
  4.     Const uin As String = "" 'QQ号
  5.     Const skey As String = "" '从fiddler中获取
  6.     Dim strText As String
  7.     Dim strJS As String
  8.     Dim strTable As String
  9.    
  10.     With CreateObject("WinHttp.WinHttpRequest.5.1")
  11.         .Open "GET", "http://qinfo.clt.qq.com/cgi-bin/qun_info/get_group_members_new?gc=" & gc & "&bkn=" & bkn, False
  12.         .setRequestHeader "Cookie", "uin=o" & uin & "; skey=" & skey
  13.         .Send
  14.         strText = .responsetext
  15.     End With
  16.    
  17.     strJS = "var mydata=" & strText _
  18.         & ";var x,qq,s='qq号\t昵称\t群名片\t等级\r';" _
  19.         & "var mems=mydata.mems,cards=mydata.cards,lv=mydata.lv,lvname=mydata.levelname;" _
  20.         & "for(x in mems){qq=mems[x].u;s+=qq+'\t'+mems[x].n+'\t'+(cards[qq]||'')+'\t'+lvname['lvln'+lv[qq].l]+'\r'}"
  21.     strTable = JSEval(strJS)

  22.     CopyToClipbox strTable
  23.     Cells.Clear
  24.     Range("a1").Select
  25.     ActiveSheet.Paste
  26. End Sub
复制代码
此JSON数据内的很多对象都以QQ号为属性名,如mems[qq]可得该成员基本信息,cards[qq]得到群名片信息。所以可以遍历mems对象后获取qq号和昵称,再获取该qq群名片信息和等级信息组成table表。

如果不用JavaScript语句处理此JSON,因为群名片和群员等级在不同的对象里,取出后需要按照QQ号用字典来定位匹配。这样代码就相对较长了。有兴趣的朋友可以写个练练手。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-27 16:58 | 显示全部楼层
本帖最后由 wcymiss 于 2014-10-28 09:16 编辑

作业四

除了我上面的用javascript代码处理的方式,用其他方式提取群成员列表。包括:qq号、昵称、群名片、等级。


TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-28 09:59 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-28 11:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 wcymiss 于 2014-10-28 16:59 编辑

初识登录

登录其实没那么神秘。它也就是向服务器发送的一个POST请求。

我们来看一个简单的登录例子,以网易信箱(163.com)为例。

打开Fiddler,打开浏览器,登录网易信箱同时抓包。
搜索登录名vbatest(今天新注册的,你们可以随便整。哈哈):

登录0.png

前面有 图标-POST请求.png 标记的表明是POST请求。

163登录2.png

选择该session,点击Request框的Raw按钮通览一下所有发送内容:

163登录3.png

password竟然是明码,小小鄙视下网易。


再看Response框。哇,满满的Set-Cookie啊。最关键的里面有一句“LOGIN_SUCCESS”!!

163登录5.png

这样可以确定这个session是我们要找的登录session了!我们只要把它的Request的内容模拟好了就能成功登录(好期待)。

点击Request框的WebForms按钮通览发送的各参数:

163登录4.png

居然没有动态参数。。(乐坏了)

cookie、referer的先不忙测试。先copy抓包内容,写代码:
  1. Sub Main()
  2.     Const username As String = "vbatest"
  3.     Const password As String = "12341234"
  4.     Dim strText As String
  5.     Dim uid As String
  6.     uid = username & "@163.com"
  7.     With CreateObject("MSXML2.XMLHTTP")
  8.         .Open "POST", "https://mail.163.com/entry/cgi/ntesdoor?df=mail163_letter&funcid=loginone&iframe=1&passtype=1&product=mail163&race=63_31_31_gz&uid=" & username & "@163.com", False
  9.         .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  10.         .Send "savelogin=0&url2=http%3A%2F%2Fmail.163.com%2Ferrorpage%2Ferror163.htm&username=" & username & "&password=" & password & "&password="
  11.         strText = .getallresponseheaders
  12.         Debug.Print strText
  13.         strText = .responsetext
  14.         Debug.Print strText
  15.     End With
  16. End Sub
复制代码
立即窗口:

163登录6.png

登录成功!


小贴士:
1、不要以密码作为搜索内容。密码经常被加密。以密码原文作为搜索内容很可能搜不到所需session。
2、以登录名作为搜索内容相对好些。但也有可能被加密而搜不到正确的session。这时搜到的包含登录名的最早的session可能是登录后出现的页面。登录的session前面一般都有post的图标,可以根据这个再加上查看Request和Response的内容判断是否是我们所需的登录session。


===============
经过kangatang提醒,本例经过测试,将SendData的参数作为URL的参数用GET请求也可以实现登录,代码如下(原SendData的参数我精简了,只留了用户名和密码):
  1. Sub Main()
  2.     Const username As String = "vbatest"
  3.     Const password As String = "12341234"
  4.    
  5.     With CreateObject("MSXML2.XMLHTTP") 'CreateObject("WinHttp.WinHttpRequest.5.1") '
  6.         .Open "GET", "https://mail.163.com/entry/cgi/ntesdoor?df=mail163_letter&funcid=loginone&iframe=1&passtype=1&product=mail163&race=63_31_31_gz&uid=" & username & "@163.com&" & "username=" & username & "&password=" & password, False
  7.         .send
  8.         Debug.Print .Getallresponseheaders
  9.         Debug.Print .responsetext
  10.     End With
  11. End Sub
复制代码
但不是所有的网站都可以这样的。这只是个例。

点评

才女啊。。。佩服  发表于 2014-10-28 17:09
get 登录 https://reg.163.com/logins.jsp?username=vbatest&password=12341234&url=http://fm163.163.com/coremail/fcg/ntesdoor2  发表于 2014-10-28 15:32

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-28 16:46 | 显示全部楼层
本帖最后由 wcymiss 于 2014-10-29 14:25 编辑

登录之后可以做什么----查询数据

登录并非是我们的最终目的。最终目的是查询一些非登录不能查看的数据,或是发送数据。如论坛登录后,可下载附件,可发帖;邮箱登录后,可收件发件。


前面讲过,xmlhttp和winhttp只要该对象不销毁,都可以保持cookie。我们登录就是为了取得一个被允许查看数据和发送数据的cookie,然后执行查询和发送的请求。

仍以网易邮箱为例:

登录后网页显示邮件列表,此过程抓包。

163登录1.png


抓包后,在fiddler内搜索邮件列表页面内的某字符串,查找到显示邮件列表的页面:(Response返回一串JSON数据)

邮件2.png


拷贝Request的相关内容,编写代码:
  1. Sub Main()
  2.     Const username As String = "vbatest"
  3.     Const password As String = "12341234"
  4.     Dim strText As String
  5.     Dim sid As String
  6.    
  7.     With CreateObject("MSXML2.XMLHTTP") 'CreateObject("WinHttp.WinHttpRequest.5.1") '
  8.         .Open "POST", "https://mail.163.com/entry/cgi/ntesdoor?df=mail163_letter&funcid=loginone&iframe=1&passtype=1&product=mail163&race=63_31_31_gz&uid=" & username & "@163.com", False
  9.         .setrequestheader "Content-Type", "application/x-www-form-urlencoded"
  10.         .send "username=" & username & "&password=" & password
  11.         sid = Split(Split(.responsetext, "sid=")(1), "&")(0)
  12.         
  13.         .Open "POST", "http://mail.163.com/js6/s?sid=" & sid & "&func=mbox:listMessages&topNav_mobileIcon_show=1&TopTabReaderShow=1&TopTabReaderTipsShow=1&FrameMasterMailPopupClose=1&welcome_welcomemodule_mailrecom_click=1&LeftNavfolder1Click=1&mbox_folder_enter=1", False
  14.         .setrequestheader "Content-Type", "application/x-www-form-urlencoded"
  15.         .setrequestheader "Accept", "text/javascript" '不加这句的话返回的不是json是xml数据
  16.         .send "var=" & encodeURI("<?xml version=""1.0""?>" _
  17.             & "<object>" _
  18.             & "<int name=""fid"">1</int>" _
  19.             & "<string name=""order"">date</string>" _
  20.             & "<boolean name=""desc"">true</boolean>" _
  21.             & "<int name=""limit"">20</int>" _
  22.             & "<int name=""start"">0</int>" _
  23.             & "<boolean name=""skipLockedFolders"">false</boolean>" _
  24.             & "<string name=""topFlag"">top</string>" _
  25.             & "<boolean name=""returnTag"">true</boolean>" _
  26.             & "<boolean name=""returnTotal"">true</boolean>" _
  27.             & "</object>")        Debug.Print .responsetext
  28.     End With
  29. End Sub
复制代码
查看邮件列表的SendData是一个xml数据。不管它什么数据,我们都照样copy就是了。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-10-29 14:24 | 显示全部楼层
本帖最后由 wcymiss 于 2014-10-29 14:25 编辑

登录之后可以做什么----发送数据

上一贴说的是登录后查看邮件。这次来试一次发送邮件。


手工登录、发送邮件,同时抓包。


截取发送邮件内容的部分字符串作为搜索文本,找到session。


拷贝Request里相关内容,编写代码:
  1. Sub Main()
  2.     Const Username As String = "vbatest"
  3.     Const Password As String = "12341234"
  4.     Const Account As String = "vbatest@163.com"
  5.     Const ToAccount As String = "wcymiss@163.com"
  6.     Const Subject As String = "主题:用web发送邮件"
  7.     Const Content As String = "正文:看到此邮件则证明发送成功"
  8.     Dim strText As String
  9.     Dim Sid As String
  10.     Dim Senddata
  11.    
  12.     With CreateObject("MSXML2.XMLHTTP")
  13.         .Open "POST", "https://mail.163.com/entry/cgi/ntesdoor?df=mail163_letter&funcid=loginone&iframe=1&passtype=1&product=mail163&race=63_31_31_gz&uid=" & Username & "@163.com", False
  14.         .setrequestheader "Content-Type", "application/x-www-form-urlencoded"
  15.         .Send "username=" & Username & "&password=" & Password
  16.         Sid = Split(Split(.responsetext, "sid=")(1), "&")(0)
  17.         
  18.         .Open "POST", "http://mail.163.com/js6/s?sid=" & Sid & "&func=mbox:compose&FrameMasterMailPopupClose=1&cl_send=2&l=compose&action=deliver", False
  19.         .setrequestheader "Content-Type", "application/x-www-form-urlencoded"
  20.         .setrequestheader "Accept", "text/javascript" '不加这句的话返回的不是json是xml数据
  21.         Senddata = "var=" & encodeURI("<?xml version=""1.0""?>" _
  22.             & "<object>" _
  23.             & "<string name=""id"">c:" & GetLongTime() & "</string>" _
  24.             & "<object name=""attrs"">" _
  25.             & "<string name=""account"">" & Account & "</string>" _
  26.             & "<boolean name=""showOneRcpt"">false</boolean>" _
  27.             & "<array name=""to""><string>" & ToAccount & "</string></array>" _
  28.             & "<array name=""cc""/><array name=""bcc""/>" _
  29.             & "<string name=""subject"">" & Subject & "</string>" _
  30.             & "<boolean name=""isHtml"">true</boolean>" _
  31.             & "<string name=""content"">" & Content & "</string>" _
  32.             & "<int name=""priority"">3</int>" _
  33.             & "<boolean name=""saveSentCopy"">true</boolean>" _
  34.             & "<string name=""charset"">GBK</string></object>" _
  35.             & "<boolean name=""returnInfo"">false</boolean>" _
  36.             & "<string name=""action"">deliver</string>" _
  37.             & "<int name=""saveTextThreshold"">1048576</int>" _
  38.             & "</object>")
  39.         .Send Senddata
  40.         Debug.Print .responsetext
  41.     End With
  42. End Sub
  43. Function encodeURI(strTobecoded As String) As String
  44.     With CreateObject("msscriptcontrol.scriptcontrol")
  45.         .Language = "JavaScript"
  46.         encodeURI = .eval("encodeURIComponent('" & strTobecoded & "');")
  47.     End With
  48. End Function

  49. Function GetLongTime()
  50.     With CreateObject("msscriptcontrol.scriptcontrol")
  51.         .Language = "JavaScript"
  52.         GetLongTime = .eval("new Date().getTime();")
  53.     End With
  54. End Function
复制代码
SendData里有部分参数还可以精简。有兴趣的话可以自己测试。

GetLongTime自定义函数的作用是产生一个国际通用的表示当前时间的13位数字。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-26 01:11 , Processed in 0.055108 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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