台鐵自動訂票程式 (轉載資料)



來源網址 : http://blog.roodo.com/raincry/archives/966555.html


轉貼自
http://www.javaworld.com.tw/jute/post/print?bid=35&id=33920

1.[網路]台鐵自動訂票程式 Copy to clipboard
Posted by: Yoshi
Posted on: 2004-02-21 07:36

老王賣瓜一下…
這個程式在過年節慶時是很有用的喔…可以不停的為你檢查有沒有人退票
今年過年我們教授就這樣訂到二張去高雄的火車票XD

import java.net.*;
import java.io.*;
public class OrderTicket {
private static String url=”http://railway.hinet.net/trw24/order_kind1.jsp?”;
public static void add(String attribute, String value) {
if(url.endsWith(”&”) || url.endsWith(”?”)) {
url+= attribute + “=” + value;
}
else {
url+= “&” + attribute + “=” + value;
}
}

count++;
URLConnection connection = website.openConnection();
BufferedReader in = new BufferedReader(
new InputStreamReader(connection.getInputStream()));
String line=null;
String content=”";
while( (line=in.readLine())!=null) {
content+=line;
}
in.close();
if(content.indexOf(”您的車票已訂到”)!=-1) {
BufferedWriter bw = new BufferedWriter(new FileWriter(”result.html”));
bw.write(content);
bw.close();
System.out.println(”票己成平q到,請讀取result.html檔。”);
System.exit(0);
}
else {
System.out.println(”票尚未定到,一分鐘之後將會再次嚐試…”);
try {
Thread.sleep(60000); //sleep 1 minute, and try it again later.
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
String id= “xxxxxxxxxx”; //請改成你自己的身份證字號
String from=”100″; //台北
String to=”070″; //羅東
String date=”2004/02/13″;
String startTime=”00:00″;
String endTime=”23:59″;
String quantity=”1″;
String kind=”*4″;
String returnTicket=”0″;
add(”personId”, id);
add(”fromStation”, from);
add(”toStation”, to);
add(”getinDate”, date);
add(”getinStartTime”, startTime);
add(”getinEndTime”, endTime);
add(”orderQty”, quantity);
add(”trainKindIn”, kind);
add(”returnTicket”, returnTicket);
try {
order();
}
catch(IOException e) {
System.out.println(”連線失敗,請檢查你的網路連線。”);
}
}
}3 Comments »
The URI to TrackBack this entry is: http://blog.worren.net/wp-trackback.php/9

29.Re:[網路]台鐵自動訂票程式 [Re: Yoshi] Copy to clipboard
Posted by: zanta
Posted on: 2004-05-10 11:34

首先,感謝 Yoshi 跟 titaeric 兩位的程式碼,讓小弟有一個很好的練習程式。

小弟根據 titaeric 修改過的程式再加以修改 (好像繞口令..),改過的幾個小地方條列如下:

1) 在設定的文字檔中加入 key 值 (也就是文字檔中是以 key=value 的格式在記錄資料),同時將網址以及等待時間這兩項參數加進文字檔中。

2) 加上時間以作為訂票依據 (因台鐵網路訂票有開放時間限制..),這邊用到 SimpleDateFormat 這個 class。

3) 若未成平q到票,則將 Server 回傳的訊息取出並秀在畫面上。這邊用到 Regular Expression 將 以及 標籤去除,留下純文字部份。

原本是改成利用 ResouceBundle 讀取 .properties 檔的方式載入訂票資訊
但測試時發現一個奇怪的問題,也就是訂票時的參數順序改變的話 (比如,第一個參數不是 personId),台鐵的網站就會拒絕我的訂票 Request..
在想出解法前,還是暫時以讀取純文字檔來執行好了…

附圖是執行時的樣子,程式碼跟文字設定檔請見下面;執行時第一個參數為設定檔的檔名。
小弟初學 java,若改的不好還請見諒

OrderTicket.java

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Date;
import java.text.SimpleDateFormat;

public class OrderTicket
{
private static StringBuffer url = new StringBuffer(”");
private static int wait;

public OrderTicket()
{
super();
}

public OrderTicket(String file) throws IOException
{
/* 參數意義
“personId”, //身分證字號
“fromStation”, //起站代碼
“toStation”, //到站代碼
“getinDate”, //乘車日期
“orderQty”, //訂票張數
“trainNo”, //車次代碼
“returnTicket” //是否訂來回票
*/

BufferedReader inputFile = new BufferedReader(new FileReader(file));
String line = null;

while ( (line = inputFile.readLine()) != null )
{
this.parse(line.trim());
}

inputFile.close();
}

public static void main(String[] args) throws Exception
{
if (args.length != 1)
{
System.err.println(”參數不正確!Expected : String fileName”);
//System.in.read(); //Pause
System.exit(0);
}
/*
try
{
new OrderTicket(args[0]).order();
}
catch(ArrayIndexOutOfBoundsException ex)
{
System.out.println(”設定檔格式錯誤,請確認是否符合 key=value 之形式。”);
}
catch (NumberFormatException ex)
{
System.out.println(”等待時間不為數字格式,請檢查設定檔中 “wait=” 參數。”);
}
catch (IOException ex)
{
System.out.println(”連線失敗,請檢查您的網路連線。”);
}
*/
}

private void parse(String input) throws ArrayIndexOutOfBoundsException, NumberFormatException
{
String[] tmp = input.split(”=”);
String key = tmp[0].trim();
String value = tmp[1].trim();

if (key.equals(”url”))
{
url.append(value);
}
else if (key.equals(”wait”))
{
wait = Integer.parseInt(value);
}
else
{
if (url.toString().endsWith(”&”) || url.toString().endsWith(”?”))
{
url.append(key + “=” + value);
}
else
{
url.append(”&” + key + “=” + value);
}
}
}// End of parse()

private void order() throws IOException
{
System.out.println(url);
URL website = new URL(url.toString());
String dateFormat = “yyyy’/’MM’/’dd, HH:mm:ss”;
int count = 1;

while (true)
{
System.out.print(”n開始第 【” + (count++) + “】 次嚐試訂票 -”);
System.out.println(”【” + new SimpleDateFormat(dateFormat).format(new Date()) + “】—————”);

URLConnection conn = website.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));

StringBuffer content = new StringBuffer(”");
String line = null;

while ((line = in.readLine()) != null)
{
content.append(line);
}

in.close();
this.showResult(content.toString());
}
}// End of order()

private void showResult(String content) throws IOException
{
if (content.indexOf(”您的車票已訂到”) != -1)
{
BufferedWriter bw = new BufferedWriter(new FileWriter(”result.html”));

bw.write(content);
bw.close();

System.out.println(”nt★ 票己成平q到,請讀取 result.html 檔。”);
System.exit(0);
}
else
{
String tagPattern = “(]{1,}>{1})|( )”; //去除 與 “&nbsp”,因顯示問題,請將全形符號&改成半形
String failMsg = content.replaceAll(tagPattern, “”);

System.out.println(”nt執行結果:票尚未訂到,” + (wait/1000) + ” 秒鐘之後將會再次嚐試…”);
System.out.println(”t回傳訊息:” + failMsg.trim());

try
{
Thread.sleep(wait); //sleep some time, and try it again later.
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}// End of showResult()
}

設定文字檔 (範例)

url = http://railway.hinet.net/trw/ctno11.jsp?
wait = 60000
personId = A123456789
fromStation = 004
toStation = 098
getinDate = 040523
orderQty = 1
trainNo = 1059
returnTicket = 0

Leave a Reply

CAPTCHA 驗證圖片
更換一張圖片