程序背景:
有一个在线网站(不方便透露),每20分钟会弹出一个带有验证码的,需要人工输入并点击提交。如下图
程序功能实现:
自动识别验证码并且提交答案。每20分钟以后重复操作。
这中自动操作还是意义重大的。目前很多工作流都是基于B/S的web方式来操作。自动操作和应对验证码可以为我们节省很多的时间。
准备:
环境是windows,所以一开始就定下了使用C#做。比较微软的东西开发起来方便快速。这里主要有两个问题:
1. 自动捕获网页,自动操作网页
2. 能够识别验证码
我的方法是: 采用watin和tesseract-orc两个开源代码实现。
watIN是一个用来进行web自动化测试的软件。我这里拿来做自动操作网页是可以的。因为我对C#的编程不算是很熟悉。所以没有敢才用C#做好的webbrowser来做自动操作。
tesseract-orc是一个google开源项目,但是资料相对与watIN来说,中文资料要多些,更容易上手。参考http://www.itcast.cn/subject/yzm/index.html(这个网站推广过多,请程序员自行辨识。但是他讲解的方法是正确的)
主要代码流程:(由于一些原因不能放全部代码了)
while (true)
{
// 如果验证码窗口存在
if (!iframeCtrl.isDialogClosed())
{
// 根据窗口句柄截图
Bitmap bitmap = picCapturer.processPic(picCapturer.capture());
// 调用tesseract来识别
String bmpResult = bmpProcessor.Recognize(bitmap);
// 根据识别结果做计算
DataTable dt = new DataTable();
String answer = dt.Compute(bmpResult, "").ToString();
// 正确识别了验证码
if (!String.IsNullOrEmpty(bmpResult) && !String.IsNullOrEmpty(answer))
{
// 回答正确跳出循环
if (iframeCtrl.answer(answer))
break;
// 回答错误,不用手动切换,网页自动切换验证码
else
continue;
}
// 无法识别验证码
else
{
// 重新设置一次截图位置
// 假如设置位置失败
if (setRectangle() == false)
break;
// 换下一张验证码
iframeCtrl.nextPic();
}
}
// 如果不存在验证码窗口则退出识别
else
break;
}
下一步计划:
目前,教研室要实现web签到。签到使用《今目标》。利用watin和tesseract,依然可以实现自动签到的功能。
不过还是先忙忙找工作的事情吧。