From 8767f8623f62aa65f9130d07a1f7deba0e6e1a7e Mon Sep 17 00:00:00 2001 From: victor Date: Tue, 11 Feb 2003 06:03:31 +0000 Subject: train git-svn-id: http://opensvn.csie.org/pttbbs/pttbbs/trunk@654 63ad8ddf-47c3-0310-b6dd-a9e9d9715204 --- pttbbs/mbbsd/page.c | 180 ++++++++++++++++++++++++----------------- pttbbs/util/Makefile | 4 +- pttbbs/util/railway_wrapper.pl | 119 +++++++++++++++++++++++++++ 3 files changed, 229 insertions(+), 74 deletions(-) create mode 100755 pttbbs/util/railway_wrapper.pl diff --git a/pttbbs/mbbsd/page.c b/pttbbs/mbbsd/page.c index 9c01eb6d..e1bcd052 100644 --- a/pttbbs/mbbsd/page.c +++ b/pttbbs/mbbsd/page.c @@ -1,27 +1,26 @@ -/* $Id: page.c,v 1.10 2003/01/19 16:06:06 kcwu Exp $ */ +/* $Id: page.c,v 1.11 2003/02/11 06:03:31 victor Exp $ */ #include "bbs.h" #define hpressanykey(a) {move(22, 0); prints(a); pressanykey();} -static void -filt_railway(char *fpath) -{ - char buf[256], tmppath[32]; - FILE *fp = fopen(fpath, "w"), *tp; +#define TITLE "\033[1;37;45m 火車查詢系統 \033[1;44;33m原作者:Heat\033[m" - snprintf(tmppath, sizeof(tmppath), "%s.railway", fpath); - if (!fp || !(tp = fopen(tmppath, "r"))) // XXX fclose(fp) if tp fail - return; +void +print_station(const char *addr[6][100], int path, int *line, int *num) +{ + int i; + char genbuf[128]; - while (fgets(buf, 255, tp)) { - if (strstr(buf, "INLINE")) - continue; - if (strstr(buf, "LINK")) - break; - fprintf(fp, "%s", buf); - } - fclose(fp); - fclose(tp); - unlink(tmppath); + *num = 0; + move(*line,0); + do{ + for(i=0; i<7 && addr[path - 1][*num]!=NULL; i++){ + sprintf(genbuf, " %2d.%-6s", (*num)+1, addr[path - 1][*num]); + (*num)++; + outs(genbuf); + } + outs("\n"); + (*line)++; + }while(i==7); } int @@ -29,94 +28,131 @@ main_railway() { fileheader_t mhdr; char genbuf[200]; - int from, to, time_go, time_reach; + int from, to, time_go, time_reach, date, path; + int line, station_num; char tt[2], type[2]; char command[256], buf[8]; - char *addr[] = { - "基隆", "八堵", "七堵", "五堵", "汐止", "南港", "松山", "台北", "萬華", - "板橋", "樹林", "山佳", "鶯歌", "桃園", "內壢", "中壢", "埔心", "楊梅", - "湖口", "新豐", "竹北", "新竹", "香山", "崎頂", "竹南", "造橋", "豐富", - "談文", "大山", "後龍", "龍港", "白沙屯", "新埔", "通霄", "苑裡", - "日南", "大甲", "臺中港", "清水", "沙鹿", "龍井", "大肚", "追分", - "苗栗", "南勢", "銅鑼", "三義", "勝興", "泰安", "后里", "豐原", "潭子", - "台中", "烏日", "成功\", "彰化", "花壇", "員林", "永靖", "社頭", - "田中", "二水", "林內", "石榴", "斗六", "斗南", "石龜", "大林", - "民雄", "嘉義", "水上", "南靖", "後壁", "新營", "柳營", "林鳳營", - "隆田", "拔林", "善化", "新市", "永康", "台南", "保安", "中洲", - "大湖", "路竹", "岡山", "橋頭", "楠梓", "左營", "高雄", "鳳山", - "九曲堂", "屏東", NULL, NULL - }; + static const char *addr[6][100] = { + { + "基隆", "八堵", "七堵", "五堵", "汐止", "南港", "松山", "台北", "萬華", + "板橋", "樹林", "山佳", "鶯歌", "桃園", "內壢", "中壢", "埔心", "楊梅", + "湖口", "新豐", "竹北", "新竹", "香山", "崎頂", "竹南", "造橋", "豐富", + "談文", "大山", "後龍", "龍港", "白沙屯", "新埔", "通霄", "苑裡", + "日南", "大甲", "臺中港", "清水", "沙鹿", "龍井", "大肚", "追分", + "苗栗", "南勢", "銅鑼", "三義", "勝興", "泰安", "后里", "豐原", "潭子", + "台中", "烏日", "成功\", "彰化", "花壇", "員林", "永靖", "社頭", + "田中", "二水", "林內", "石榴", "斗六", "斗南", "石龜", "大林", + "民雄", "嘉義", "水上", "南靖", "後壁", "新營", "柳營", "林鳳營", + "隆田", "拔林", "善化", "新市", "永康", "台南", "保安", "中洲", + "大湖", "路竹", "岡山", "橋頭", "楠梓", "左營", "高雄", "鳳山", + "九曲堂", "屏東", NULL + }, + { + "樹林", "板橋", "萬華", "台北", "松山", "南港", "汐止", "基隆", "八堵", + "暖暖", "四腳亭", "瑞芳", "侯硐", "三貂嶺", "牡丹", "雙溪", "貢寮", + "福隆", "石城", "大里", "大溪", "龜山", "外澳", "頭城", "頂埔", "礁溪", + "四城", "宜蘭", "二結", "中里", "羅東", "冬山", "新馬", "蘇澳新站", + "蘇澳", "永樂", "東澳", "南澳", "武塔", "漢本", "和平", "和仁", "崇德", + "新城", "景美", "北埔", "花蓮", "吉安", "志學", "平和", "壽豐", "豐田", + "溪口", "南平", "鳳林", "萬榮", "光復", "大富", "富源", "瑞北", "瑞穗", + "三民", "玉里", "安通", "東里", "東竹", "富里", "池上", "海瑞", "關山", + "月美", "瑞和", "瑞源", "鹿野", "山里", "台東", NULL + }, + { + "高雄", "鳳山", "後庄", "九曲堂", "六塊厝", "屏東", "歸來", "麟洛", + "西勢", "竹田", "潮州", "崁頂", "南州", "鎮安", "林邊", "佳冬", "東海", + "枋寮", "加祿", "內獅", "枋山", "古莊", "大武", "瀧溪", "多良", "金崙", + "太麻里", "知本", "康樂", "台東", NULL + }, + { + "八堵", "暖暖", "四腳亭", "瑞芳", "侯硐", "三貂嶺", "大華", "十分", + "望古", "嶺腳", "平溪", "菁桐", NULL + }, + { + "新竹", "竹中", "上員", "榮華", "竹東", "橫山", "九讚頭", "合興", "南河", + "內灣", NULL + }, + { + "台中", "烏日", "成功\", "彰化", "花壇", "員林", "永靖", "社頭", "田中", + "二水", "源泉", "濁水", "龍泉", "集集", "水里", "車埕", NULL + } + }; setutmpmode(RAIL_WAY); clear(); move(0, 25); - prints("\033[1;37;45m 火車查詢系統 \033[1;44;33m作者:Heat\033[m"); + prints(TITLE); move(1, 0); - outs("\033[1;33m\n" - " 1.基隆 16.中壢 31.龍港 46.銅鑼 61.田中 76.林鳳營 91.高雄\n" - " 2.八堵 17.埔心 32.白沙屯 47.三義 62.二水 77.隆田 92.鳳山\n" - " 3.七堵 18.楊梅 33.新埔 48.勝興 63.林內 78.拔林 93.九曲堂\n" - " 4.五堵 19.湖口 34.通霄 49.泰安 64.石榴 79.善化 94.屏東\n" - " 5.汐止 20.新豐 35.苑裡 50.后里 65.斗六 80.新市\n" - " 6.南港 21.竹北 36.日南 51.豐原 66.斗南 81.永康\n" - " 7.松山 22.新竹 37.大甲 52.潭子 67.石龜 82.台南\n" - " 8.台北 23.香山 38.臺中港 53.台中 68.大林 83.保安\n" - " 9.萬華 24.崎頂 39.清水 54.烏日 69.民雄 84.中洲\n" - "10.板橋 25.竹南 40.沙鹿 55.成功\ 70.嘉義 85.大湖\n" - "11.樹林 26.造橋 41.龍井 56.彰化 71.水上 86.路竹\n" - "12.山佳 27.豐富 42.大肚 57.花壇 72.南靖 87.岡山\n" - "13.鶯歌 28.談文 43.追分 58.員林 73.後壁 88.橋頭\n" - "14.桃園 29.大山 44.苗栗 59.永靖 74.新營 89.楠梓\n" - "15.內壢 30.後龍 45.南勢 60.社頭 75.柳營 90.左營\033[m"); - getdata(17, 0, "\033[1;35m你確定要搜尋嗎?[y/n]:\033[m", buf, 2, LCECHO); + getdata(3, 0, "\033[1;35m你確定要搜尋嗎?[y/n]:\033[m", buf, 2, LCECHO); if (buf[0] != 'y' && buf[0] != 'Y') return 0; + outs("\033[1;33m1.西部幹線(含台中線) 2.東部幹線(含北迴線)\n"); + outs("\033[1;33m3.南迴線 4.平溪線 5.內灣線 6.集集線\n"); while (1) - if (getdata(18, 0, "\033[1;35m請輸入起站(1-94):\033[m", buf, 3, LCECHO) && - (from = atoi(buf)) >= 1 && from <= 94) + if (getdata(7, 0, "\033[1;35m請選擇路線(1-6):\033[m", buf, 2, LCECHO) && + (path = atoi(buf)) >= 1 && path <= 6) break; + + clear(); + move(0, 25); + prints(TITLE); + line = 3; + print_station(addr, path, &line, &station_num); + sprintf(genbuf, "\033[1;35m請輸入起站(1-%d):\033[m", station_num); while (1) - if (getdata(18, 40, "\033[1;35m請輸入目的地(1-94):\033[m", - buf, 3, LCECHO) && - (to = atoi(buf)) >= 1 && to <= 94) - break; + if (getdata(line, 0, genbuf, buf, 3, LCECHO) && (from = atoi(buf)) >= 1 && from <= station_num) + break; + sprintf(genbuf, "\033[1;35m請輸入終站(1-%d):\033[m", station_num); + while (1) + if (getdata(line, 40, genbuf, buf, 3, LCECHO) && (to = atoi(buf)) >= 1 && to <= station_num) + break; + line++; + while (1) - if (getdata(19, 0, "\033[1;35m請輸入時間區段(0-23) 由:\033[m", + if (getdata(line, 0, "\033[1;35m請輸入時間區段(0-23) 由:\033[m", buf, 3, LCECHO) && (time_go = atoi(buf)) >= 0 && time_go <= 23) break; while (1) - if (getdata(19, 40, "\033[1;35m到:\033[m", buf, 3, LCECHO) && + if (getdata(line, 40, "\033[1;35m到:\033[m", buf, 3, LCECHO) && (time_reach = atoi(buf)) >= 0 && time_reach <= 23) break; + line++; + if (path<=3){ while (1) - if (getdata(20, 0, "\033[1;35m想查詢 1:對號快車 2:普通平快\033[m", - type, 2, LCECHO) && (type[0] == '1' || type[0] == '2')) - break; + if (getdata(line, 0, "\033[1;35m想查詢 1:對號快車 2:普通平快\033[m", + type, 2, LCECHO) && (type[0] == '1' || type[0] == '2')) + break; + line++; + } while (1) - if (getdata(21, 0, "\033[1;35m欲查詢 1:出發時間 2:到達時間\033[m", + if (getdata(line, 0, "\033[1;35m欲查詢 1:出發時間 2:到達時間\033[m", tt, sizeof(tt), LCECHO) && (tt[0] == '1' || tt[0] == '2')) break; + line++; + while (1) + if (getdata(line, 0, "\033[1;35m請輸入欲查詢日期(0-29)天後\033[m", + buf, 3, LCECHO) && (date = atoi(buf))>=0 && date<=29) + break; + line++; + sethomepath(genbuf, cuser.userid); stampfile(genbuf, &mhdr); strlcpy(mhdr.owner, "Ptt搜尋器", sizeof(mhdr.owner)); strncpy(mhdr.title, "火車時刻搜尋結果", TTLEN); - snprintf(command, sizeof(command), "echo \"from-station=%s&to-station=%s" - "&from-time=%02d00&to-time=%02d00&tt=%s&type=%s\" | " - "lynx -dump -post_data " - "\"http://www.railway.gov.tw/cgi-bin/timetk.cgi\" > %s.railway", - addr[from - 1], addr[to - 1], time_go, time_reach, + snprintf(command, sizeof(command), "echo \"path=%d from-station=%s to-station=%s" + " from-time=%02d to-time=%02d tt=%s type=%s date=%d\" | /home/bbs/bin/railway_wrapper.pl > %s", + path, addr[path - 1][from - 1], addr[path - 1][to - 1], time_go, time_reach, (tt[0] == '1') ? "start" : "arriv", - (type[0] == '1') ? "fast" : "slow", genbuf); + (type[0] == '1') ? "fast" : "slow", date, genbuf); system(command); - filt_railway(genbuf); sethomedir(genbuf, cuser.userid); if (append_record(genbuf, &mhdr, sizeof(mhdr)) == -1) return -1; - hpressanykey("\033[1;31m我們會把搜尋結果很快就寄給你唷 ^_^\033[m"); + hpressanykey("\033[1;31m我們會把搜尋結果很快地寄給你唷 ^_^\033[m"); return 0; } diff --git a/pttbbs/util/Makefile b/pttbbs/util/Makefile index 8e0479e4..06a4e471 100644 --- a/pttbbs/util/Makefile +++ b/pttbbs/util/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.22 2002/11/08 21:16:25 in2 Exp $ +# $Id: Makefile,v 1.23 2003/02/11 06:03:31 victor Exp $ BBSHOME?=$(HOME) OSTYPE!=uname @@ -35,7 +35,7 @@ CPROGS= bbsmail BM_money post account birth deluserfile expire mandex\ PROGS= $(CPROGS) BM_money.sh backpasswd.sh mailog.sh opendice.sh\ openticket.sh stock.sh topsong.sh weather.sh stock.perl weather.perl\ toplazyBM.sh toplazyBBM.sh dailybackup.pl tarqueue.pl waterball.pl \ - filtermail.pl getbackup.pl udnnews.pl rebuildaloha.pl + filtermail.pl getbackup.pl udnnews.pl rebuildaloha.pl railway_wrapper.pl all: $(PROGS) diff --git a/pttbbs/util/railway_wrapper.pl b/pttbbs/util/railway_wrapper.pl new file mode 100755 index 00000000..b6885173 --- /dev/null +++ b/pttbbs/util/railway_wrapper.pl @@ -0,0 +1,119 @@ +#!/usr/bin/perl +# +# 您可以使用這個檔案應付鐵路局網址的異動 +# 或是以擅於字串處理的 perl 修正以下程式碼 :) +# +#VictorHsieh 2003.02.11 + +use lib '/home/bbs/bin'; +use LocalVars; +use vars qw/ %opt %station_num @arg $command $addr/; +use strict; + +$addr = "http://passenger.tra.gov.tw/ap/index.asp"; + +@arg = split ' ', ; +map { /(.+)=(.+)/ and $opt{$1} = $2 } grep /.+=.+/, @arg; + +station_init(); +translate(); + +$command = "MIval=Train_Time&encode=Big5&action=on"; +map { $command .= "&$_=$opt{$_}"} keys %opt; +exec "$LYNX -dump -assume_charset=big5 -nolist \"$addr?$command\""; + +# 將 page.c 中的格式轉為鐵路局所使用的格式 +sub translate{ + change_opt('from-station', 'Station1'); + change_opt('to-station', 'Station2'); + change_opt('from-time', 'From_Time'); + change_opt('to-time', 'To_Time'); + change_opt('type', 'Type'); + change_opt('tt', 'Time'); + change_opt('date','Departure_Date'); + change_opt('path', 'line'); +} + +# 轉換參數的表示法 +sub change_opt{ + my ($old, $new) = @_; + if(defined $opt{$old}){ + if( $old =~ /station/ ){ + $opt{$old} = $station_num{$opt{$old}}; + } + elsif( $old =~ /type/ ){ + $opt{$old} = ($opt{$old} eq 'fast')? 'F' : 'S'; + } + elsif( $old =~ /tt/ ){ + $opt{$old} = ($opt{$old} eq 'start')? 'D' : 'A'; + } + elsif( $old =~ /date/ ){ + my ($sec, $min, $hour, $mday, $mon, $year) = gmtime; + $mday = $mday + $opt{$old}; + $mon++; + $opt{$old} = join '/', + ($year+1900, + ($mon>9)? $mon : "0$mon", + ($mday>9)? $mday : "0$mday"); + } + elsif( $old =~ /path/ ){ + my @line = qw/ mainwest maineast mainsouth pin innerbay gg/; + $opt{$old} = $line[$opt{$old}-1]; + } + + $opt{$new} = $opt{$old} and delete $opt{$old}; + } +} + +# 各站代碼對應 +sub station_init{ + %station_num = ( + "基隆" => 1001, "八堵" => 1002, "七堵" => 1003, "五堵" => 1004, + "汐止" => 1005, "南港" => 1006, "松山" => 1007, "台北" => 1008, + "萬華" => 1009, "板橋" => 1011, "樹林" => 1012, "山佳" => 1013, + "鶯歌" => 1014, "桃園" => 1015, "內壢" => 1016, "中壢" => 1017, + "埔心" => 1018, "楊梅" => 1019, "富岡" => 1020, "湖口" => 1021, + "新豐" => 1022, "竹北" => 1023, "新竹" => 1025, "香山" => 1026, + "崎頂" => 1027, "竹南" => 1028, "談文" => 1102, "大山" => 1104, + "後龍" => 1105, "龍港" => 1106, "白沙屯" => 1107, "新埔" => 1108, + "通霄" => 1109, "苑裡" => 1110, "日南" => 1111, "大甲" => 1112, + "臺中港" => 1113, "清水" => 1114, "沙鹿" => 1115, "龍井" => 1116, + "大肚" => 1117, "追分" => 1118, "彰化" => 1120, "花壇" => 1202, + "員林" => 1203, "永靖" => 1204, "社頭" => 1205, "田中" => 1206, + "二水" => 1207, "林內" => 1208, "石榴" => 1209, "斗六" => 1210, + "斗南" => 1211, "石龜" => 1212, "大林" => 1213, "民雄" => 1214, + "嘉義" => 1215, "水上" => 1217, "南靖" => 1218, "後壁" => 1219, + "新營" => 1220, "柳營" => 1221, "林鳳營" => 1222, "隆田" => 1223, + "拔林" => 1224, "善化" => 1225, "新市" => 1226, "永康" => 1227, + "台南" => 1228, "保安" => 1229, "中洲" => 1230, "大湖" => 1231, + "路竹" => 1232, "岡山" => 1233, "橋頭" => 1234, "楠梓" => 1235, + "左營" => 1236, "高雄" => 1238, "大橋" => 1239, "造橋" => 1302, + "豐富" => 1304, "苗栗" => 1305, "南勢" => 1307, "銅鑼" => 1308, + "三義" => 1310, "泰安" => 1314, "后里" => 1315, "豐原" => 1317, + "潭子" => 1318, "台中" => 1319, "烏日" => 1320, "成功\" => 1321, + "大慶" => 1322, "太原" => 1323, "鳳山" => 1402, "後庄" => 1403, + "九曲堂" => 1404, "六塊厝" => 1405, "屏東" => 1406, "吉安" => 1602, + "志學" => 1604, "平和" => 1605, "壽豐" => 1606, "豐田" => 1607, + "溪口" => 1608, "南平" => 1609, "鳳林" => 1610, "萬榮" => 1611, + "光復" => 1612, "大富" => 1613, "富源" => 1614, "瑞北" => 1615, + "瑞穗" => 1616, "三民" => 1617, "玉里" => 1619, "安通" => 1620, + "東里" => 1621, "東竹" => 1622, "富里" => 1623, "池上" => 1624, + "海瑞" => 1625, "關山" => 1626, "月美" => 1627, "瑞和" => 1628, + "瑞源" => 1629, "鹿野" => 1630, "山里" => 1631, "台東" => 1632, + "永樂" => 1703, "東澳" => 1704, "南澳" => 1705, "武塔" => 1706, + "漢本" => 1708, "和平" => 1709, "和仁" => 1710, "崇德" => 1711, + "新城" => 1712, "景美" => 1713, "北埔" => 1714, "花蓮" => 1715, + "暖暖" => 1802, "四腳亭" => 1803, "瑞芳" => 1804, "侯硐" => 1805, + "三貂嶺" => 1806, "牡丹" => 1807, "雙溪" => 1808, "貢寮" => 1809, + "福隆" => 1810, "石城" => 1811, "大里" => 1812, "大溪" => 1813, + "龜山" => 1814, "外澳" => 1815, "頭城" => 1816, "頂埔" => 1817, + "礁溪" => 1818, "四城" => 1819, "宜蘭" => 1820, "二結" => 1821, + "中里" => 1822, "羅東" => 1823, "冬山" => 1824, "新馬" => 1825, + "蘇澳新站" => 1826, "蘇澳" => 1827, "大華" => 1903, "十分" => 1904, + "望古" => 1905, "嶺腳" => 1906, "平溪" => 1907, "菁桐 " => 1908, + "竹中" => 2203, "上員" => 2204, "竹東" => 2205, "橫山" => 2206, + "九讚頭" => 2207, "合興" => 2208, "南河" => 2209, "內灣" => 2210, + "榮華" => 2211, "源泉" => 2702, "濁水" => 2703, "龍泉" => 2704, + "集集" => 2705, "水里" => 2706, "車埕" => 2707, + ); +} -- cgit v1.2.3