下面的程序是用aardio实现的,代码666行,没多少技术含量.仅供
电脑计算机编程入门教程自学.现在很多网站在发贴回贴时出现了滑块验证码,对营销软件来说造成了很大的不便.我花了几天时间去尝试自动识别并模拟人工拖动,验证识别完全没问题!思路就是先抓取滑块出现前的图像,然后抓取滑块出现后的图像,再对比像素,去掉干扰的小色块,然后定位滑块和槽位的位置.剩下来的就是录制人工拖动的数据然后进行拟合,再模拟鼠标去拖动.部分源码如下:
//去除相同像素
winform.button9.oncommand = function(id,event){
/*
特点:
识别B图比A图亮10的点,滑块的边缘清晰.
识别B图比A图暗10的点,槽位的边缘清晰.
则把亮的识别出来放到plus3,暗的识别出来放到plus6,再分别识别黑块的左上角很清晰的直角
*/
var imgAobj = soImage();
var imgBobj = soImage();
var imgCobj = soImage();
var imgDobj = soImage();
imgAobj.fromBitmap(winform.plus3.foreground.copyHandle())//原图灰度图
imgBobj.fromBitmap(winform.plus4.foreground.copyHandle())//滑块图灰度图
imgCobj.fromBitmap(winform.plus3.foreground.copyHandle())//用于提取B图比A图亮的部分(清晰的滑块黑块)
imgDobj.fromBitmap(winform.plus3.foreground.copyHandle())//用于提取B图比A图暗的部分(清晰的坑位黑块)
for(i=1;imgBobj.getWidth();1){ //i为x,j为y
for(j=1;imgBobj.getHeight();1){
//console.log(imgAobj.getPixel(i,j),imgBobj.getPixel(i,j)) //返回指定坐标点颜色
imgApix = imgAobj.getPixel(i,j)
imgBpix = imgBobj.getPixel(i,j)
imgApix = 十进制灰度的255(imgApix)
imgBpix = 十进制灰度的255(imgBpix)
//console.log(imgApix,imgBpix)
//不能用十进制颜色比较,要转为RGB
if( (imgBpix-imgApix)>10){//B图比A图亮10的点 //math.abs()
imgCobj.setPixel(i,j,0) //修改指定坐标点颜色
}else {//其它的变白清理掉
imgCobj.setPixel(i,j,16777215)//变白
}
//因为有个浅暗的坑位干扰,所以要加大阀值
if( (imgApix-imgBpix)>50){//B图比A图暗10的点 //math.abs()
imgDobj.setPixel(i,j,0) //修改指定坐标点颜色
}else {//其它的变白清理掉
imgDobj.setPixel(i,j,16777215)//变白
}
}
}
winform.plus5.foreground = imgCobj.getBytes("*.bmp")
winform.plus6.foreground = imgDobj.getBytes("*.bmp")
//imgBobj.paint()
}
有图有真相:
如上图所示,因为滑块只有左右滑动,没有上下滑动,所以只需要计算滑块左上角到槽位左上角的距离即可.
没用到任务库,只是简单的抓屏,取像素,计算颜色值,aardio新手也可以做到的.