1. 程式人生 > >電腦靜音工作,又聽不到12306的來票音樂,糾結啊 !但春節前工作多工重,不能安心工作,就動手做個“無聲購票彈窗”工具吧!

電腦靜音工作,又聽不到12306的來票音樂,糾結啊 !但春節前工作多工重,不能安心工作,就動手做個“無聲購票彈窗”工具吧!

  • 當你在辦公室裡面工作,周圍有老闆、領導,但又著急買春節的火車票怎麼辦?
  • 開著電腦聲音,出票火車鳴笛聲沒聽到,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開發框架 的 開源專案 下載頁有下載 ,選擇下面的下載內容即可:

            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訂票小工具》 ,僅僅去掉了程式視窗的標題就拿出來發表,但未有任何說明是轉載,甚至自己把篡改過的程式提供出來公開下載,甚至對於網友的回帖進行刪帖,最後禁止回帖。

對於這種抄襲行為,本文表示譴責!

下面是刪帖前的部分截圖:

 對此問題,我已經進行了投訴: