美人時計の全画像を取得するスクリプトをバッチ化してみた

2009年11月20日

Filed under: Ruby,美人時計 — admin @ 11:18 AM

最近流行り(?)の美人時計。Web業界の人間ならだいたいの人は知っているんじゃないでしょうかね。1分置きに女の子が変わるというこのサービス。女の子が変わるまでずーっと24時間も待っていられないので、全画像を取得するスクリプトをつくってしまいたくなりました。

とりあえず誰かすでにつくってるんじゃないだろうかと思い、google先生にきいてみました。

案の定すぐみつかりましたよ!素敵スクリプトをつくっている方が!

▽こちら
Yamashiro0217の日記

Rubyで組まれているようです。僕はPHP派なので、Rubyまったくわかりませんが、この際Rubyに入門してしまおう!ってことで、Yamashiro0217さんのスクリプトを参考にスクリプトをつくってみようと思います。

まずはRubyスクリプトの動作確認
Yamashiro0217さんのスクリプトをコピペで動かしてみます。

▽開発環境
Fedora10のインストールされたLinuxサーバ。
Rubyはすでにインストール済み。

▽美人時計の全画像取得スクリプト
bijin.ruby

RUBY:
  1. require 'net/http'
  2. require 'uri'
  3.  
  4. error_files = ""
  5. 0..24.times do |hour|
  6.    0..60.times do |minute|
  7.       now_hour = sprintf("%0#{2}d", hour)
  8.       now_minute = sprintf("%0#{2}d", minute)
  9.       sleep 1
  10.       begin
  11.          Net::HTTP.start("bijint.com", 80) do |http|
  12.          response = http.get(
  13.             "/jp/img/clk/#{now_hour}#{now_minute}.jpg",
  14.             {"Referer" => "http://bijint.com/jp/" }
  15.          )
  16.          open( "#{now_hour}#{now_minute}.jpg", "wb" ) do |file|
  17.              file.puts response.body
  18.          end
  19.       end
  20.       rescue
  21.          p "#{now_hour}#{now_minute}.jpg can not get"
  22.          error_files += "http://bijint.com/jp/img/clk/#{now_hour}#{now_minute}.jpg\n"
  23.       end
  24.    end
  25. end

▽コマンドから実行

CODE:
  1. [ooiwa@eva bijin_tokei]$ ruby bijin.ruby

おぉー!画像がどんどん落ちてきたよー!これは感動!とりあえず動作確認はOKと。

ただこの美人時計、落とした画像ファイルと、本番サイトの美人時計側で女の子の表示が違うときがあります。どうやら日々ちょこちょこ女の子が更新されているようです。これはなんということ!全女の子コンプリートするには定期的にチェックするしかないじゃないか!ということで、この際毎日取得してしまうスクリプトを組んでみようと思います。

それではバッチをつくっていきます。
定期的に1日毎に決まった時間に全画像を取得して、なおかつ日付ごとにディレクトリを分けて保存する、バッチをまわすのはCron、スクリプト言語はRubyをつかってつくっていきます。

まず、Yamashiro0217さんのスクリプトをこのまま使うと、スクリプトと同じパスに画像をそのままダウンロードしてきますので、日付毎にディレクトリを切ってくれる関数を用意します。
今回はわかりやすいようにスクリプトを起動した日の日付を取得して"yyyymmdd"形式で文字列を返す関数と、ディレクトリを生成する関数を用意します。

▽今日の日付をyyyymmdd型の文字列に変換する関数

RUBY:
  1. def getTimeNow()
  2.     day = Time.now
  3.     putMonth = day.month.to_s
  4.     putDay = day.day.to_s
  5.  
  6.     if day.month <10 && day.day <10
  7.         putMonth = '0' + day.month.to_s
  8.         putDay = '0' + day.day.to_s
  9.     elsif day.month <10
  10.         putMonth = '0' + day.month.to_s
  11.     elsif day.day <10
  12.         putDay = '0' + day.day.to_s
  13.     end
  14.  
  15.     nowTime = day.year.to_s + putMonth + putDay
  16.     return nowTime
  17. end

▽ディレクトリの生成

RUBY:
  1. def mkdir(path)
  2.     if Dir::mkdir( path, 0777 )
  3.         return true
  4.     else
  5.         return false
  6.     end
  7. end

あとは、Yamashiro0217さんのスクリプトにディレクトリパスを突っ込んで、一通り完成させる。今回Cronでバッチ処理させるため、ディレクトリパスは絶対パスで書く。

▽スクリプトをまとめたのがこれ
bijin.ruby

RUBY:
  1. #――――――――――――――――――――――――――――――
  2. #  美人時計の画像を全取得するスクリプト
  3. #
  4. #------------------------------------------------------------
  5. #  ライブラリのインポート
  6. #
  7. require 'net/http'
  8. require 'uri'
  9.  
  10. #------------------------------------------------------------
  11. #  Global var
  12. #
  13. $scriptPath = 'bijin_tokei/'
  14.  
  15. p $scriptPath
  16.  
  17. #------------------------------------------------------------
  18. #  今日の日付をyyyymmdd型の文字列に変換する関数
  19. #
  20. def getTimeNow()
  21.     day = Time.now
  22.     putMonth = day.month.to_s
  23.     putDay = day.day.to_s
  24.     if day.month <10 && day.day <10
  25.         putMonth = '0' + day.month.to_s
  26.         putDay = '0' + day.day.to_s
  27.     elsif day.month <10
  28.         putMonth = '0' + day.month.to_s
  29.     elsif day.day <10
  30.         putDay = '0' + day.day.to_s
  31.     end
  32.     nowTime = day.year.to_s + putMonth + putDay
  33.     return nowTime
  34. end
  35.  
  36. p getTimeNow()
  37.  
  38.  
  39. #------------------------------------------------------------
  40. #  ディレクトリの生成
  41. #
  42. def mkdir(path)
  43.     if Dir::mkdir( path, 0777 )
  44.         return true
  45.     else
  46.         return false
  47.     end
  48. end
  49.  
  50.  
  51. #------------------------------------------------------------
  52. #  美人時計から画像を取得
  53. #
  54. def getBijin()
  55.     error_files = ""
  56.     0..24.times do |hour|
  57.        0..60.times do |minute|
  58.           now_hour = sprintf("%0#{2}d", hour)
  59.           now_minute = sprintf("%0#{2}d", minute)
  60.           sleep 1
  61.           begin
  62.              Net::HTTP.start("bijint.com", 80) do |http|
  63.              response = http.get("/jp/img/clk/#{now_hour}#{now_minute}.jpg",
  64.                                  {"Referer" => "http://bijint.com/jp/" })
  65.              open( $scriptPath + getTimeNow() + "/#{now_hour}#{now_minute}.jpg", "wb" ) do |file|
  66.                  file.puts response.body
  67.              end
  68.           end
  69.           rescue
  70.              p "#{now_hour}#{now_minute}.jpg can not get"
  71.              error_files += "http://bijint.com/jp/img/clk/#{now_hour}#{now_minute}.jpg\n"
  72.           end
  73.        end
  74.     end
  75. end
  76.  
  77.  
  78.  
  79. #------------------------------------------------------------
  80. #  初期実行関数
  81. #
  82. def init()
  83.     targetDir = $scriptPath + getTimeNow()
  84.     if File.exists?( targetDir )
  85.         getBijin()
  86.     else
  87.         if mkdir( targetDir )
  88.             p 'make!'
  89.             getBijin()
  90.         end
  91.     end
  92. end
  93. init()

Rubyは変数の定義がグローバルとローカルでスコープがわかりやすいから良いですね!なんかPHPより全然カンタンだし、オブジェクト指向言語だし、個人的にはだいぶ気に入りました。

完成したスクリプトを早速実行してみます。

CODE:
  1. [ooiwa@eva bijin_tokei]$ ruby /home/ooiwa/tmp_ruby/bijin_tokei/bijin.ruby
  2. [ooiwa@eva bijin_tokei]$ ls
  3. 20091120  bijin.ruby
  4. [ooiwa@eva bijin_tokei]$ ls 20091120/
  5. 0000.jpg 0001.jpg 0002.jpg

うまく動いていれば、本日の日付ディレクトリが生成され、そのディレクトリの中に画像をどんどんたまっていっているのがわかります。

最後はこの完成したスクリプトをCronでまわす処理をします。

CODE:
  1. [ooiwa@eva bijin_tokei]$ crontab -e
  2. #毎日10:00に bijin.ruby スクリプトを実行
  3. 0 10 * * * ruby /home/ooiwa/tmp_ruby/bijin_tokei/bijin.ruby

あとは毎日10時になるとCronがRubyスクリプトを実行してくれます。
これであとは目視で比較するか、md5で比較するツールでもつくって差分を分けるスクリプトを足すかでもすればどの女の子が削除されて追加されたかがわかりますね。

美人時計、面白いです。

コメントはまだありません »

コメントはまだありません。

この投稿へのコメントの RSS フィード。

コメントする