zoukankan      html  css  js  c++  java
  • 无声购票弹窗

    http://www.cnblogs.com/bluedoctor/p/3513689.html 深蓝

    • 当你在办公室里面工作,周围有老板、领导,但又着急买春节的火车票怎么办?
    • 开着电脑声音,出票火车鸣笛声没听到,QQ聊天工具等不和谐的声音放出来了怎么办?
    • 为了不让别人听见你在买票,只好把声音关了,但这样你就不知道有票来了!
    • 所以只好不断的偷偷切换窗口,看票来了没有,弄得工作都没有心情。
    • 有时候即使这样,当你发现票来了,等点击提交订单的时候,票早就没了,坑爹啊:-《
    • 为此眼看着列表上有N多张最好的票,白白丢了的有木有:-《

    如果有个程序,能够在来票的时候自动弹窗出来,我就可以一边安心的工作 ,一边及时输入验证码提交订单购票了 。

    有朋友说可以试试360等自动抢票的工具,但作为程序员的我,决定自己动手,丰衣足食。

    一、问题分析和解决思路:

    本篇文章要解决的就是“无声出票弹窗”的功能,分析需求,主要在于及时弹窗,12306页面上有出票“弹窗”的功能,但这只是一个DIV层,当你在工作的时候,浏览器的这种弹窗功能并不能弹窗到你当前工作上面来,所以在浏览器上做插件,路子行不通。 但是,自己做一个浏览器,弹窗功能就可以做出来了,想怎么做就怎么做。

    要弹窗,得知道何时弹窗,这个需要监控12306自动刷票页面的那个DIV弹出层,一旦发现它弹出来了,立刻启动自己的弹窗功能。

    自己做浏览器,用WebBrowser控件即可,弹窗用WinForm窗口的置顶属性即可。 好了,开始动手干吧!

    1,寻找12306的出票提示层

    首先,在12306的抢票网页上输入合适的条件,开启“自动提交”功能,等到出来“已查到车票,请核对以下信息”弹层的时候, 使用浏览器的开发者工具,我用的是IE11,按F12,找到这个层的ID,如下图所示:

    复制出相关的HTML代码:

    复制代码
    <DIV id=autosubmitcheckticketinfo style="POSITION: fixed; LEFT: 381px; Z-INDEX: 20000; DISPLAY: block; TOP: 100px" jQuery19108911652775277663="319" dhxbox="1"><DIV class=mark></DIV>
    <DIV class="up-box w664" id=content_autosubmitcheckticketinfo>
    <DIV class=up-box-hd>已查到车票,请核对以下信息 </DIV>
    <DIV class="up-box-bd ticket-check">
    <H3>车次信息</H3>
    ---其它内容略---
    </DIV></DIV></DIV>
    复制代码

    从上面我们知道,这个层的ID名字是 autosubmitcheckticketinfo ,它当前显示的样式属性是

    style="POSITION: fixed; LEFT: 381px; Z-INDEX: 20000; DISPLAY: block; TOP: 100px"

    所以我们只需要根据HTML的DOM对象,找到这个节点,发现 DISPLAY: block 这样的样式特性即可知道要买的票出来了。

    2,WebBrowser控件操作HTML DOM

    HTML DOM属性 知道了抢票网页的弹层ID,我们的WebBrowser控件必须要能够访问它的属性,这里主要是样式的显示属性 DISPLAY的值。下面是有关代码:

    复制代码
    var div = webBrowser1.Document.GetElementById("autosubmitcheckticketinfo");
     if (div != null)
    {
           mshtml.IHTMLElement currDiv = (mshtml.IHTMLElement)div.DomElement;
           if (currDiv.style.display == "block" || string.IsNullOrEmpty( currDiv.style.display))
           {
                timer1.Stop();
                this.TopMost = true;
                MessageBox.Show("有票了,请在浏览器中完成操作!
     如果你返回修改了订票规则(比如修改席别),请单击下【继续刷票】按钮!");
                 this.TopMost = false;
             }
    }
    复制代码

    上面的代码中,使用了 mshtml.IHTMLElement 接口,该接口使用了 Microsoft.mshtml.dll 中的功能,可以引用COM组件中的 MSHTML组件得到。


    上面也可以不使用mshtml的接口,使用 HTMLDivElementClass 类型也可以,如下面的代码:

    mshtml.HTMLDivElementClass currDiv = (mshtml.HTMLDivElementClass)div.DomElement;

    但这样使用,如果是32位系统下用VS编译的并且选择Any Cpu的解决方案,那么在64位系统下,会出现下面的问题:

    其他信息: 无法将类型为“mshtml.HTMLDivElementClass”的 COM 对象强制转换为接口类型“mshtml.IHTMLRuleStyle”。
    此操作失败的原因是对 IID 为“{3050F3CF-98B5-11CF-BB82-00AA00BDCE0B}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败:
    不支持此接口 (异常来自 HRESULT:0x80004002 (E_NOINTERFACE))。 错误 1 无法嵌入互操作类型“mshtml.HTMLDivElementClass”。请改用适用的接口。

    3,弹窗到最顶层

    这个功能简单,上面的代码也给出了,只需要设置当期窗口的TopMost属性为真即可。不过不可以一直这样设置,否则会让工作窗口无法切换出来,因此在提示后,及时取消这个设置。

    this.TopMost = false;

    但是执行这个代码后,如果当期抢票工具的窗口是被最小化的,当点击了确认窗口后,那么抢票窗口还是无法及时弹出来,这里需要做些修改。只需要在弹窗前 ,设置窗口的模式为最大化即可。当然,窗口不最小化,直接用工作窗口覆盖订票窗口就没事,可以正确的弹窗到最顶层。

    4,修改刷票间隔时间

    首先申明,使用这个功能可能会损害别人购票的机会,并对购票网站的服务造成影响,请勿随意使用!这里仅作技术探讨。

    找到WebBrowser 控件关联的HTML文档的Windows属性对象,调用execScript 方法即可。刷新间隔是5秒,可以修改成其它值。由于修改刷新间隔时间会增加12306的处理负载,故这里不直接公布具体如何修改,感兴趣的可以自己去研究。

    var win = (mshtml.IHTMLWindow2)webBrowser1.Document.Window.DomWindow;
     win.execScript("...", "javascript");

     我试了一下,将刷新间隔修改为0.1秒,在购票高峰期,余票信息可能出不来但程序却在那里不断的刷,此时需要修改下刷票间隔,最好设置成1秒以上,因为当12306网站已经很卡的时候客户端刷新频率再高都没用。

    所以,一般情况下设置成1秒的间隔足矣,在满足本篇文章声明的前提下尝试使用,然后恢复成正常的5秒间隔。

    二、12306无声刷票小工具下载和使用

    1,使用简介:

    使用上面的方法,就可以Diy一个自己的抢票工具了,我现在把“12306无声刷票小工具”发布出来并免费使用,现在你可以放心的一边安静的工作,一边及时购票提交订单了!

    按照界面操作提示,当有票来的时候程序会自动弹窗到当期电脑的最顶层窗口,确保你可以及时操作! 下面是工具监视到出票并及时弹窗的界面:

     更多使用说明,请看工具的使用说明。

    注意:

    不得使用本软件进行非法用途,由此造成的后果完全由使用者自行承担! 本软件始终免费,如果你觉得软件对你有用并愿意支持开源软件的发展,可以捐助作者,捐助信息和帐号,请看PDF.NET官网: http://www.pwmis.com/sqlmap ,其它地方公布的信息请勿使用。

    2,下载地址:

    PDF.NET开发框架 的 开源项目 下载页有下载 ,选择下面的下载内容即可:

    Application     12306无声弹窗刷票通知工具V1.0.4    

                application,            8K, uploaded             Today             -            169 downloads             
    Application     Microsoft.mshtml.dll    
                application,            7845K, uploaded             Wed             -            4 downloads
     
    只要你的电脑上有 .NET 2.0框架,或者 4.0框架即可运行本程序,一般情况下,Win7,Win8可以直接使用,部分XP的系统下面,可能没有安装 MSHTML 组件,需要下载 第二个文件到运行目录,如果你出现下面的错误信息,请下载它 :
    System.IO.FileNotFoundException: Could not load file or assembly 
    'Microsoft.mshtml, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies.
    系统找不到指定的文件。

    此时需要下载 上面的第二个文件 ,下载下来的文件名是 Microsoft.mshtml.dll.bak ,将文件改名为 Microsoft.mshtml.dll 放到 购票程序的运行目录下面去即可。

    PS:今天早上,我用自己的这个工具,终于买到了一张卧铺票:)

          下班前,又用最新版工具,买了一张特快票:)

    在这里祝愿大家都早日买到车票,高高兴兴的回家!

    对于小工具使用上的问题,大家可以跟帖说明,或者查看工具程序的“使用帮助”。请大家随时关注最新版。

    版本更新信息:
    2014.1.9    Ver 1.0.3 支持调整刷新时间
    2014.1.10  Ver 1.0.4 修复了最小化工具的窗口导致无法弹出购票窗口到最顶端的问题。
                           增加了操作提示。

     申明:

    有人在园子里面用本文提供的程序写了一篇博客《12306订票小工具》 ,仅仅去掉了程序窗口的标题就拿出来发表,但未有任何说明是转载,甚至自己把篡改过的程序提供出来公开下载,甚至对于网友的回帖进行删帖,最后禁止回帖。

    对于这种抄袭行为,本文表示谴责!

    下面是删帖前的部分截图:

     对此问题,我已经进行了投诉:

    投诉“罗旭成”的博客抄袭别人程序源码并篡改程序发布,且删除和禁止回帖的事情

  • 相关阅读:
    开源项目
    [Accessibility] Missing contentDescription attribute on image [可取行]失踪contentDescription属性图像
    Android 布局 中实现适应屏幕大小及组件滚动
    EF 错误记录
    EasyUI 加载时需要显示和隐藏 panel(面板)内容破版问题
    IE 报表缩放后页面破版
    VS 2017 引入nuget 问题
    SSRS 报表显示页面 asp net session丢失或者找不到 asp net session has expired or could not be found()
    log4net 配置
    网站
  • 原文地址:https://www.cnblogs.com/CharlesGrant/p/3686041.html
Copyright © 2011-2022 走看看