if(FAILED(CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2, ( LPVOID* )&pDoc))) {
return bRet;
}
try {
pDoc->get_parentWindow(&pWin);
if(pWin != NULL)
{
try {
//pWin->execScript(L"showVcDiv();", L"JScript", &vRet);
pWin->execScript(sFunc, L"JScript", &vRet);
bRet = true;
}
__finally
{
pWin = NULL;
}
}
}
__finally
{
pDoc = NULL;
}
return bRet;
}
//---------------------------------------------------------------------------
//调用方法如下:
AnsiString sWebInput="$(\"#vc\").val("; //查找输入框,网页的输入框ID为vc
sWebInput+=LabeledEdit1->Text+");";//设置输入框内容;
CrnRunJavaScript(WideString(sWebInput)); //调用原网页的JS函数,填入验证码。相当于Java里的$("#vc").val("我要输入");
CrnRunJavaScript(L"submitVote();"); //调用原网页的JS函数,提交投票。
通过调用原函数,实现的网页上所有隐藏的功能,操作简单轻松,也更高效。实现这一步的关键是要认真阅读源码。特别Java函数,有的跨文件调用,用注意跟踪。同时要熟悉Java语言。如本人通过Java函数,直接选定候选人,一步到位!代码如:
WideString sSelectName=L"var controls = document.getElementsByTagName('input'); for(var i=0; i<controls.length; i++){"
"if(controls[i].value=='366336.400058'){controls[i].checked=true;"
"break;}}";//选择候选人,但没有显示出来,速度更快。
WideString sSelectAndShowName=L"var tags=$('.lx-p');"
"for(var i=0;i<tags.length;i++){"
"var txt =tags.eq(i);"
" if(txt.parent().find('input').val()=='366336.400058')"
"{txt.parent().find('input').prop('checked', true);txt.text('Selected');txt.css('background-color','#999');break;}"
"};";//选择候选人,并显示出来,速度稍慢点。
if(ShowSelected_ChkBox->Checked) CrnRunJavaScript(sSelectAndShowName); //如果要显示选择候选人结果。
else CrnRunJavaScript(sSelectName);//不显示选择候选人结果。
代码(Java)说明:
sSelectName变量,是查找网页所有input,如果其值为366336.400058(候选人),就设置其Checked=true;
sSelectAndShowName变量,是查找网页所有为.lx-p的元素,通过其查找父元素input,如果父元素的值为366336.400058(候选人),再设置父元素的该元素的值及属性。
三、验证码的识别和输入
通过上面的两步,基本实现自动化,只需要输入验证码就可以实现快速投票。经过对比,在手机上操作,一般顺利的话一分钟会投3票,要是遇到验证码输入错误,一分钟只能投1票,在电脑上,一般在8-10票。
制约投票速度的不是网速或程序有什么问题,是该网页上验证码无法出现,有时刷一次验证码等待其出现要20多妙。如果验证码出来的速度很快的,投票速度更快的提高的。
有什么办法可以实现验证码的识别和输入自动化呢?
不做不知道,一做才发现,这是个目前还没有有效的解决方法。因为验证码是经过扭曲变化、加噪等处理的,人工识别起来都有点难度。
我经过努力,基本上克服这个难题,虽然不是很有效。
调用谷歌的Tesseract-OCR40系统。这个系统使用起来非常麻烦,网络上介绍的文章多挂一漏万,只有自己实战,才能掌握。
其中字库的准备及训练最为关键,也是最烦的。
编写该程序的时间大部分时间都花在这里……
……
最后的结果是,如果验证码扭曲的不是很厉害,全部正确识别,如果扭曲的很厉害,如错掉1至2个数字(可惜对于验证码来说,错1个就是全错了!)。一般地,一小时也会自动投个100多票,成绩骄人,实属不易!
可以推断,如果不是扭曲的数字,甚至汉字,识别率会大幅度地提高,甚至全对。