# Yahooから番組表をダウンロードして、連結する # Kawauchi.k 2001/1/19 # このファイルはEUCでセーブしないと動きません =begin AREAに下記の値を設定して、読む地域を指定する hokk 北海道 aomori 青森 iwate 岩手 miya 宮城 akita 秋田 yamagata 山形 fuku 福井 niigata 新潟 nagano 長野 toyama 富山 ishikawa 石川 fukui 福井 tokyo 東京 kanagawa 神奈川 saitama 埼玉 chiba 千葉 ibaraki 茨城 tochigi 栃木 gunma 群馬 yamanasi 山梨 aichi 愛知 gifu 岐阜 mie 三重 sizu 静岡 siga 滋賀 kyoto 京都 osaka 大阪 hyougo 兵庫 nara 奈良 wakayama 和歌山 tottori 鳥取 shimane 島根 okayama 岡山 hirosima 広島 yamagchi 山口 tokusima 徳島 kagawa 神奈川 ehime 愛媛 kouchi 高知 fukuoka 福岡 saga 佐賀 nagasaki 長崎 kumamoto 熊本 oita 大分 miyazaki 宮崎 kagosima 鹿児島 nawa 沖縄 =end require 'net/http' AREA = 'tokyo' # ダウンロードする地域 DAYS_NUM = 3 # ダウンロードする日数 SRC_PAGE = 'Yahoo vhf' #SRC_PAGE = 'Yahoo uhf' #BSのデータを取得したいときはこちらを有効に OUT_FILE = 'tv.html' # 出力ファイル # # アドレスを サーバー、ポート、パスに分割する # def url_split(url) /^http:\/\/([^\/]*)(\/?.*)/ =~ url server = $1 path = $2 if server.index(':') then server, port = server.split(':') end port = '80' if port == nil port = port.to_i return server, port, path end # # Webからデータを取得 # def webget(url) server, port, path = url_split(url) http = Net::HTTP.new( server, port ) response = http.get2(path) response.body end # # テーブルの中身を取り出す # def table_trim(html) /(.*?)<\/TABLE>/m =~ html /.*?<\/TR>(.*)/m =~ $1 return $1 end # # 表のヘッダーを取り出す # def header_trim(html) /
(.*?)<\/TABLE>/m =~ html /(.*?<\/TR>)/m =~ $1 return $1 end # # 表のフッターを取り出す # def footer_trim(html) /(
.*?<\/TABLE>)/m =~ html return $1 end # # 表中に使われているグラフィックのアイコンをテキストに置換する # def mark_chenge(html) html.gsub!(//im) {|s| /\/([^\/]*?)\.gif/i =~ s case $1 when 'n' # ニュース '[N]' when 'w' # 天気 '[天]' when 'shin' # 新番組 '[新]' when 'shu' # 最終回 '[終]' when 'sai' # 再放送 '[再]' when 'stereo' # ステレオ '[S]' when 'bmode' # Bモード '[B]' when '2' # 二ヶ国語放送 '[2]' when 'taju' # 音声多重 '[多]' when 'noscr' # ノンスクランブル '[ノ]' when 'wide' # ワイドビジョン '[W]' when 'clear' # クリアビジョン '[C]' when 'mono' # 白黒放送 '[白黒]' when 'moji' # 文字多重放送 '[字]' when 'shuwa' # 手話放送 '[手]' else s end } return html end # # 番組表のアドレスを作る # def make_uri(area, tm) if SRC_PAGE == 'Yahoo uhf' then file_name = tm.strftime('%Y%m%d%H') + '.html' 'http://tv.yahoo.co.jp/tvguide/uhf_bs/' + area + '/table/' + file_name else file_name = tm.strftime('%Y%m%d%H') + '.html' 'http://tv.yahoo.co.jp/tvguide/vhf/' + area + '/table/' + file_name end end # # # def get_wday(tm) wday = ['日','月','火','水','木','金','土'][tm.wday] end # # データが取得できたか? # def is_valid(s) s.index('(not found)') == nil end # # main # sec,min,hour,day,month,year = Time.now.to_a tm = Time.local(year,month,day) hour_step = [4,7,10,13,16,19,21,23,25] html = "ty guide\n" # インデックス cur_tm = tm DAYS_NUM.times do |id_count| link_str = cur_tm.strftime('%Y/%m/%d') html << sprintf("%s(%s)\n", id_count, link_str, get_wday(cur_tm)) hour_step.each do |hour| html << sprintf("%d時\n", id_count, hour, hour ) end html << "
\n" cur_tm += 24 * 60 * 60 end # 番組表 table_header = '' table_footer = '' DAYS_NUM.times do |id_count| table = '' hour_step.each do |hour| cur_tm = (tm + (hour*60*60)) # 時間数を秒単位で加算 src_page = webget(make_uri(AREA, cur_tm)) if not is_valid(src_page) then table = "
\n" break end if table_header == '' then table_header = header_trim(src_page) table_footer = footer_trim(src_page) end src_page.gsub!('',sprintf("", id_count, hour)) table << table_trim(src_page) end wday = get_wday(tm) html << sprintf("

%d/%d/%d(%s)

\n", id_count, tm.year,tm.month,tm.day,wday) html << "
データがありません
\n" html << table_header html << table html << "
\n" tm += 24 * 60 * 60 # 一日進める end html << "
\n" html << table_footer out = open(OUT_FILE,"w") out.print mark_chenge(html) out.close