2009-02-20
■[Ruby]2ちゃんねるBOTの作り方 実装編2
同じファイルをダウンロードしないようにしよう
この機能は実装方法に悩む
1.DATを前回読み込んだ分だけシークさせて、残りから画像を探す
2は無いとして、1がベストだと思うが、一番最初に思いついた3を実装します。
Appクラスを変更。yaml/storeでDAT番号をキーに枚数を永続化
class App def execute(board) root_dir = File.dirname(__FILE__) image_dir = "#{root_dir}/images" # db = YAML::Store.new("#{root_dir}/log/thread.db") menu = Menu.new board = menu.get_board(board) threads = board.get_threads puts "total: #{threads.length} threads" threads.each do |thread| images = thread.get_images rescue next next if images.empty? parent_dir = "#{image_dir}/#{thread.dat_no}" Dir.mkdir(parent_dir) unless File.exists?(parent_dir) puts "#{thread.title}: #{images.length} pics" # downloaded = db.transaction { db[thread.dat_no] } || 0 images.each_with_index do |image, index| # next if index < downloaded image.download("#{parent_dir}/#{index}.jpg") rescue next end # db.transaction { db[thread.dat_no] = images.length } end end end
イメぴたに対応してみよう
イメぴたは普通のアップローダーと違い画像の直リンクではないので、別に対応が必要です。イメぴたのURLはこんなの
http://imepita.jp/20090219/832920
そして
http://imepita.jp/image/20090219/832920
に接続すると画像ファイルにリダイレクトされるようになってます。ただし、適切にRefererを設定しないとリダイレクトされません。
ということで実装します。ついでに共通化。DRY!
class Downloader attr_accessor :uri, :url def initialize(url) @url = url @uri = URI.parse(@url) end def save(res, saveTo) puts "download: #{url}" case res when Net::HTTPSuccess open(saveTo, 'wb') do |f| f.write res.body end end end end class NormalImageDownloader < Downloader def download(saveTo) http = Net::HTTP.new(uri.host, 80) res = http.get(uri.path) save(res, saveTo) end def self.match(url) url =~ /.jpg$/i end end class ImepitaDownloader < Downloader def download(saveTo) http = Net::HTTP.new(uri.host, 80) headers = {'Referer' => url} res = http.get("/image#{uri.path}", headers) save(res, saveTo) end def self.match(url) url =~ /\/\/imepita.jp\/\d+\/\d+/i end end
動かす
ruby bot2ch.rb
ちなみに完走させてみたら、1500枚くらいダウンロードされた。ひどすぎる。
あとは手動で実行するなり、デーモン化してループさせるなり、cronやタスクスケジューラ?で定期的に動かすなりお好きなように。
本気で動かすなら
今回は分かりやすくする為にシンプルに実装しましたが、本気で使うならば
等の対応が必要です。
最後に
ということでコレクターはオリジナル画像をダウンロードしたら良いと思いますよ。
2chは画像以外にもアホなものが多数あるので、面白いものがまだまだ作れそうです。
トラックバック - http://d.hatena.ne.jp/gioext/20090220/1235056274
リンク元
- 171 http://homepage1.nifty.com/maname/
- 140 http://homepage1.nifty.com/maname/index.html
- 62 http://gxc.google.com/gwt/n?u=http://pic2ch.giox.org/thread/4829&hl=ja&mrestrict=xhtmlchtml&inlang=ja&client=ms-kddi-jp
- 42 http://pic2ch.giox.org/
- 34 http://reader.livedoor.com/reader/
- 29 http://www.google.co.jp/search?q=2ch画像まとめ&lr=lang_ja&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ja:official&client=firefox-a
- 29 http://z.ula.cc/d.hatena.ne.jp/gioext/20090220/1235056274
- 26 http://www.google.co.jp/search?hl=ja&q=2ch画像まとめ&meta=lr=&aq=f
- 20 http://www.unoh.net/infoc.html
- 16 http://pic2ch.giox.org/thread/5276


