|
本帖最后由 bob 于 2013-6-28 09:38 编辑
在大家读这篇教程前,最好先仔细阅读qqmmcc版主的这篇教程,基础知识及精华都在这里面
[网络] 【 POST/GET教程】登录QQ空间发表日志&POST上传相册图片
我这篇教程只是对上面教程做一个扩展及对下面代码做一个注释说明
QQ自动登录,自动收发信息
上面的代码写的确实简洁漂亮,但对生手来说可能就比较晦涩难懂了,这也是我这篇教程的出发点,着重点讲的是思路,相关工具使用和数据分析,能让刚接触这块的快友能自己上手!
一、需求工具
一般网站数据分析所需工具:浏览器+网络抓包工具
1)、IE浏览器,网络抓包工具可用第三方的软件,如HTTP Analyzer,HttpWatch,fiddler2等
2)、firefox浏览器,网络抓包工具可安装扩展工具firebug
3)、chrome浏览器(包括360极速,猎豹等双核浏览器,指核心是chrome之类的浏览器),网络抓包工具可使用自带的开发者工具,按快捷键F12即可出来。
当然,firfox和chrome浏览器也可以如IE浏览器一样使用第三方软件做为抓包分析工具。
如本文要讲的在手机上登陆的网站,即WML格式的网页,除了上述要求外,还需能解析WML的工具
1)、 firefox浏览器开安装扩展工具 wmlbrowser
2)、 chrome浏览器也可安装扩展工具wmlbrowser,但这个扩展比较难寻找,我这提供远程安装地址:
https://github.com/izml/arc/raw/master/crx/wmlbrowser.crx
本文教程使用 chrome浏览器+wmlbrowser+系统自带的抓包分析工具 来讲解
二、初步测试及思考
1)、在chrome浏览器安装好 wmlbrowser扩展后,我们就可以输入手机QQ空间网址了 http://z.qq.com/
登陆界面图1
2)、如上图所示,终于打开了登陆页面,不知大家有没有注意到地址栏,怎么z.qq.com地址一下子就变得这么长了,是跳转了吗?这个地址是登陆页面的真实地址吗?下次用这个地址登陆就行了吗?
解决问题方式,就是多动手多测试,我们关掉刚才页面,再打开z.qq.com这个地址,再对比下刚才出现的长网址。
3)、 ,怎么对比结果发现每次登陆页面的网址不一样了,如两图红圈处所示,我们该如何取得这个地址呢?这时候,我们就改出动抓包工具来查查底细了!
三、抓包工具的初应用
1)、按快捷键F12,发现浏览器下方多了一个窗口出来,我们再次输入z.qq.com这个地址并访问,打开登陆页面后,我们在点击抓包工具中的network,会发现一些数据出来
2)、我们选中抓包工具中刚发现的z.qq.com这个路径地址,在右侧你会发现有一串地址正好和地址栏中的是一样的
3)、从抓包数据中我们可以看到真实跳转后的地址,也可能看到它是通过GET方式获取的,下面我就转到AAU代码,将抓包分析结果转为应用。
四、分析结果转AAU代码
1)、从第三步中,我们可以看到通过get模式访问z.qq.com就能获取真实的URL,现在我们用AAU代码来模拟下这个过程- import inet.whttp;
- http = inet.whttp()
- var str=http.get("http://z.qq.com");
- import console;
- console.log(str);
- console.pause() //按任意键继续
- ;//关闭控制
复制代码 2)、从上面代码运行的结果我们可以看到一串地址,稍微懂点HTML等语言的,就能看到这其实就是真实的跳转地址来着
3)、我们需要就是这个登陆页面的真实地址,因为下一步正式登陆时候就是从这个地址跳转的,而不是之前的z.qq.com地址。从字符串中匹配出真实地址,这个相信大家比较熟练了,我们还是扩充下上面的代码- import inet.whttp;
- http = inet.whttp()
- var str=http.get("http://z.qq.com");
- url = string.match(string.fromto(str), 'ontimer="(.*?)"')
- import console;
- console.log(url);
- console.pause() //按任意键继续
- ;//关闭控制
复制代码 五、关键post登陆抓包分析
1)、获得真实登陆页面地址后,我们就开始本教程的重点了,POST登陆分析。一样的在登陆界面,先开启抓包工具,然后输入QQ号和密码点登陆,再查看抓包工具中的network下数据
2)、从上图可看出,已登陆成功,进入了手机QQ空间。抓包工具下的path路径有很多,选择method属性为post(为什么用POST,我们后面会讲到这点),也就发现上面画圈处一条,选中这个地址,看右侧从登陆窗口提交过来的表单数据
中途插播点POST和GET知识:
一般在浏览器中输入网址访问资源都是通过GET方式;在FORM表单提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交。
简单可理解为,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。
GET提交,请求的数据会附在URL之后,以?分割URL和传输数据,多个参数用&连接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用百分号编码(也就是URL编码),得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
例如:用百度搜索aardio.com,即使用get查询,查询结果页面地址为 http://www.baidu.com/s?wd=aardio ... mp;ch=&tn=baidu
POST提交方式和get类似,POST数据附在URL之后,POST数据如有多个参数则用&连接.
不同的是GET提交的数据会在地址栏中显示出来,如果有用户名和密码等参数,都将以明文出现在URL上,而POST提交地址栏不会改变的,这也就是为什么在用户登陆等表单提交都需要用POST方法的原因
3)、从图中红框里面数据所看到的,qq、pwd、login_url、go_url、sidtype、aid及后面的值,即为POST要传递的参数和参数值。点击view source,即可看到连串起来的参数,这个也就是我们稍后要提交的POST数据,抓包工具直接展现出来是更直观明了便于我们分析的数据。
下面我们用第三方的抓包工具也来演示下所抓到的数据
4-3-1
4-3-2
4)、从第3步中,我们已找到url(即path下的地址)和POST数据,是不是现在就可以开始写代码了?事实不然,我们多测试几次多查看下抓包数据,会发现找的url地址在变,参数中的login_url地址也在变,现在我们就返回登陆页面去找到这个变化的地址。
六、查用源代码分析及写AAU代码测试
1)、我们还是借用抓包工具来进行元代面分析,在登陆界面,鼠标焦点选中QQ号码输入框,然后右键选择审查元素,即可跳转到此输入框所对应源代码处。
2)、箭头向右的标签都是包含内部标签的,点击箭头可以展开标签,我们将form表单内的标签全部展开,显示网页源代码如下
从上图画圈处可看到,action后的地址即是5-4中所要找的url地址,也就是稍后aau代码要用到的post地址,method后面的属性为post,也就顺便解答了4-2中为什么直接选中post所对应的path地址原因了。登陆界面输入框中的数据即为要传递的POST参数,在代码中input标签对应的value值就是,这里我也可以看到4-4中所要找的login_url地址。为什么后面几个参数没有输入框了,因为腾讯的代码中把这几个标签给隐藏了,会html代码的一看就明白。
3)、至于我们刚才从源代码中所找到的url及login_url地址是否为我们所需的,其实我们可以自己对比测试一下。在登陆界面用刚才方式记下url和login_url地址,然后再登陆抓包,类似4-3中的操作方式,对比相应的url和login_url地址,如果相同则我们刚才所找到数据是正确的。
4)、刚才演示的是用抓包工具来进行源代码分析,但我们最终是要转移到代码上去,我们再改写下5-1中的代码,来查看下登陆窗口页面,用aardio查看的源代码是什么样的,post所需要的地址和参数数据是否也能找到- import inet.whttp;
- http = inet.whttp()
- var str=http.get("http://z.qq.com");
- url = string.match(string.fromto(str), 'ontimer="(.*?)"')
- var str2=http.get(url);
- import console;
- console.log(string.fromto(str2)); //网页为UTF-8,所以需要string.fromto来转码,不然中文会显示乱码
- console.pause() //按任意键继续
- ;//关闭控制
复制代码 5)、我们从上一步代码显示结果中,仍然可以找到从源代码分析出来的地址。可能部分人会问到http.get的结果和右键查源代码结果为什么有这么大区别,原因是右键源代码已把WML标签转成了HTML标签,结果不同处体现在标签不同上。
6)、我们使用类似4-3中的匹配原理,把url和login_url匹配出来- import inet.whttp;
- http = inet.whttp()
- var str=http.get("http://z.qq.com");
- url = string.match(string.fromto(str), 'ontimer="(.*?)"')
- var str2=http.get(url);
- posturl = string.match(string.fromto(str2), 'go href="(.*?)"')
- login_url = string.match(string.fromto(str2), 'login_url.*?value="(.*?)"')
- import console;
- console.log(string.fromto(str2));
- console.log(posturl);
- console.log(login_url);
- console.pause() //按任意键继续
- ;//关闭控制
复制代码 六、最终的POST登陆代码
其实写到上一步,这篇教程就已结束了,分析过程及需要的数据都已出来了,剩下的就是把数据搬到代码上去就行了。不过,腾讯网站喜欢玩“仙人跳”,post后的页面地址并非最终已登陆所显示的页面,中间还有跳转两次,这过程就留给大家去完成吧!另外,下面代码中用了string.concat函数,是为了让代码更直观些,实际上此处数据和5-3的第二图箭头所指数据一样。- import inet.whttp;
- http = inet.whttp()
- var str=http.get("http://z.qq.com");
- url = string.match(string.fromto(str), 'ontimer="(.*?)"')
- var str2=http.get(url);
- posturl = string.match(string.fromto(str2), 'go href="(.*?)"')
- login_url = string.match(string.fromto(str2), 'login_url.*?value="(.*?)"')
- str3 = http.post(posturl,
- string.concat(
- "qq=","408289020",
- "&pwd=","xxxxxxx", //密码
- "&login_url=",inet.url.encode(login_url,true),
- "&go_url=",inet.url.encode("http://z.qq.com/index.jsp",true),
- "&sidtype=1",
- "&aid=nLoginqz"
- )
- );
-
- import console;
- console.log(string.fromto(str3));
- console.pause() //按任意键继续
- ;//关闭控制
复制代码 |
评分
-
查看全部评分
|