用c++实现获取ie网页的验证码图片识别后输入到验证码框

本文介绍了一种使用C++通过IHTMLDocument2接口获取IE网页验证码图片,将其转化为base64编码,利用tesseract OCR进行识别,再将结果填入验证码输入框的方法。在实施过程中遇到了获取网页、处理图片加载延迟、base64解码及识别结果处理等问题,并展望了程序的整合与优化方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.主要方法

利用IHTMLDocument2得到ie的网页,结合上一篇的js扩展程序中的方法,通过execScript()执行脚本将验证码图片base64编码为字符串。然后c++程序获取图片的base64字符串解码后通过tesseract进行识别,将识别后的结果通过execScript()写到验证码框中。

2.遇到的一些问题

1.获取ie的网页。用FindWindow()FindWindowEx()结合spy++找到网页的窗口句柄,经过试验发现浏览器总是将当前的网页置于子窗口的最前面。
2.由于execScript()并不返回js的执行结果,所以我将验证码图片的base64编码以<p id hidden>图片</p>结点的形式保存在<body></body>中,之后用获取结点的html内容的方法获取图片。
3.获取验证码图片要使用canvas,但是drawImage()这个图片的加载需要时间,因此要将drawImage()以及编码和插入结点操作放到图片的onload()回调函数中。但是这其中有个问题一直没弄明白:我将上述2、3操作放到一个function中,然后调用function,但是由于drawImage()的原因(我认为是的)插入的结点值总是空的,不用function,去掉“{”“}”只执行内部的代码,插入的节点值就对了。
4.base64解码后利用opencv的imdecode(),特别注意canvas的toDataURL()得到的字符串有一部分不是编码。
5.在之前的execScript()中我写入了一个input(code)的function,作用是将code写入到验证码框。在得到识别结果后,将结果与input()拼接起来,再执行一次js程序。但是识别结果的字符串后面总是有两个‘\n’;因此要除去。

3.展望

  • 首先是将这部分与之前的用户名和密码程序结合起来。
  • tesseract-OCR这部分因为没有自己做样本库,所以精度很低。弄懂tesseract是如何工作的,如何自己训练样本库

4.程序的主要代码

IHTMLDocument2* GetDocInterface(HWND hWnd)
{
    //必须动态载入OLEACC.dll动态链接库
    HINSTANCE hInst = ::LoadLibrary(_T("OLEACC.DLL"));
    IHTMLDocument2* pDoc2 = NULL;

    if (hInst != NULL){
        if (hWnd != NULL){
            //COM接口指针很危险,因为使用过程中需要每一个使用者都要严格并且正确的AddRef和Release,
            CComPtr<IHTMLDocument> spDoc = NULL;
            LRESULT lRes;
            //因为WM_HTML_GETOBJECCT非Windows标准消息,得手动注册  
            UINT nMsg = ::RegisterWindowMessage(_T("WM_HTML_GETOBJECT"));//返回一个引用,一个类似句柄,到指定的对象。
            ::SendMessageTimeout(hWnd, nMsg, 0L, 0L, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes);//该函数将指定的消息发送到一个或多个窗口
            LPFNOBJECTFROMLRESULT pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress(hInst, "ObjectFromLresult");
            //ObjectFromLresult函数检索是一个基于先前生成的对象的引用访问的对象请求的接口指针。
            //QueryInterface,客户可以通过此函数来查询某个组件是否支持某个特定的接口。若支持QueryInterface将返回一个指向些接口的指针,不支持返回值将是一个错误代码。
            if (pfObjectFromLresult != NULL){
                HRESULT hr;
                hr = pfObjectFromLresult(lRes, IID_IHTMLDocument, 0, (void**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值