台鐵自動訂票程式 (轉載資料)
來源網址 : 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