Discuz 模拟登录踩坑心得

通过两天的踩坑,终于搞定了Discuz的登录模拟
其中最大的坑为Cookie,在进行传递验证码等操作的时候也必须要使用相同的Cookie,否则就会导致因为Cookie变化,然后formhash也跟着变化,最后传递formhash的时候回出现非法参数的问题
其次是关于验证码,Dz的这个验证码是真的蛋疼。

 

1.获得seccode,formhash与loginhash参数
首先我们要爬取论坛登录页面的html代码,然后获得这三个参数,可以通过正则的方式
登录页面地址一般为DzUrl + /member.php?mod=logging&action=login
然后分别获取seccode,formhash与loginhash参数,以下是我个人获取这几个参数时用的正则
seccode: (?<=seccode_)([^\"]*)
loginhash: (?<=loginhash=)([^\"]*)
formhash: (?<=<input type=\"hidden\" name=\"formhash\" value=\")([^\"]*)

同时,非常重要的一点,后面的每一步都要保存你的Cookie!然后每次访问的时候,请带上上一次保存的Cookie
(我讨厌正则)

2.刷新并获取验证码
这里要用到我们刚才获取到的seccode了,验证码的刷新地址一般为DzUrl + /misc.php?mod=seccode&action=update&idhash={你的seccode值}
(再次提醒,请带上Cookie)

然后会返回一个JavaScript代码,然后我们需要获取那个验证码图片的地址了,我使用的是正则表达式
(?<=width=\"\\d{3}\" height=\"\\d{2}\" src=\")([^\"]*)

获得图片地址后,我们只能使用下载文件流的方式来下载验证码图片,比如你使用桌面开发的话,直接设置图片地址为上面获取到的地址,是没用的

在获得验证码图片,并用户输入验证码后,我们可以来验证一下该验证码是否正确
验证码验证地址为DzUrl+ /misc.php?mod=seccode&action=check&inajax=1&modid=member::logging&idhash={你的seccode}&secverify=验证码

然后会返回一个XML,验证通过的话则会返回

3.提交登录信息
提交登录用的地址为DzUrl + /member.php?mod=logging&action=login&loginsubmit=yes&loginhash={你的loginhash}&inajax=1
提交的方式为POST,ContentTypeapplication/x-www-form-urlencoded
然后POST以下包
formhash={formhash}&referer={论坛地址,请使用urlencode编码}%2F.%2F&loginfield={登录方式,默认用username,如果论坛支持其他方式登录(比如邮箱的参数为email)可以手动修改此参数}&username={用户名,请使用urlencode编码}&password={密码,请使用urlencode编码}&questionid={问题编号,如没有,请设置为0}&answer={登录密码问题答案,如没有,请留空}&seccodehash={seccode}&seccodemodid=member%3A%3Alogging&seccodeverify={验证码code}

然后就会返回登录信息,再把Cookie保存下来就行。

发表评论

邮箱地址不会被公开。 必填项已用*标注