依傍百度报到并到钦命网站评价回帖

前面的四篇已经说完了全部的模拟百度登录,接下来就是到指定的网站去发表评论,当然你也可能是获取其他信息,其实这些套路都是万变不离其宗的,弄懂之后觉得像这种请求-响应获取信息的功能实在很简单(想起当初走的弯路,真是太心酸了)

基本的实现功能前面已经全部讲完,基本上可以复制黏贴完成登录百度的过程了

    今天的详细评论过程就不多说了,这里就指出一下我在写这个功能的时候遭遇的问题,也正是这些问题导致陷入了困境。(主要是理论,有不懂的童鞋欢迎评论交流)

今天的这一贴就说说怎么获取百度的验证码

    第一个问题:如果使用的百度登录网站,那么前面我们获取到BDUSS之后,到这里就要发生转换。因为我访问的网页,在访问主页的时候会通过BDUSS去继续请求,获得一个该网站的新BDUSS,这就说明,前面搞了那么多功夫咱们其实也就只拿到了一条钥匙罢了。要想打开信息之门,还需要我们再去打开其他的门。

内容回顾:还记得前面第一贴说的如果登录发生异常,百度会发回2个值吗?是的,就是codeType和codeString这两个值,用前面的JSON数据解析可以分别获取。

    那这里要说的还是——逻辑分析,这个太重要了,进入新网站之后我们需要重新进行分析,找到主要的请求响应页,有时候网页会发生多次跳转,信息也会跟着变化。如果真要完全模拟的话
,我们要做的功夫就会很多,所以这里我们只要找出那些有我们需要的信息的请求响应页就可以了。

前面也说到codeType是不变的(至少同一次请求时不变)。请求验证码的时候会要求传递这个参数,所以要想得到正确的验证码,这个参数是必不可少的,否则你请求多少次都是一个错误的验证码!

比如说我要获得网站自己的BUDSS,那么就联系前后内容,看看哪个页面用到新的BUDSS,然后再追溯回头,慢慢排除,直到找到响应哪个BDUSS的页面。这个过程就是考验耐心跟细心的了跟其他没有啥关系。

具体代码入下:

那第二个问题:就是Cookie!这个跟前面的一个要素是确定功能是否能够顺利实现的绝对条件,没有这两个,代码写多少都是错!

//封装更换验证码
publicvoidReGetCode()
{
stringreSet_code=string.Format(“);
stringcodeContent=helper.GetPageResponse_Get(reSet_code,Utility.UrlDecode(“”);
if(_regex.IsMatch(codeContent))
codeContent=_regex.Match(codeContent).Value;
varcodeResult=JsonConvert.DeserializeObject<Reget_Code>(codeContent);
_codestring=codeResult.Data_Code.VerifyStr;
stringurl_NewCode=string.Format(“);
Bitmapbp=helper.GetCode(url_NewCode,Utility.UrlDecode(“88bifa必发唯一官网,”));
pictureBox1.Image=bp;
}

所以,到新网站的时候,一定要分析有哪些新的Cookie,然后把他们全都收集起来。我就是在写评论功能的时候,获取网站的验证码,虽然能拿到,但总是发生错误,这就是没有拿到sessionID跟cookie的后果。请求网页的验证码,必须要这两个东西,如果你看到自己的错了,那么就看看cookie收集器里面有没有这些值!因为网站要识别你是不是同一个人拿的验证码然后提交,看得就是sessionID,所以必须有这个值。

可能这样单独看,有人会看不懂什么意思,这里就注释一下

    下面是具体的实现代码:这里大家不用了解太深,只需要知道下面的代码就是不停的请求不同的页面,然后获取响应,直到把请求验证码页面需要的cookie和参数都获取完全了,再发起请求。值的注意的是,每个页面之间有一定的逻辑性,中间跳过了一些不必要的页面,所以大家在分析的时候要认真。

reSet_code
是代表获取codestring的网页,后面的参数分别是前面获取到的token、生成的时间戳、以及codeType

///<summary>
///封装的获取评论页面验证码
///</summary>
publicvoidGetCommentCode(stringbookID,stringbookLink,HttpHelperhelper,PictureBoxpictureBox)
{
stringcorrssmain_do_Getbudss=string.Format(“;
stringurl_maindo=string.Format(“”));
stringurl_getSession=string.Format(“
stringpostData_Session=string.Format(“bookId={0}&pagebar=0&pageNum=1&pageSize=30”,bookID);
helper.GetPageResponse_Get(corrssmain_do_Getbudss,Utility.UrlDecode(“
helper.GetPageResponse_Get(url_maindo,Utility.UrlDecode,”text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8″);//请求页面获取cookie
helper.GetPageResponse_Post(url_getSession,postData_Session,bookLink);//获取sessinID

codeContent
代表请求网页后返回的内容,参数就是用到前面的HTTPHelper类的Post方法需要提供的参数

//所有的cookie都收集完后,开始请求验证码
Bitmapbp=helper.GetCode(string.Format(“);
pictureBox.Image=bp;
}
#endregion

接下来是分析内容,获取codestring,然后对验证码的图片网页重新发起请求,将验证码显示回picturebox上

好了,这个项目的所有功能到这里就说完了,有什么问题欢迎评论交流

至于codeType怎么来的,这个在请求登录的时候,发生异常就会返回

下面是检验验证码是否正确的方法,在文本框输入了验证码之后按回车

privatevoidtxtcode_KeyDown(objectsender,KeyEventArgse)
{

if(e.KeyCode==Keys.Enter)
{

Threadth_2=null;
if(e.KeyCode==Keys.Enter)
{
th_2=newThread=>
{
verifycode=txtcode.Text;
//先访问一次验证码校验页面,看看验证码是否正确
stringurl_checkCode=string.Format(“);
stringcheckcode=helper.GetPageResponse_Get(url_checkCode,Utility.UrlDecode(“”);
if(_regex.IsMatch(checkcode))
checkcode=_regex.Match(checkcode).Value;
varcode_msg=JsonConvert.DeserializeObject<CheckvCode>(checkcode);
CodeMsg(code_msg.ErrInfo.No);
if(code_msg.ErrInfo.No!=”0″)
return;
LoginStatusstatus=Login(verifycode,_codestring,token,raskey,userIndex);
GoComment_Page;
th_2.Abort();
});
th_2.Start();
th_2.IsBackground=true;

}

}

好了,今天就到这里,如果有问题,欢迎评论交流~