ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 75904|回复: 138

WebBrowser控件登录12306订票小助手--抓验证码图片、API关闭弹窗,更新0.53版

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-1-10 10:01 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:网页交互
本帖最后由 liucqa 于 2012-11-28 01:27 编辑

WebBrowser帮助 MSDN
http://msdn.microsoft.com/en-us/library/aa752085%28v=VS.85%29.aspx


用C#做的识别验证码图片的演示(双字库)。

1.gif

从实践来看,识别验证码还是通过C#之类的高级语言比较方便,VBA不适合做这种复杂的图像处理。



************************************保留的原来信息,基本已经无用,请直接看103楼**********************************************

终于可以登录12306了

12306登录演示.rar (34.11 KB, 下载次数: 542)

采用WebBrowser控件,登录之后还有个问题,不能直接进入网站页面,还回到登录页面,需要自己点击我的12306,不知道为什么?
难道Webrowser的Post有什么问题吗?  另外谁知道怎么得到网页弹出来的消息?
请高手看看。也许是没在网页上填写用户名和密码的问题

看2楼和3楼的Script
可能是因为我的WebBrowser不知什么原因造成3楼的红色代码不能执行。

************************1月15日*********************************

新版改了一点代码,毛病依旧。测试发现即使我不用WebBrowser Post登录,手工点登录进去,到查询页面依然无法查询,用IE没问题。
12306登录演示new.rar (39.52 KB, 下载次数: 415)

我有几个问题请高手研究一下
1、如何用WebBrowser取得登录页面loginForm表单里面的用户名、密码、验证码。(已解决)
2、为什么Post之后验证是成功的,但页面不进入我的12306页面,还要自己点击呢。(即使用WB点击我的12306link也直接回到登录页面)
3、为什么用WB打开12306页面之后,即使人工操作登录进去,还是不能查询车票呢?这个就和我的程序无关了,纯粹是网站和WB之间的问题!

还有一个终极问题,WB如何捕获页面弹出的消息窗口?(不是屏蔽)。传说用IDocHostShowUI接口实现,谁知道VBA下咋弄?难道要换扩展WB控件才行吗?

*************************1月17日**********************************

临时先搞一个用计时器关闭页面弹出消息的版本
12306登录演示-计时器API版.rar (71.57 KB, 下载次数: 395)
这个版本可以关闭安全证书的警报窗口和IE的内容不安全的警告窗口,但是不能关闭JS的脚本错误窗口(计时器收不到)
明天准备在页面执行中加入JS脚本来屏蔽错误信息试试效果。

计时器源代码来自http://club.excelhome.net/thread-488569-1-1.html
一开始用http://club.excelhome.net/forum.php?mod=viewthread&tid=783286这个计时器类模块,结果发现IE出现警告窗口之后,计时器就收不到了,估计和VBA单线程有关。前一个计时器好歹在这个窗口能接收到,但是在JS脚本错误时,还是收不到了。

最新submit提交表单的版本在63楼

*************************1月20日**********************************
1月20日版正式出炉,更新如下:
1、支持获得验证码图片,哪个牛人给弄个OCR识别?
2、验证码输入4位自动登录
3、页面状态的监测更加完善(可以识别用户名、密码、验证码各种错误提示。在一些特定操作下,计时器偶尔会提前终止,务请淡定)
4、隐藏EXcel界面。

新版在103楼,注意只有安装IE8(或以下版本,未测试)的机器才能在登录之后查询车票及提交订单。
IE9 的WB只能登录,不能查询。

本程序只能登录,后继订票请自行操作。

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-1-10 10:20 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 liucqa 于 2012-8-24 10:56 编辑

利用IDocHostUIHandler接口屏蔽WebBrowser的弹出菜单

简单说两句:大致就是实现IDocHostUIHandler接口,挂接IDocHostUIHandler接口可以利用ICustomDoc接口或IOleObject接口实现,这里演示了利用ICustomDoc

接口进行挂接。由于只是想屏蔽webbroswer的弹出菜单,所以只在IDocHostUIHandler的ShowContextMenu方法上做点文章就够了,IDocHostUIHandler的其它的方法不必

进行处理,但是你必须实现它们,哪怕你只写上一些注释,好了,下面看代码:
'窗体上一个按钮,一个tetbox,一个checkbox,一个WebBrowser
'这里我依旧引用Edanmo's OLE interfaces & functions v1.81(对应文件olelib.tlb)
Option Explicit
Implements IDocHostUIHandler
Dim mshow As Boolean
Dim mICustomDoc As ICustomDoc

Private Sub Check1_Click()
    mshow = Check1.Value
End Sub

Private Sub Command1_Click()
    Me.WebBrowser1.Navigate Text1.Text
End Sub

Private Sub Form_Load()
    Me.WebBrowser1.Navigate "about:blank"
End Sub

Private Sub IDocHostUIHandler_EnableModeless(ByVal fEnable As olelib.BOOL)
    IDocHostUIHandler.EnableModeless fEnable
End Sub

Private Function IDocHostUIHandler_FilterDataObject(ByVal pDO As olelib.IDataObject) As olelib.IDataObject
    Set IDocHostUIHandler_FilterDataObject = IDocHostUIHandler.FilterDataObject(pDO)
End Function

Private Function IDocHostUIHandler_GetDropTarget(ByVal pDropTarget As olelib.IDropTarget) As olelib.IDropTarget
    Set IDocHostUIHandler_GetDropTarget = IDocHostUIHandler.GetDropTarget(pDropTarget)
End Function

Private Function IDocHostUIHandler_GetExternal() As Object
    Set IDocHostUIHandler_GetExternal = IDocHostUIHandler.GetExternal
End Function

Private Sub IDocHostUIHandler_GetHostInfo(pInfo As olelib.DOCHOSTUIINFO)
     IDocHostUIHandler.GetHostInfo pInfo
End Sub

Private Sub IDocHostUIHandler_GetOptionKeyPath(pOLESTRchKey As Long, ByVal dw As Long)
    IDocHostUIHandler.GetOptionKeyPath pOLESTRchKey, dw
End Sub

Private Sub IDocHostUIHandler_HideUI()
    IDocHostUIHandler.HideUI
End Sub

Private Sub IDocHostUIHandler_OnDocWindowActivate(ByVal fActivate As olelib.BOOL)
     IDocHostUIHandler.OnDocWindowActivate fActivate
End Sub

Private Sub IDocHostUIHandler_OnFrameWindowActivate(ByVal fActivate As olelib.BOOL)
    IDocHostUIHandler.OnFrameWindowActivate fActivate
End Sub

Private Sub IDocHostUIHandler_ResizeBorder(prcBorder As olelib.RECT, ByVal pUIWindow As olelib.IOleInPlaceUIWindow, ByVal fRameWindow As

olelib.BOOL)
    IDocHostUIHandler.ResizeBorder prcBorder, pUIWindow, fRameWindow
End Sub

Private Sub IDocHostUIHandler_ShowContextMenu(ByVal dwContext As olelib.ContextMenuTarget, pPOINT As olelib.POINT, ByVal pCommandTarget As

olelib.IOleCommandTarget, ByVal HTMLTagElement As Object)
    If mshow = True Then
        IDocHostUIHandler.ShowContextMenu dwContext, pPOINT, pCommandTarget, HTMLTagElement
    End If
End Sub

Private Sub IDocHostUIHandler_ShowUI(ByVal dwID As Long, ByVal pActiveObject As olelib.IOleInPlaceActiveObject, ByVal pCommandTarget As

olelib.IOleCommandTarget, ByVal pFrame As olelib.IOleInPlaceFrame, ByVal pDoc As olelib.IOleInPlaceUIWindow)
    IDocHostUIHandler.ShowUI dwID, pActiveObject, pCommandTarget, pFrame, pDoc
End Sub

Private Sub IDocHostUIHandler_TranslateAccelerator(lpmsg As olelib.MSG, pguidCmdGroup As olelib.UUID, ByVal nCmdID As Long)
    IDocHostUIHandler.TranslateAccelerator lpmsg, pguidCmdGroup, nCmdID
End Sub

Private Function IDocHostUIHandler_TranslateUrl(ByVal dwTranslate As Long, ByVal pchURLIn As Long) As Long
    IDocHostUIHandler_TranslateUrl = IDocHostUIHandler.TranslateUrl(dwTranslate, pchURLIn)
End Function

Private Sub IDocHostUIHandler_UpdateUI()
    IDocHostUIHandler.UpdateUI
End Sub

Private Sub WebBrowser1_DownloadComplete()
    Set mICustomDoc = Me.WebBrowser1.Document
    mICustomDoc.SetUIHandler Me
End Sub

        最后,需要说明的是,这个程序可能有一些问题,以至于在vb的IDE中它不能很好的工作(至于是什么原因,现在没时间研究了,以后再说吧,有知道的,欢迎

你告诉我),不过,编译成exe文件后,它还是可以实现我们的目的的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-1-10 11:21 | 显示全部楼层
本帖最后由 liucqa 于 2012-1-16 12:15 编辑

https://dynamic.12306.cn/otsweb/main.jsp  这个页面的Script


<script>
    $(function(){
        //if(!$.browser.msie){
        //    alert("非常抱歉,系统目前暂不支持您的浏览器!");
        //}
     $('.menu_left ul li[name="horverLi"]').hover(
        function(){
           $(this).find('p').stop(true,true).show();
        },function(){
     $(this).find('p').stop(true,true).hide();
          });
    });
        
         $("#menu_w a").bind("click",function(){
             $("#menu_w a").attr("class","n_out");
             $(this).attr("class","n_on");
          });
         function hideMenu(){
             $("#menu_w").hide();
             doIframe() ;
         }
         function showMenu(){
             $("#menu_w").show();
             doIframe() ;
         }
         function clickMenu(title){
             $("#menu_w a").each(function(){
                if($(this).find("cite").length>0){
                 if($(this).find("cite")[0].innerHTML == title){
                     $(this).click();
                  }
                }
             });
         }

         function hasLogin(_name)
         {
             $("#username_ a").attr("href","/otsweb/sysuser/user_info.jsp");
             $("#username_ a > cite").html(_name);
             $("#login_out a").attr("href","/otsweb/loginAction.do?method=logout");
             $("#login_out a > cite").html("退出");
         }

       //退出登录
         function notLogin(){
             $("#username_ a").attr("href","/otsweb/registAction.do?method=regitNote");
             $("#username_ a > cite").html("注册");
              $("#login_out a").attr("href","/otsweb/loginAction.do?method=init");
             $("#login_out a > cite").html("登录");
         }
         
          $(document).ready(function(){
             var iframeForwardUrl = "";
               if (iframeForwardUrl != ""){
                   $("#main")[0].src=iframeForwardUrl;
                   if(iframeForwardUrl == "http://dynamic.12306.cn/TrainQuery/leftTicketByStation.jsp"){
                       clickMenu('余票查询');
                      }else if(iframeForwardUrl == "http://dynamic.12306.cn/TrainQuery/trainPassStationByTrainCode.jsp"){
                          clickMenu('列车时刻表查询');
                         }else if(iframeForwardUrl == "http://dynamic.12306.cn/TrainQuery/ticketPriceByStation.jsp"){
                          clickMenu('列车时刻表查询');
                         }else if(iframeForwardUrl == "http://dynamic.12306.cn/TrainQuery/sellTicketStation.jsp"){
                             clickMenu('客票代售点');
                         }else if(iframeForwardUrl == "http://dynamic.12306.cn/map_zwdcx/CCCX.jsp"){
                             clickMenu('正晚点查询');
                         }
                        
               }else{
                   $("#main")[0].src="/otsweb/loginAction.do?method=init";
               }
          });
    </script>

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-1-10 14:08 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-1-10 16:34 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
再顶                  

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-1-10 22:41 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-1-10 23:34 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-1-11 00:14 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-1-11 08:20 | 显示全部楼层
这样会不会订票快点呢?{:soso_e197:}

TA的精华主题

TA的得分主题

发表于 2012-1-11 09:29 | 显示全部楼层
哎,用填表机器人吧,挺好用的.昨天我就用过了.
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-24 06:37 , Processed in 0.048166 second(s), 14 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表