前言:一年一度刷票接近尾声了,最近本人也经常在刷 票,也在为这个事情而烦恼,花了很多时间和精力去抢票,甚至一起叫了许多人一起抢票,上班时间想的都是抢票,真是辛苦,经过多天的折磨,终于拿到回家的车 票了,不容易。最近一段时间也在博客园看了很多文章,看到很多人写的关于12306的一些工具,感觉有些还不错,但是能真的用起来还存在差距,特别是在验 证码这块还是存在问题,到了关键时候还是用不了,感觉不靠谱,还不如用12306自带的刷票功能。
在这里还真要说说12306这个网站,每年这个网站都是要被别人吐槽,每年一到关键时刻就出问题,不是刷不了票,要不就是资料泄露,最近都出现订票出错的 情况,导致明明订的的是长沙自动帮你订到三亚去了,这真是怪哉,O(∩_∩)O哈哈~每天都有很多文章是关于12306这个网站的,真的这个网站做好就有 那么难,每年都要投入那么多经费,到头来还是一样,让人订不到票,黄牛缺可以在十多分钟内订走上千张票,真是不可思议,看来这样的年代还是有技术才有王 道。还是希望国家能多收铁路,增大运力,这是解决问题根本,哎…扯远了。
开发这个工具主要是用.NET开发的,主要用到修改网站本山的JavaScript,可以让刷新时间变短,这样增加刷票的次数,增加成功率,究竟是否真的有效,还需各位自己验证,本人并不敢打包票。
以下为html代码:
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <title></title> <script type="text/javascript"> var time = 5000; </script> </head> <body> 在下面的文本框输入“有票了”或者等待10秒钟试试看:<br /> <input type="text" id="txtName" /><input type="button" value="输入内容" /> <script type="text/javascript"> window.setTimeout("txtName.value ='有票了'", 10000); //autosubmitcheckticketinfo.style. </script> <div id=autosubmitcheckticketinfo style="POSITION: fixed; LEFT: 381px; Z-INDEX: 20000; DISPLAY: none; TOP: 100px" dhxbox="1" jquery1910021022635977561266="490"> <div class="up-box w664" id=content_autosubmitcheckticketinfo> <div class=up-box-hd>已查到车票,请核对以下信息 </div> </div> </div> </body> </html>
界面如下:
点击“继续刷票”按钮即可打开12306网站,其他动作就和进入12306一模一样了,输入用户和密码,选好乘车人和乘车日期等等相关信息后,选好 最上面的刷新间隔即可,最多可以选择5秒钟,最低可以选择1秒钟,把如上信息全部填好后,点击“查询”即实现刷票了,这样就会按照你设定的时间间隔进行刷 票了。
以下从源码层面进行分析:
FormLoad中主要加载默认网址,并设定默认的刷新时间。
#region * FormLoad private void Form1_Load(object sender, EventArgs e) { this.numericUpDown1.Value = 5; string uriString = ((DateTime.Now.Second % 2) == 0) ? "http://www.cnblogs.com/jara/" : "http://www.cnblogs.com/jara/"; this.webBrowser1.Url = new Uri(uriString); } #endregion
开始测试页按钮实现的代码(加载默认的网址,并且启动时间计时器):
private void btnOpenUrl_Click(object sender, EventArgs e) { string text = this.txtUrl.Text; if (text == "TestHtml.html") { text = Application.StartupPath + @"\" + text; } this.webBrowser1.Url = new Uri(text); this.timer1.Start(); }
开始刷票实现的代码(一旦有票就会将出票窗口弹出到最前端,即便你在工作状态,也不会错过订票的机会,这样就会你在上班时间工作更安心):
private void btnOpenUrl2_Click(object sender, EventArgs e) { if (this.btnOpenUrl2.Text == "继续刷票") { this.timer1.Start(); this.lblMsg.Text = "弹窗监视器工作中... ...当期刷新间隔:" + this.autoSearchTime + " 毫秒。"; } else { this.txtUrl.Text = "https://kyfw.12306.cn/otn/leftTicket/init"; this.btnOpenUrl.PerformClick(); MessageBox.Show("请在购票网页中登录并输入你的购票信息,开启自动提交功能,\r\n然后,本程序将在网页提交订单的时候自动弹出窗体提醒你及时进行操作!"); this.btnOpenUrl2.Text = "继续刷票"; } }
Timer实现的事件:
private void timer1_Tick(object sender, EventArgs e) { if (this.webBrowser1.Document != null) { if (this.txtUrl.Text == "TestHtml.html") { this.TestDom(); } else if (this.txtUrl.Text.Contains("leftTicket")) { this.leftTicket(); } } } private void TestDom() { HtmlElement elementById = this.webBrowser1.Document.GetElementById("txtName"); if (elementById != null) { IHTMLInputTextElement domElement = (IHTMLInputTextElement)elementById.DomElement; if (domElement.value == "有票了") { this.timer1.Stop(); mshtml.IHTMLElement element4 = (mshtml.IHTMLElement)this.webBrowser1.Document.GetElementById("autosubmitcheckticketinfo").DomElement; element4.style.display = ""; base.TopMost = true; MessageBox.Show("有票了!!!"); base.TopMost = false; ((mshtml.IHTMLWindow2)this.webBrowser1.Document.Window.DomWindow).execScript("time=1000;alert('时间改变了:'+time);", "javascript"); } } } private void leftTicket() { HtmlElement elementById = this.webBrowser1.Document.GetElementById("autosubmitcheckticketinfo"); if (elementById != null) { if (this.changeSearchTime) { ((mshtml.IHTMLWindow2)this.webBrowser1.Document.Window.DomWindow).execScript("autoSearchTime = " + this.autoSearchTime + " ;", "javascript"); this.changeSearchTime = false; } mshtml.IHTMLElement domElement = (mshtml.IHTMLElement)elementById.DomElement; if ((domElement.style.display == "block") || string.IsNullOrEmpty(domElement.style.display)) { this.timer1.Stop(); if (base.WindowState == FormWindowState.Minimized) { base.WindowState = FormWindowState.Maximized; domElement.style.left = "400px"; } base.TopMost = true; MessageBox.Show("有票了,请在浏览器中完成操作!\r\n 如果你返回修改了订票规则(比如修改席别),请单击下【继续刷票】按钮!"); this.lblMsg.Text = "弹窗监视器已经停止,请单击【继续刷票】按钮开启!"; base.TopMost = false; } } }
private void numericUpDown1_ValueChanged(object sender, EventArgs e) { this.changeSearchTime = true; this.autoSearchTime = 0x3e8 * ((int)this.numericUpDown1.Value); }
以上即可实现抢票的,这个工具的亮点主要在于可以实现一秒钟刷票的功能,用12306只能是5秒钟刷票,这样的话刷新的频率提高了,这样即可实现更快刷到票,此工具主要目的是好玩,不可用于其它目的,本人也声明不承担一切后果。
运行这个工具需要电脑安装了.net框架,一般情况下Win7、Win8都有自动的.net框架的,XP系统应该没有,如果没有这个框架在使用这个工具之前还需安装.NET框架,在百度里搜索就有。
程序:http://files.cnblogs.com/jara/V1.0.0.1.rar V.1.0.0.1版。
待续…