• 新浪微博:
  • 微信 :
按键精灵电脑版
立即下载

软件版本:2014.05
软件大小:21.6M
更新时间:07-04

按键精灵安卓版
立即下载

软件版本:3.3.1
软件大小:62.5M
更新时间:5-24

按键精灵iOS版
立即下载

软件版本:1.3.5
软件大小:29.2M
更新时间:06-14

最新企业版UiBot
立即下载

软件版本:2.5
软件大小:181M
更新时间:05-20

快捷导航

登录 后使用快捷导航
没有帐号? 注册

登录 注册
返回列表 12345678» / 17
发新话题 回复该主题

[心得分享] 掌控POST(3) [复制链接]

1#
本帖最后由 michael3636 于 2015-4-30 21:45 编辑

Part 3




接着 Part 2 我们继续深入.先根据我们之前学到的东西,开个批判大会,按键在"我的,命令库自带有2个函数",一个是获取网页源文件,一个是获取网络时间,我们一起来足个批判..写的啥垃圾东西嘛,上代码

  • 按键的"获取网页源文件"代码
  1. Function 获得网页源文件(网页地址)
  2. //说明:支持远程获取文本内容,如:MsgBox lib.网络.获得网页源文件("http://www.anjian.com/test.txt")
  3. //例子:MsgBox lib.网络.获得网页源文件("http://www.anjian.com")
  4. Dim xmlHttp, xmlBody, xmlUrl
  5. Dim ThisCharCode ,NextCharCode ,BytesToBstr
  6. If InStr(网页地址, "http://") = 0 Then
  7. xmlUrl = "http://" & 网页地址
  8. Else
  9. xmlUrl = 网页地址
  10. End if
  11. Set xmlHttp = CreateObject("Microsoft.XMLHTTP") //对象用老了,不适合了,就算用新的也不适合,容易被缓存和cookie干扰
  12. xmlHttp.Open "Get", xmlUrl, False
  13. xmlHttp.Send
  14. xmlBody = xmlHttp.ResponseBody //返回的是字节数组
  15. Set xmlHttp = Nothing
  16. 获得网页源文件 = ""
  17. If Len(xmlBody) = 0 Then Exit Function //字节数组该用LenB()函数
  18. Set ObjStream = CreateObject("Adodb.Stream") //开始转码
  19. With ObjStream
  20. .Type = 1
  21. .Mode = 3
  22. .Open
  23. .Write xmlBody
  24. .Position = 0
  25. .Type = 2
  26. .Charset = "GB2312" //把返回的内容(字节数组,也就是二进制数据)不管三七二十一统统转成"GB2312"编码
  27. BytesToBstr = .ReadText
  28. .Close
  29. End With
  30. Set ObjStream = Nothing
  31. 获得网页源文件 = BytesToBstr
  32. End Function
复制代码
看完代码心向往之,下面详细说明烂在哪里:
1.Microsoft.XMLHTTP对象就版本而言.实在太老了,该用"Msxml2.XMLHTTP.6.0",但是在这里,就算是用"Msxml2.XMLHTTP.6.0",也不适合,为什么呢?

这个对象跟IE浏览器有着不可分割的联系,它的缓存,cookie,是否只用代理等等等等,都跟着IE走的,换而言之,使用这个对象的话,很容易出现例如明明网页改了,但是你得到的源文件却没跟新(缓存问题).去按键论坛竟然上去就是登陆状态,因为你ie登陆了,它跟ie共享cookie,所以它也是登陆状态等等很多此类问题...很多人本来就不熟..它再搞这么一出,,不郁闷才怪,所以,就这个函数的功能而言,用"msxml2.Serverxmlhttp.6.0"或者"WinHttp.WinHttpRequest.5.1"都是可以的它们都是独立于ie的,没有此类情况

2.转码问题,现在网页方面"UTF-8"编码大行其道,可以这么说,100个网站里面至少有95个是utf-8编码的,而不是gb2312,这返回内容都转成gb2312不是捡了芝麻丢了西瓜么?就我个人记忆而言...我印象里只有sina和按键是gbk编码的..其他的全是utf-8....换而言之..就这个函数..在按键和sina得到的源码是正常的...其他的..绝大大部分都是乱码....我从没用过这个函数,但是我想我的判断是不会有错的.
让我们用我们学到的来修正这个错误吧!!!
  1. Function 获得网页源文件(网页地址,网页编码) //多个参数.设置编码.跟乱码说88
  2. Dim xmlHttp, xmlUrl,ObjStream
  3. If InStr(网页地址, "http://") = 0 Then
  4. xmlUrl = "http://" & 网页地址
  5. Else
  6. xmlUrl = 网页地址
  7. End if
  8. Set xmlHttp = CreateObject("WinHttp.WinHttpRequest.5.1") //用这个对象,跟缓存/cookie 干扰说88
  9. xmlHttp.Open "GET", xmlUrl, True
  10. xmlHttp.Send
  11. If xmlhttp.waitforresponse() Then
  12. Set ObjStream = CreateObject("Adodb.Stream")
  13. ObjStream.Type = 1
  14. ObjStream.Mode = 3
  15. ObjStream.Open
  16. ObjStream.Write xmlHttp.ResponseBody
  17. ObjStream.Position = 0
  18. ObjStream.Type = 2
  19. ObjStream.Charset = 网页编码
  20. 获得网页源文件 = ObjStream.ReadText
  21. Else
  22. 获得网页源文件=False //如果获取失败返回值是false
  23. End If
  24. End Function
  25. // 调试 Plugin.Sys.SetCLB(获得网页源文件("www.baidu.com","utf-8")) //百度
  26. // 调试 Plugin.Sys.SetCLB(获得网页源文件("www.sina.com.cn","gbk")) //新浪
复制代码



  • 按键的"获取网络时间"代码.获取网络至于跑国外去么..难不成中国的钟没外国的准?,再说了..俺要淘宝服务器时间.俺要新浪时间..俺要按键时间..咋办啊?最离谱的干啥用"PUT"方式嘛,最最省事的"HEAD"方式足够了懒得批判了.直接上代码
  1. Function 获得网络时间(网页地址)
  2. Dim Http, URL,mt
  3. If InStr(网页地址, "http://") = 0 Then
  4. Url = "http://" & 网页地址
  5. Else
  6. Url = 网页地址
  7. End if
  8. Set Http = CreateObject("WinHttp.WinHttpRequest.5.1")
  9. Http.Open "HEAD", URL, True //head方式,因为服务器返回的头部里面就有时间..所以不需要网页了
  10. Http.Send
  11. If Http.waitforresponse() Then
  12. mt = Http.getresponseheader("Date") //从头部取到时间..js格式的(带有星期几跟时区的格式,跟vbs不一样)
  13. mt = Cdate(Mid(mt, 5, len(mt) - 8)) //截取js格式的时间字符串.得到vbs的模式的时间
  14. 获得网络时间 = DateAdd("h", 8, mt) //中国是8时区,而服务器普遍是世界标准时,也就是0时区得时间.所以得加上8小时
  15. Else
  16. 获得网络时间=False //失败返回false
  17. End If
  18. End Function
  19. TracePrint 获得网络时间("msdn.microsoft.com") //去微软取时间玩
  20. TracePrint 获得网络时间("www.taobao.com") //看看淘宝服务器时间
  21. TracePrint 获得网络时间("www.qq.com") //看看qq网站时间
复制代码


写到这,蛮多代码,蛮多大家没见过的属性方法.相信大家也很莫名了..是该总结下的时候了,

  • Set http = CreateObject("WinHttp.WinHttpRequest.5.1") //创建对象.没啥好说的
  • http.SetProxy // 设置代理:0代表系统代理,需要特定软件设置,1代表直连(不用代理,默认), 2代表使用代理, 两个参数设置代理(如:http.SetProxy 2,"156.32.25.21:8087")
  • http.SetTimeouts //超时设置,4个参数,单位毫秒: 域名解析超时,连接超时,发送请求超时,服务器返回内容超时 默认值为:0,60000,30000,30000 (0代表无限制)
几个有用的属性:

  • http.[option](0)=你设置的值 告诉服务器我是谁,我们可以设置火狐/ie/谷歌随你冒充,,,,,,一般不用 默认值你可以自己tr一下看看
  • http.[option](2)=你设置的值 设置发送的URL链接的编码.默认是65001(UTF-8),其他常用的是 936(GB2312),950(BIG5)
  • http.[option](6)=布尔值 是否激活网页重定向,默认是启用,一般不常用,默认即可
补充:对象的option属性实质上是个数组,有很多内容,我仅仅把有可能用到的罗列出来



  • http.OPen 方法:打开对象,常用参数3个 请求方式,请求地址,是否异步请求
  • http.SetRequestHeader : 设置请求头的方法,参数有2, 头部项目,对应的值 如 :http.setrequestheader "Accept-Encoding","gzip, deflate" (告诉服务器,能接受的压缩方式),一般用于"POST"方式,因为"POST"方式有2个请求头必须我们自己设置,详见 Part 2. 该方法总是出现在open之后,send之前
  • http.send : 向目标服务器发送请求,"POST" 方式的话,需要加上请求内容.如果open方法的异步请求设置为false,此方法将是一个阻塞操作,程序到此将暂停,直到服务器返回信息或者请求失败.如果设置为true,代码将不会暂停.继续执行

  • http.waitforresponse :当open方法的异步请求设置为true时.此方法才起作用,等待请求完成,代码到此暂停..直到请求有个结果,返回值为布尔值,表明请求失败或者成功,参数可有可无,参数为请求超时的秒数,超过参数设置极为请求失败,返回false.不设置参数则以http.SetTimeouts设置的参数为准


以下属性只有当请求成功以后才有意义:

  • http.GetResponseHeader :取得服务器返回的头部的指定项目的值,用法同http.SetRequestHeader,2者的区别是,一个是设置发给服务器的头部,一个是取得服务器返回的头部
  • http.GetAllResponseHeaders 取得服务器所返回的头部的所有内容
  • http.ResponseText 只读属性,取得服务返回的文本
  • http.ResponseBody 只读属性,取得服务器返回的最原始数据,(2进制数据,即字节数组类型)

好了..一口气说完了.下面说下3种对象各自的优缺点
"WinHttp.WinHttpRequest.5.1"的特点:

  • 使用上无任何限制,我们可以设置任何请求的头部参数和内容,cookie和缓存对象内部自维护,这意味着..我们可以创建10个对象,同时使用10个对象在按键登陆10个账号.
"Msxml2.serverXMLHTTP.6.0"

  • 无法在请求头设置"Referer"项目,即无法进行来源冒充,其他基本跟上面相同,无waitforresponse方法.但是有readyState属性.可以用该属性是否等于4来进行请求是否成功的判断
"Msxml2.XMLHTTP.6.0"

  • 无法设置"Cookie",无法来源冒充,跟IE共享cookie/缓存/代理,超时无法设置.其他跟上面差不多,这也意味着,你无论建立多少个对象,都是使用一样的cookie,意味着无法同时对同一个网站进行多账号操作
  • 看上去好像这东西最没用,但是换个方式想:比如,我开个ie登陆按键,顺便勾下"自动登陆".然后退出ie,,然后创建个这个对象去随便"GET"按键论坛,,,啊哈..啥都没干直接登陆状态啊.....
  • 这个对象如何克服该死的缓存问题.其实很简单..open以后加一句:http.setrequestheader "If-Modified-Since","Tue 24 Feb 2009 08:01:04 GMT" ,然后按照正常步骤来..齐活啦...木有缓存困扰啦.这行代码的意思是:给请求头加一个 "If-Modified-Since"项目,内容是一个过去的js格式日期,只要过去的就行了,解释就是:浏览器告诉服务器说:大哥,自从这个日期以后你网页变过没啊,如果变过发给我啊.......这肯定是废话...09年当现在都几年过去了,,网页肯定变过了,,服务器大哥就发过来网页了...而不是发个304让你自己从硬盘解决(其实实际情况很复杂,有时候根本连请求都不发直接读缓存..这里不展开了)
下一节我们将进行实战.闹他个天翻地覆,为了隐藏而隐藏

    已有7评分我要评分查看所有评分

    个人收藏
    QQ:2074137818
    2#


    3#

    谢谢学习了

    4#

    :掌控POST(3)修改

    5#

    感谢分享我

    6#


    7#


    8#

    学习学习

    9#

    ..............

    10#

    掌控POST(3)

    11#

    跟着大神学习

    12#


    13#

    掌控POST(3)修改

    14#

    sdaaaaaaaaa

    15#

    极具恐惧

    16#

    看看学习一下啊

    17#

    继续观看

    18#

    继续学习,很有价值

    19#

    看看!!!!!!

    20#

    大神好棒的!!!哦

    发新话题 回复该主题