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

软件版本: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» / 15
发新话题 回复该主题

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

1#
本帖最后由 michael3636 于 2015-5-1 04:55 编辑

Part 4




让我们继续我们的征途,相信每一个仔细看完前三篇文章的人.都对XHR对象都有了一定的认识,而不是像以前使用那样照搬照写,压根不知道为啥这么写.好了废话不多说了,进入正题,老规矩,先来点相关知识垫垫底:




  • 网页上的时间: 玩网页的时候,我们一般会碰上2种形式的时间:

  • Thu, 30 Apr 2015 12:05:28 GMT :这种类型的,这是个js格式的时间显示模式,一般出现在服务器的返回头部,虽然平时不常见,但是我们一看就能认识,处理也简单,用Mid() Cdate() 函数我们就能很好的得到我们常用的vbs时间格式
  • 时间戳: 一般出现在"POST"的请求内容或者"GET"的查询字符串里,一般看到一串很长的以"14"开头的数字,我们就得考虑它是否代表时间,其实就是时间的纯数字表现形式:定义是从1970年1月1日0点到目前为止的秒数,它包含了年/月/日/时/分/秒的所有信息(js的时间格式的本质就是从时间戳数字格式化而来的),根据定义我们很简单的就能用按键写出我们按键版的时间戳:
  1. t = datediff("s", "1970-1-1", now) - 3600 * 8
  2. //我们是8时区的,为了跟服务器时区统一,我们的减去8小时的秒数
复制代码



好了.进入主题,今天的主题是: 用XHR登陆账号(3种方法)

注意:本章节只说英文数字类的账号密码.不涉及中文或其他字符,因为这涉及到字符编码问题,是个大话题,不是几句话能讲完的,我会在以后专门讲到


  • POST方式(本质是拷贝浏览器的登陆方式)

  • 我们打开火狐,进入按键综合论坛版块"http://bbs.anjian.com/forum.php?mod=forumdisplay&fid=17",如果账号已经登陆,请先退出账号.填好我们的账号和密码,然后打开firebug.如图1然后,点一下清除按钮,确保firebug很干净,然后按下登陆按钮,等待网页载入完成.
  • 我了个去..firebug里好大一坨,呵呵呵,不用管,拉到最上面,有一个"[新]综合讨论"文字,前面还有"+",点开这个"+",图2
  • 现在我把我们需要用到的内容摘入如下:



头信息=>来自上传流的信息:
Content-Length 68
Content-Type application/x-www-form-urlencoded
第一个:我们上传的内容的长度,由于账号密码长度的不一样,可能我们很多人这个数据是不一样的,这个具体的数字我们可用用len()函数搞定,具体形式是,len(上传的内容)
第二个:客户端要告诉服务器的上传的内容的类型,上面的意思是,应用类的,通过URL编标的,这个不需要去了解很深,到时候照搬就行了,这2个内容XHR是不会自动帮我们加到请求头去的,所以到时候我们得自己加上去

POST=>源代码
username=我的账号&password=我的密码&quickforward=yes&handlekey=ls
这个相信我们只需要关注里面的红字即可

响应:

window.location.href='http://bbs.anjian.com
/forum.php?mod=forumdisplay&fid=17';]]>

很明显,这是我们登陆成功后服务器给我的反馈,也就是说,只要我们得到这个反馈.就说明我们登陆成功啦..那么,登陆失败的反馈是什么呢?很简单啊,退出账号,故意打错密码,然后登陆,我们就能得到登陆失败的反馈了,这些内容有助于我们判断是否登陆成功或者除了其他什么状况
心细的朋友估计要说了,这跟浏览器的表现对不上啊,浏览器登陆成功的话就直接跳回综合论坛啦,而不是出来这个,为什么呢?其实很简单,这是XML封装的一行js代码,浏览器得到这段文本后执行了这段代码,这段代码的意思是,让浏览器当前窗口转到网址"http://bbs.anjian.com
/forum.php?mod=forumdisplay&fid=17",这不就是综合论坛的网址么.而这些代码的执行,都是在后台的,我们是看不到的..这不就跟我们看到的实际情况对上号了么...

对了,还差一个.那就是POST方式提交内容的目标网址:
很简单的操作,把我们的鼠标放到firebug的目标URL上,按下右键,点击复制网址,我们就得到目标网址了,如下:
http://bbs.anjian.com/member.php ... submit=yes&inajax=1

好了,我们需要的消息都得到了.接下来可以写代码了,咋写?很简单啊..刚学嘛..傻瓜式复制,浏览器肿么做我们就怎么写:

  • 去按键综合论坛,综合之前学到的知识,我们知道这个应该是"GET"方式
  • 用POST方式登录
  • 浏览器成功后回到综合论坛了,XHR可不会执行代码..我们手动去呗,"GET"方式,


开写,如下:
  1. //第一步:GET方式去综合版块
  2. Set http = CreateObject("WinHttp.WinHttpRequest.5.1")//创建XHR对象
  3. URL="http://bbs.anjian.com/forum.php?mod=forumdisplay&fid=17"
  4. http.open "GET", URL, false
  5. http.send
  6. If Not isEmpty(http.responsetext) Then
  7. MessageBox "第1步成功!!!"
  8. Else MessageBox "第1步失败失败"
  9. End If


  10. //第二步:POST方式登录
  11. URL = "http://bbs.anjian.com/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1"
  12. str = "username=Mic_test&password=password1&quickforward=yes&handlekey=ls"
  13. //上面的str是我们要发送的内容,其中:mic_test是账号,大家可以换成自己的,password1是密码,大家可以换成自己的
  14. http.open "POST", URL, False
  15. http.setrequestheader "Content-Type","application/x-www-form-urlencoded" //加上2个header
  16. http.setrequestheader "Content-Length",len(str) //用函数取字符串长度
  17. http.send str//发送请求,带着内容
  18. If Not isEmpty(http.responsetext) Then
  19. MessageBox http.responsetext //看看返回的内容是不是对得上
  20. Else MessageBox "第2步失败失败"
  21. End If


  22. //第三步:浏览器会自动去,我们...手动去,,
  23. URL="http://bbs.anjian.com/forum.php?mod=forumdisplay&fid=17"
  24. http.open "GET", URL, false
  25. http.send
  26. If Not isEmpty(http.responsetext) Then
  27. MessageBox "第3步成功!!!,扔进剪贴板"
  28. Plugin.Sys.SetCLB http.responsetext
  29. Else MessageBox "第1步失败失败"
  30. End If
复制代码
啊哈.....看看剪贴板的内容,图3,成功啦....


等等,问题来了

  • 为啥我得到返回值:

window.location.href='http://bbs.anjian.com/./';]]>
跟上面的对不上?虽然差不多但是有区别啊....
赞一下,兄弟或者姐们,你真细心,其实很好解释的,因为这个对象它的提交header里默认是不带"referer"项目的,就是我们在之前说到的来源的,也就是说,这个对象它是不会主公告诉服务器我是从哪个网页来的,呵呵呵.牛吧..要跟上面一样也简单啊.在第二步设置header的地方加一句代码:
http.setrequestheader "Referer","http://bbs.anjian.com/forum.php?mod=forumdisplay&fid=17"
然后再执行.这次是不是对上号了?,当然这是题外话,我们只要成功就行了,至于返回值具体是什么内容不重要不是么?在实际应用中这句代码是多余的,但是从这我们知道了一个这个对象的特性,它的请求header是不带"referer"的,假若我们需要的话,我们可以随意添加进行来源冒充,多好啊......



进一步思考:
浏览器去网页没办法.不然没法用登陆界面去登陆账号,XHR没这问题,是不是可以省了第一步呢?很简单啊..既然有这想法.市实验下就行了,把第一部分注释掉,记得创建XHR哪行代码别注释掉啊.........我们再调试,代码就不贴了.
啊哈...成功啦..我们不需要第一步啦...是啊是啊..万事贵在尝试嘛......XHR的优点就开始凸显了不是么?虽然写起来麻烦点不直观,但是就效率而言,是浏览器所根本无法比拟的,多好的技术啊..

2."GET"方式



在 Part 2 我讲到过很多时候"GET"和"POST" 可以互转的,我们能否用"GET"登陆呢?这还不简单.能不能的试试不就知道了么,
截取上面的POST方式的 地址和内容:
提交地址是: http://bbs.anjian.com/member.php ... submit=yes&inajax=1
提交内容是: username=我的账号&password=我的密码&quickforward=yes&handlekey=ls
照葫芦画瓢我们把内容接到地址里去,看代码:
  1. //"GET"登陆
  2. Set http = CreateObject("WinHttp.WinHttpRequest.5.1")//创建XHR对象
  3. //原来的地址
  4. URLold = "http://bbs.anjian.com/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1"
  5. //原来的请求内容
  6. str = "username=Mic_test&password=password1&quickforward=yes&handlekey=ls"
  7. URL=URLold & "&" & str //把2者连起来,看格式可以知道每个参数是用"&",连接的,所以我们再 2者之间加个"&"
  8. //上面的str是我们要发送的内容,其中:mic_test是账号,大家可以换成自己的,password1是密码,大家可以换成自己的
  9. http.open "GET", URL, False
  10. http.send //发送请求,"get"不需要内容,而且不需要设置header 多方便啊.保佑成功啊....
  11. If Not isEmpty(http.responsetext) Then
  12. MessageBox http.responsetext //看看返回的内容是否登陆成功了...
  13. Else MessageBox "失败"
  14. End If


  15. //去网址再次确认看看是不是真的登陆了
  16. URL="http://bbs.anjian.com/forum.php?mod=forumdisplay&fid=17"
  17. http.open "GET", URL, false
  18. http.send
  19. If Not isEmpty(http.responsetext) Then
  20. MessageBox "成功!!!,扔进剪贴板"
  21. Plugin.Sys.SetCLB http.responsetext
  22. Else MessageBox "失败"
  23. End If
复制代码
哈哈哈,激动吧.事实证明你成功了,,,,呵呵呵

需要着重说明的是:这个方式是否可以登录得看服务器短校本代码是肿么写的,你在按键成功了不代表你在任何地方能成功,所以得学会尝试和实践!!!!

3."Cookie"方式(登录都省了,带着cookie直接访问网页去!!!!)



按键论坛登录里有个自动登陆的复选框,相信很多人都随手点了,派啥用的呢,,,很简单啊,,你选了.明天一觉醒来来按键论坛,你就不用登陆啦,,直接就是在线状态,为啥啊,综合我们前面所知道的知识不难推测,cookie是服务器唯一可以让浏览器保存在硬盘里的东西,浏览器能保证是登陆状态,肯定是cookie搞的鬼,事实也能证明这一点,我们清理下cookie的话...开了浏览器,按键又问我们要账号密码了....那要是我们的XHR带了cookie去浏览网页的话.会不会?,,,恭喜你,答案是,当然会.现在,就让我们一步一步见证奇迹吧:
先了解下cookie:
cookie是服务器唯一可以放在我们硬盘里的信息,它是文本(当然是加密的),cookie只有服务器能改变(无耻的js代码不算),服务器发布命令,浏览器执行命令,从而达到服务器控制cookie的目的.
cookie分2种,一种是放在硬盘的,一种是放在内存的,放在内存的,浏览器一关就消失啦
cookie是会过期的,过了保质期的cookie浏览器会自动删除的
cookie是键值对储存的:格式是 键(项目)=值 ,每一个键值之间是用";"分割的
cookie的键名是唯一的,通一个网站的cookie里不可能同时存在两个a,值是可以改变的,浏览器里 a=5,当某个时候服务器带来新的a=6的时候,浏览器里的a就会更新为6
服务器是文明的:它在返回头里用"SetCookie"来设定每个cookie的键值,一个"SetCookie"对应一个键值,浏览器是粗鲁的,他们发送header的是说是用"Cookie",一股脑把所有的键值用";"分割扔给服务器

在XHR对象里(哪个小弟不算啊,,,,,切记),cookie总是在内存的,xhr对象会自动的维护cookie,如果我们需要,我们是可以随意让XHR在请求的时候带上我们想让它带的cookie.但是我们无法把cookie放到XHR对象里面,也就是说:我们需要XHR每次请求都带上我们需要带的cookie,我们只能无奈的每次都是用指令添加cookie,而不是这次添了以后,之后的每次都不用管了
详细看cookie:

  • 服务器给浏览器的cookie:例子
Set-Cookieg :UmJ_2132_lastact=1430424271%09forum.py; expires=Fri, 01-May-2015 20:04:31 GMT; path=/

UmJ_2132_lastact : cookie的键(项目的名称)
1430424271%09forum.py : 对应键的值

后面的是针对这条cookie键的设置:
expires : 设定这个键的过期时间,过了这个点浏览器就会删除这个cookie键值,如果没有这个设置,cookie不进硬盘,只存在于内存
有时候大家会看到一个很早以前的日期,这其实是服务器让浏览器删除cookie的方式,也是唯一的方式,把cookie设置为过去,就能删除cookie键值
path: 代表这个键的作用域,这个不需要太过了解
httpolny: 如果看到这个,说明这个cookie很重要!!!!这个是告诉浏览器,这条代码不许js看到,防止不良代码窃取敏感信息,嘿嘿嘿,那么说的话,,,账号密码有关的cookie岂不是带有这个设定?是啊是啊..很有可能啊,
domaim:设定此条cookie键值的作用域名,了解下即可
关于cookie的属性设定,大家注意下expires和httpolny属性即可


准备:
大家打开firebug吧..向之前那样登陆一次,不过么,,这次请记得在"自动登陆"上打上钩,成功后,,来到如图:找Httpolny相关的属性
图4:
很简单吧,一下就找到4个标识,其中2个没有过期时间,标识的是"会话"(就是放在内存的意思),肯定不是!!!,好吧..就剩下的有过期时间的2个货了,,,写在代码试试
  1. Set http = CreateObject("WinHttp.WinHttpRequest.5.1")//创建XHR对象
  2. URL="http://bbs.anjian.com/forum.php?mod=forumdisplay&fid=17" //综合版块网址
  3. http.open "GET", URL, False
  4. //下面是设置请求头的Cookie,记住.浏览器是粗鲁的,把两条cookie写在一起就行,只要键值,不要设置,cookie之间用";"分隔
  5. http.setrequestheader "Cookie","gUmJ_2132_saltkey=UQZSGyJs;gUmJ_2132_auth=9ec68C%2Bc5BTgrB2VemTNWm6%2B8NrVUZsayPnJaEmnf0WMs9pU4Ymw9cFhvQpilKkX3%2Bo28QVtcRiVP4pLVw1W53QmLTPu;"
  6. http.send //发送请求
  7. If Not isEmpty(http.responsetext) Then
  8. Plugin.Sys.SetCLB http.responsetext //扔进剪贴板,看看返回的内容是否登陆成功了...
  9. Else MessageBox "失败"
  10. End If
复制代码
啊哈..成功啦...太无耻了..哈哈哈...只不过大家得切记.用这个方式必须得每次请求都写上请求头,至少在按键论坛是这样的!!!

本节完了..下节讲如何在又长又乱的源文件里提起我们需要的信息和字符编码的问题

firebug.png (, 下载次数:1)

图1(2015/4/30 22:55:31 上传)

firebug.png

2.png (, 下载次数:2)

图2(2015/4/30 23:12:53 上传)

2.png

3.png (, 下载次数:5)

图3(2015/5/1 0:29:29 上传)

3.png

4.png (, 下载次数:0)

图4(2015/5/1 4:48:10 上传)

4.png

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

    个人收藏
    QQ:2074137818
    2#

    谢谢!受益非浅

    3#

    感谢分享321

    4#


    5#

    一起来学习

    6#

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

    7#


    8#

    学学,谢谢

    9#

    sadfsdafsdf

    10#

    追到第四集

    11#

    一知半解的

    12#

    看看!!!!!!!!!!

    13#

    学习,看看!

    14#

    大神好棒的!!!!

    15#

    学习

    收徒、填表、POST、游戏、办公、网页等 各种脚本定制
    收徒、填表、POST、游戏、办公、网页等 各种脚本定制
    16#

    6666666666666666666

    17#

    0000000000000000000000000000000

    18#


    19#


    20#


    发新话题 回复该主题