• 当你在办公室里面工作,周围有老板、领导,但又着急买春节的火车票怎么办?
  • 开着电脑声音,出票火车鸣笛声没听到,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("有票了,请在浏览器中完成操作!\r\n 如果你返回修改了订票规则(比如修改席别),请单击下【继续刷票】按钮!");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开发框架 的 开源项目 下载页有下载 ,选择下面的下载内容即可:

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

            application,            8K, uploaded             Today             -            169 downloads             
     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订票小工具》 ,仅仅去掉了程序窗口的标题就拿出来发表,但未有任何说明是转载,甚至自己把篡改过的程序提供出来公开下载,甚至对于网友的回帖进行删帖,最后禁止回帖。

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

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

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

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

本文转自深蓝医生博客园博客,原文链接:http://www.cnblogs.com/bluedoctor/p/3513689.html,如需转载请自行联系原作者

电脑静音工作,又听不到12306的来票音乐,纠结啊 !但春节前工作多任务重,不能安心工作,就动手做个“无声购票弹窗”工具吧!...相关推荐

  1. 【win10专业版】xp系统电脑静音快捷键是什么

    笔记本电脑都有自己的音响,所以有时我们在播放视频时需要戴上耳机,以免打扰他人休息.但是,很多用户不喜欢戴耳机,所以他们想安静地观看.XP笔记本电脑如何实现快速静音?什么是静音快捷键?如果你不知道,那么 ...

  2. xp系统计算机快捷键,XP电脑静音快捷键是什么?

    笔记本电脑是自带音响的,所以有时候我们为了不打扰到别人休息,播放视频的时候就需要带上耳机.可是很多用户不喜欢戴耳机,于是想要静音观看,那么XP笔记本电脑如何实现快速静音?静音快捷键又是什么?如果你不知 ...

  3. java保存火车票信息_java抓取12306火车余票信息

    最近在弄一个微信的公众帐号,涉及到火车票查询,之前用的网上找到的一个接口,但只能查到火车时刻表,12306又没有提供专门的查票的接口.今天突然想起自己直接去12306上查询,抓取查询返回的数据包,这样 ...

  4. 12306自动抢票及自动识别验证码功能(一)

    其实12306抢票之前有做过,近年来随着技术的发展AI的兴起,我也随波逐流,研究了下python深度学习,来实现12306全自动抢票工具. 1. 实现12306自动识别验证码,我这里用的比较简单,目前 ...

  5. Python大牛带你实现12306全自动抢票,学完后春运回家抢票无忧

    随着2018年春节的脚步日益临近,归心似箭的人们都希望能尽快赶回家中.中国人回家过年,是每个人一年中最重要的事,无论你离家远近.在所有的交通工具中,承担着最大客流量的交通工具,毫无疑问是火车.中国庞大 ...

  6. 抢票季:吐槽12306 分享抢票经验

    又是一年一度的春运抢票季,不管你是北上.南下或者东进,在外漂泊了一年,有钱没钱总是要回家过年的. [图片来源于网络] 吐槽:12306抢票的悲伤 据说12306改版了,新版本里面除了UI这些面儿上的改 ...

  7. 基于python的12306自动抢票系统的设计与实现

    铁路售票系统12306网站作为一个广受人们的日常使用工具,受大极大的关注.铁路售票的管理者都主要考虑降低成本,提升售票服务满意度.一年一度的春运和节假日出行高峰期,给众多的出行群众者带来了极大的烦恼, ...

  8. 年轻人必读:惠普前总裁孙振耀谈工作

    孙振耀谈工作 我有个有趣的观察,外企公司多的是25-35岁的白领,40岁以上的员工很少,二三十岁的外企员工是意气风发的,但外企公司40岁附近的经理人是很 尴尬的.我见过的40岁附近的外企经理人大多在一 ...

  9. 再读《中国惠普前总裁孙振耀谈工作与生活》之一:健康第一

    大学以来一直在追求梦想,追求有所为的生活,毕业工作后也一直拼命,甚至于差点牺牲了革命的本钱--健康.大病一场,想尽人间事.心里依旧有梦想,但是健康放到了第一位.原来的工作,我也辞职了,在被评为先进个人 ...

最新文章

  1. chosen.jquery.js 有搜索功能、多选功能的下拉框插件
  2. python能处理多大的数据包-利用Python进行数据处理(更新)
  3. 【2008】奥运门票4月15日开始预定 四种购买方式供选
  4. Java 8 - 正确高效的使用并行流
  5. MyBatis常用配置解析-environments标签
  6. [js] 根据元素ID遍历树形结构,查找到所有父元素ID
  7. 数据结构实验:连通分量个数
  8. firebase使用_使用Firebase进行物联网原型设计:如何事半功倍
  9. 分布式云时代,腾讯云为何自研操作系统
  10. 原型模式(Prototype) 1
  11. Python 的字符编码
  12. 第二章 实例研究:设计一个文档编辑器--《设计模式-可复用面向对象软件的基础》Erich Gamma
  13. 虚拟机、云主机、VPS 三者之间的区别
  14. Win10环境下安装TensorFlow 2.0简明教程
  15. 互联网快讯:米巴资本完成首期美元基金募集;极米投影产品双十一持续热销;SpaceX星链成立印度子公司
  16. [转载] 黄志敏:一条数据新闻是如何用7步生产出来的?
  17. js删除数组中的指定对象
  18. gog无效的验证码_如何退款GOG游戏
  19. ZStack云平台云主机管理
  20. Be accepted for inclusion in the IEEE INFOCOM 2018 technical program

热门文章

  1. eclipse中ctrl+h默认打开是JavaSearch,怎么设置成默认打开是FileSearch
  2. decimal(18,2)如何保存1.234
  3. 数据库提示日志文件不可用
  4. 【Java虚拟机】运行时数据区
  5. 置顶信息[置顶] 常用日常英语缩写
  6. AndroidStudio_安卓原生开发_获取系统S/N序列号_实现在springboot服务端_设备远程保活监控---Android原生开发工作笔记159
  7. mycat集群执行带有join的sql语句时报错_can‘t find table define in schema_分片join---Linux运维工作笔记052
  8. MyCat分布式数据库集群架构工作笔记0008---Mycat主--从复制原理
  9. STM32工作笔记0036---C语言复习--寄存器地址名称映射
  10. EJB3.0学习笔记--SOAP-AXIS--深入Soap引擎