【实例代码教程】验证码登录实战,http cookie,css-selector,runjs例子

瞌睡蟲子 8月前 2608

验证码字库制作教程,传送门:

https://forum.uibot.com.cn/thread-254.htm

https://forum.uibot.com.cn/thread-350.htm

https://forum.uibot.com.cn/thread-409.htm


2019-4-23更新,取验证码原图终级解决方案:runjs下载浏览器原图。

1、解决浏览器截图,图片缩放导致字体变形,字库识别不准问题;

2、解决http cookie模式,浏览器获取不到cookie,下载的验证码图片验证失败问题;

3、注意跨域问题,验证码域名更网站域名必须一致。否则设置浏览器允许跨域。


源码如下,重点是js部分:

import App
import WebBrowser
import UiElement
Import wmcode
dim iPID = ""
dim objJson = ""
dim dictRet = ""
dim sRet = ""
// 附件demo解压到D盘根目录
// 识别库路径
Dim datPath="d:\\demo\\辽宁1-11111.dat"
// 识别库密码
Dim password="11111"
// 识别库路径
Dim datPath1="d:\\demo\\辽宁-12345606.dat"
// 识别库密码
Dim password1="12345606"
// 待识别验证码图片路径
dim imgPath
dim flag,vcode
dim bRet = ""
dim hWeb = ""
dim fun = '''
function(){ 
        // 参数设置
	var css = "#valimg",imgType = "image/png",postfix=".png";
	// 获取验证码图片的元素
	var img = document.querySelector(css);
	// 创建画布
	var canvas = document.createElement("canvas");
	// 验证码图片,原始宽度
	canvas.width = img.naturalWidth;
	// 验证码图片,原始高度
	canvas.height = img.naturalHeight;
	// 2D模式
	var ctx = canvas.getContext("2d");
	// 渲染图片
	ctx.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight);
	// 转为base64,用于给a做文件下载
	var dataURL = canvas.toDataURL(imgType);
        // 生成一个a元素
	var a = document.createElement('a');
	// 创建一个单击事件,模拟下载
	var event = new MouseEvent('click');
	// 设置图片名称
	a.download = new Date().getTime() + postfix
	// 将生成的URL设置为a.href属性
	a.href = dataURL;
	// 触发a的单击事件
	a.dispatchEvent(event);
	return a.download;
}
'''
// 打开网站
hWeb = WebBrowser.Create("chrome","http://train.lnsafety.com/mnzxlogin.asp",10000,{"bContinueOnError":false,"iDelayAfter":1000,"iDelayBefore":200,"sBrowserPath":"","bChromeUnsafe":false})
#icon("@res:c1j8qhon-seh4-9nf2-rc8f-u4a97bfnf082.png")
// 判断验证码是否存在
bRet = UiElement.Exists({"wnd":[{"cls":"Chrome_WidgetWin_1","title":"*","app":"chrome"},{"cls":"Chrome_RenderWidgetHostHWND","title":"Chrome Legacy Window"}],"html":{"url":"http://train.lnsafety.com/mnzxlogin.asp","title":"模拟在线考试登录","tagName":"IMG","attrMap":{"tag":"IMG","id":"valimg"},"index":0}},{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200})
// 如果验证码存在
If bRet = True
    
    sRet = WebBrowser.RunJS(hWeb,fun,true,{"bContinueOnError":false,"iDelayAfter":1000,"iDelayBefore":200})
    TracePrint(sRet)
    imgPath = "C:\\Users\\Administrator\\Downloads\\" & sRet
    iPID = App.Start(imgPath, "0", "1")
    // 加载识别库
    flag = wmcode.LoadDat(datPath1,password1)
    If flag    
        // 识别图片
        vcode = wmcode.getCodeFormFile(imgPath)
        TracePrint(vcode)
        #icon("@res:7rus4nui-cajr-0bu2-h6rk-itm4fi82kik3.png")
        // 设置验证码
        UiElement.SetValue({"wnd":[{"cls":"Chrome_WidgetWin_1","title":"*","app":"chrome"},{"cls":"Chrome_RenderWidgetHostHWND","title":"Chrome Legacy Window"}],"html":{"url":"http://train.lnsafety.com/mnzxlogin.asp","title":"模拟在线考试登录","tagName":"INPUT","attrMap":{"tag":"INPUT","id":"vold"},"index":0}},vcode,{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200})
        TracePrint(vcode)
        // 设置身份证
        #icon("@res:9pcilhhc-sis8-c6sk-c48t-3pfcneq18i5i.png")
        UiElement.SetValue({"wnd":[{"cls":"Chrome_WidgetWin_1","title":"*","app":"chrome"},{"cls":"Chrome_RenderWidgetHostHWND","title":"Chrome Legacy Window"}],"html":{"url":"http://train.lnsafety.com/mnzxlogin.asp","title":"模拟在线考试登录","tagName":"INPUT","attrMap":{"tag":"INPUT","id":"username"},"index":0}},"430724198612182817",{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200})
        // 设置选择框的值
        #icon("@res:aijmr1nd-guh0-ulnr-l8bo-kdnr6t21j8mp.png")
        UiElement.SetSelect({"wnd":[{"cls":"Chrome_WidgetWin_1","title":"*","app":"chrome"},{"cls":"Chrome_RenderWidgetHostHWND","title":"Chrome Legacy Window"}],"html":{"url":"http://train.lnsafety.com/mnzxlogin.asp","title":"模拟在线考试登录","tagName":"SELECT","attrMap":{"tag":"SELECT"},"index":0}},["主要负责人"],"text",{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200})
        // 以js方法点击按钮
        sRet = WebBrowser.RunJS(hWeb,"function(){\ndocument.querySelector(\"#aabb\").click();\nreturn 123\n}",true,{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200})
        // 以鼠标点击按钮
        #icon("@res:k2bbgaji-aoso-ecpg-p3s9-45ao6gl23uko.png")
        //Mouse.Action({"wnd":[{"cls":"Chrome_WidgetWin_1","title":"*","app":"chrome"},{"cls":"Chrome_RenderWidgetHostHWND","title":"Chrome Legacy Window"}],"html":{"url":"http://train.lnsafety.com/mnzxlogin.asp","title":"模拟在线考试登录","tagName":"IMG","attrMap":{"tag":"IMG","id":"aabb"},"index":0}},"left","click",10000,{"bContinueOnError":false,"iDelayAfter":300,"iDelayBefore":200,"bSetForeground":true,"sCursorPosition":"Center","iCursorOffsetX":0,"iCursorOffsetY":0,"sKeyModifiers":[],"sSimulate":"simulate"})
    else
            TracePrint("识别库加载失败")
    end if
End If


字库在附件,解压到d盘。

上传的附件:
最新回复 (5)
  • 哒哒 6月前
    2


    学习笔记:

    正如大佬所说,这一大段的命令重点在于JS部分:

    dim fun = '''
    function(){
           // 参数设置
        var css = "#valimg",imgType = "image/png",postfix=".png";
        // 获取验证码图片的元素
        var img = document.querySelector(css);
        // 创建画布
        var canvas = document.createElement("canvas");
        // 验证码图片,原始宽度
        canvas.width = img.naturalWidth;
        // 验证码图片,原始高度
        canvas.height = img.naturalHeight;
        // 2D模式
        var ctx = canvas.getContext("2d");
        // 渲染图片
        ctx.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight);
        // 转为base64,用于给a做文件下载
        var dataURL = canvas.toDataURL(imgType);
           // 生成一个a元素
        var a = document.createElement('a');
        // 创建一个单击事件,模拟下载
        var event = new MouseEvent('click');
        // 设置图片名称
        a.download = new Date().getTime() + postfix
        // 将生成的URL设置为a.href属性
        a.href = dataURL;
        // 触发a的单击事件
        a.dispatchEvent(event);
        return a.download;
    }
    '''

    虫子大佬的这段命令并不是保存当前页面中展示的验证码,而是对着验证码的原图重新画了一个复制品并将其保存下载了。

    如果想应用到其他网站的验证码图片获取上,只需要将css = "#valimg"更改为所需要识别的验证码的css-selector就可以了,如果还想对图片格式进行定制,也只需要改一下imgType = "image/png",postfix=".png"这两参数。

    再次向虫子大佬献上我的膝盖!

  • 夜行 5月前
    3
    膜拜,看了两节视频还是云里雾里
  • 吴彪 3月前
    4

    复制原图下载,我找了两个有验证码的地方尝试,有个图片是jpeg的成功了,有个是gif的失败了,我在控制台一步步输入发现获取原图片的长宽度都是0,http://mem.jiancai.com/member/login.aspx,这个是网址,老师看看怎么解决还是我写错了

  • 瞌睡蟲子 3月前
    5
    吴彪 复制原图下载,我找了两个有验证码的地方尝试,有个图片是jpeg的成功了,有个是gif的失败了,我在控制台一步步输入发现获取原图片的长宽度都是0,http://mem.jiancai.com/membe ...
    <input type="image" name="imgbntVerifyCode" id="imgbntVerifyCode" usesubmitbehavior="false" src="CheckImage.aspx?v=132111914495419179" style="border-width:0px;">
    你看验证码源码,是个input元素,不是img元素。用画布方法drawImage不支持input这种图片方法。
    你这个用http+cookie方式下载图片,然后验证吧。
  • 吴彪 3月前
    6
    知道了,原来是这个问题,http cookies解决了
返回
发新帖