潇潇 发表于 2012-3-27 22:06:06

易语言+HttpWatch分析并编写Discuz! X1.51论坛管理器第七课

前面我们讲了论坛验证码及相关参数的获取,今天我们来讲论坛账号登陆。我们每次讲课都离不开HttpWatch这个工具,还是先把获取登陆部分的数据截出来,先来个截图:

上图为账号正确登陆时截取的图片,上图中第一条数据相关信息:
1、第一条数据:
+ 0.000      0.225    1199    1364    POST    200    text/xml; charset=gbk    http://demo.wgbcw.com/dzx151gbk/member.php?mod=logging&action=login&loginsubmit=yes&handlekey=login&loginhash=LUOLP&inajax=1
2、Headers:
(Request-Line)    POST /dzx151gbk/member.php?mod=logging&action=login&loginsubmit=yes&handlekey=login&loginhash=LUOLP&inajax=1 HTTP/1.1
Accept    image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Accept-Encoding    gzip, deflate
Accept-Language    zh-cn
Cache-Control    no-cache
Connection    Keep-Alive
Content-Length    233
Content-Type    application/x-www-form-urlencoded
Cookie    6Qvx_2132_sid=gBO1Qz; 6Qvx_2132_lastvisit=1332846467; 6Qvx_2132_lastact=1332850222%09misc.php%09seccode; _D_SID=973C78A4; 6Qvx_2132_seccodeSec1x=e453Jr%2BO1K20al8oJFEMUyaLm70FnJAt%2FQQtkmcYsEBeXtAFoK5fxlXkINBPlIdbaao2f%2FaTT1qhU8I
Host    demo.wgbcw.com
Referer    http://demo.wgbcw.com/dzx151gbk/forum.php
User-Agent    Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)
3、Query String:
action    login
handlekey    login
inajax    1
loginhash    LUOLP
loginsubmit    yes
mod    logging
4、POST Data:
auth    99510J3IpSyUBKLIfABJFFHqA+hGL5V3sl282/FCo3pmWUnV0xH7/TBXewY    70
formhash    a87678d1    17
loginsubmit    <STRONG>¼</STRONG>    51
referer    http://demo.wgbcw.com/dzx151gbk/forum.php    59
seccodeverify    e983    18
sechash    Sec1x    13
5、Content:
<?xml version="1.0" encoding="gbk"?>
<root><!]></root>6、Stream:
POST /dzx151gbk/member.php?mod=logging&action=login&loginsubmit=yes&handlekey=login&loginhash=LUOLP&inajax=1 HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*
Referer: http://demo.wgbcw.com/dzx151gbk/forum.php
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)
Host: demo.wgbcw.com
Content-Length: 233
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: 6Qvx_2132_sid=gBO1Qz; 6Qvx_2132_lastvisit=1332846467; 6Qvx_2132_lastact=1332850222%09misc.php%09seccode; _D_SID=973C78A4; 6Qvx_2132_seccodeSec1x=e453Jr%2BO1K20al8oJFEMUyaLm70FnJAt%2FQQtkmcYsEBeXtAFoK5fxlXkINBPlIdbaao2f%2FaTT1qhU8I

formhash=a87678d1&referer=http%3A%2F%2Fdemo.wgbcw.com%2Fdzx151gbk%2Fforum.php&auth=99510J3IpSyUBKLIfABJFFHqA%2BhGL5V3sl282%2FFCo3pmWUnV0xH7%2FTBXewY&sechash=Sec1x&seccodeverify=e983&loginsubmit=%3CSTRONG%3E%B5%C7%C2%BC%3C%2FSTRONG%3E
从所获得的数据中不难看出,这条数据的HTTP通信方式为POST,我们先看下在易语言中所编写自定义的POST子程序的代码片段:
.版本 2

.子程序 POST, 字节集, , http post
.参数 URL, 文本型
.参数 附加数据, 文本型, , PostData
.参数 返回内容, 文本型
.局部变量 请求句柄, 整数型
.局部变量 协议头, 文本型, , , Headers
.局部变量 dwByteRead, 整数型
.局部变量 临时文本, 文本型
.局部变量 返回数据, 字节集
.局部变量 临时数据, 字节集根据上面的子程序我们先来找下参数:
第一个参数:
URL为 http://demo.wgbcw.com/dzx151gbk/member.php?mod=logging&action=login&loginsubmit=yes&handlekey=login&loginhash=LUOLP&inajax=1;另外也可参数 Query String;补充:在测试过程中发现URL的“loginhash”是个变化的值,那我们同样在第二课中的返回数据中获取。先定义个全局变量“loginhash”,获取此值的代码为:
.版本 2

      loginhash = 取指定文本后N个字符 (临时文本, “main_messaqge_”, 5)' 第七课中增加
      loginhash = 取文本右边 (loginhash, 5)   ' 第七课中增加
      输出调试文本 (“main_messaqge_========” + loginhash)' 第七课中增加
第二个参数:附加数据为 POST Data;
第三个参数:不难看出如果此函数执行成功的话,应该返回的数据就是上面的Content部分。另所截取的数据中Headers较前面几课而言Content-Length有所变化,我们在编程时一定要注意这点。
现在我们关键来看来附加数据 POST Data部分:
1、auth的值为 99510J3IpSyUBKLIfABJFFHqA+hGL5V3sl282/FCo3pmWUnV0xH7/TBXewY,这么长的字符串(易语言中称文本),是不是感觉在那里见过呢?呵呵当然了,我们在第二课代码测试中就出现过和这相似的字符串,那我们就在那取出来就行了。我们在易语言中定义个全局变量 auth,然后在第二课的返回数据代码中获取:auth = 取指定文本 (临时文本, “auth=”, “referer”, 1)' 第七课中增加2、formhash的值为a87678d1,经查看这个值同样在第二课中的返回数据中出现(因前面一直没用过这个值,现在还不知道我们用这值是否是正确的,当然第二课的返回数据中有这个值,我们用上先测试。)第二课中返回数据中第一次出现的地方截图如下:

经分析,第一次出现“formhash”的地方,刚好也是“value=”第一次出现,我们就利用“value=”和“ />”(注意这字符前有一个空格)来取出formhash这个值,我们还是把上图中红色框部分的代码复制出来:
<input type="hidden" name="formhash" value="b2439da5" />根据网页代码相关知识可知formhash的值应该是上面红色字符部分,在写代码时要注意这点。在易语言中取formhash的代码如下:
.版本 2

      formhash = 取指定文本 (临时文本, “value=”, “ />”, 1)' 这样取得字符串为“"b2439da5"” ' 第七课中增加
      formhash = 取文本中间 (formhash, 2, 8)' 去掉引号 ' 第七课中增加
      输出调试文本 (“formhash========” + formhash)' 第七课中增加3、loginsubmit的值为<STRONG>¼</STRONG>,经分析这个值在前面几课中没出现过,我们暂且用这个值来测试。
4、referer的值为 http://demo.wgbcw.com/dzx151gbk/forum.php,这个值就不说了,您懂得。
5、seccodeverify的值为 e983,这个值在HttpWatch中实际上就是验证码。
6、sechash 的值为 Sec1x,经分析实际上这个值就是我们上一课所讲的 idhash。
分析了附加数据的几个值,我们现在可以来写登陆网站的代码了,代码编写中……

补充:
另外我们再看下Stream中的“formhash=a87678d1&referer=http%3A%2F%2Fdemo.wgbcw.com%2Fdzx151gbk%2Fforum.php&auth=99510J3IpSyUBKLIfABJFFHqA%2BhGL5V3sl282%2FFCo3pmWUnV0xH7%2FTBXewY&sechash=Sec1x&seccodeverify=e983&loginsubmit=%3CSTRONG%3E%B5%C7%C2%BC%3C%2FSTRONG%3E”,实际上这段字符串就是POSTData的数据,我们在易语言中的代码写为:
POSTData = “formhash=” + formhash + “&referer=” + Request.Referer + “&auth=” + auth + “&sechash=” + idhash + “&seccodeverify=” + 验证码校验.内容 + “&loginsubmit=<STRONG>¼</STRONG>”经测试易语言代码编辑器中不支持像“¼”Unicode编码的特殊字符,还在想办法解决中……
呵呵找到解决办法有两种:
1、用Stream文本中的“%3CSTRONG%3E%B5%C7%C2%BC%3C%2FSTRONG%3E”来代替“<STRONG>¼</STRONG>”。
2、另外我用了Delphi XE编写了个DLL文件来调用,效果也不错,这是首先想到的方法。上面的方法是在测试中想到的。因我们用易语言编写代码,那就用第一种方法好了。

论坛登陆部分核心代码如下:
.版本 2

.子程序 登陆论坛
.局部变量 URL, 文本型
.局部变量 POSTData, 文本型
.局部变量 返回内容, 文本型

Request.Accept = “image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, */*”
Request.AcceptEncoding = “gzip,deflate”
Request.AcceptLanguage = “zh-cn”
Request.CacheControl = “no-cache”
Request.Connection = “Keep-Alive”
' Request.ContentLength = 233
Request.ContentType = “application/x-www-form-urlencoded”
Request.Host = “demo.wgbcw.com”
Request.Referer = “http://demo.wgbcw.com/dzx151gbk/forum.php”
Request.UserAgent = “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 1.1.4322)”

URL = “/dzx151gbk/member.php?mod=logging&action=login&loginsubmit=yes&handlekey=login&loginhash=” + loginhash + “&inajax=1”
' formhash=a87678d1&referer=http%3A%2F%2Fdemo.wgbcw.com%2Fdzx151gbk%2Fforum.php&auth=99510J3IpSyUBKLIfABJFFHqA%2BhGL5V3sl282%2FFCo3pmWUnV0xH7%2FTBXewY&sechash=Sec1x&seccodeverify=e983&loginsubmit=%3CSTRONG%3E%B5%C7%C2%BC%3C%2FSTRONG%3E

POSTData = “formhash=” + formhash + “&referer=” + Request.Referer + “&auth=” + auth + “&sechash=” + idhash + “&seccodeverify=” + 验证码校验.内容 + “&loginsubmit=%3CSTRONG%3E%B5%C7%C2%BC%3C%2FSTRONG%3E”

Request.ContentLength = 取文本长度 (POSTData) ‘第七课增加
POST (URL, POSTData, 返回内容)
调试窗口.编辑框1.加入文本 (“正常登陆论坛时返回=======” + 返回内容)
取Cookie并设置 (“http://” + Request.Host + URL)

.如果 (寻找文本 (返回内容, “欢迎你回来”, , 假) ≠ -1)
    信息框 (“论坛登陆成功。”, 0, “登陆提示”)
.否则
    信息框 (“论坛登陆失败。”, 0, “登陆提示”)
登陆成功时的截图:

在本课登陆论坛测试中,发现个问题,因第二课中所取的auth值的长度不固定,导至原所写的代码有时能登陆成功有时登陆失败。经检查,上面代码的"Request.ContentLength = 取文本长度 (POSTData)"就直接取POSTData文本的长度就可以,我们在POST子程序里的Headers(协议头)中用到:
协议头 = “Accept:” + Request.Accept + #换行符 + “Accept-Encoding:” + Request.AcceptEncoding + #换行符 + “Accept-Language:” + Request.AcceptLanguage + #换行符 + “Cache-Control:” + Request.CacheControl + #换行符 + “Connection:” + Request.Connection + #换行符 + “Content-Length:” + 到文本 (Request.ContentLength) + #换行符 + “Content-Type:” + Request.ContentType + #换行符 + “Host:” + Request.Host + #换行符 + “Referer:” + Request.Referer + #换行符 + “User-Agent:” + Request.UserAgent
好了本课内容就到这里,有不懂的地方就回帖寻问吧,呵呵。



浪漫可乐 发表于 2012-3-29 16:55:26

话说,我看着头都晕了。{:3_44:}

潇潇 发表于 2012-3-31 00:04:48

呵呵内容已经增加,有兴趣的可以继续看了。:)
页: [1]
查看完整版本: 易语言+HttpWatch分析并编写Discuz! X1.51论坛管理器第七课