Hatena::Diary

GIOの日記 RSSフィード

2009-02-20

[]2ちゃんねるBOTの作り方 実装編2

2ちゃんねるBOTの作り方 準備編 - GIOの日記

2ちゃんねるBOTの作り方 設計編 - GIOの日記

2ちゃんねるBOTの作り方 実装編1 - GIOの日記


同じファイルダウンロードしないようにしよう

この機能は実装方法に悩む

1.DATを前回読み込んだ分だけシークさせて、残りから画像を探す

2.ダウンロードした画像URLDBにいれとく

3.前回ダウンロードした枚数回はダウンロードしない

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画像まとめオススメ

2ch画像以外にもアホなものが多数あるので、面白いものがまだまだ作れそうです。


2ちゃんねるBOTの作り方 完

なまえなまえ 2009/04/26 19:04 こんにちは。2ch画像まとめのリンクから飛んできました。
こちらのスクリプトの記事を拝見させて頂き、対象の板を変更して
稼動させてみました。(ここまではうまくできました)

が、巡回対象の板は変更できましたが、その中の特定スレッドに
巡回対象を限定する事はできませんでしょうか?

スクリプトの中の"Class Board">"ded get_threads"に鍵があるのだろうと当たりをつけてみましたが、どうもうまくいきません。

大変お忙しいとは思いますが、お手すきの際にでもよろしければご教授頂ければと思います。

よろしくお願いします。

なまえなまえ 2009/04/26 19:05 こんにちは。2ch画像まとめのリンクから飛んできました。
こちらのスクリプトの記事を拝見させて頂き、対象の板を変更して
稼動させてみました。(ここまではうまくできました)

が、巡回対象の板は変更できましたが、その中の特定スレッドに
巡回対象を限定する事はできませんでしょうか?

スクリプトの中の"Class Board">"ded get_threads"に鍵があるのだろうと当たりをつけてみましたが、どうもうまくいきません。

大変お忙しいとは思いますが、お手すきの際にでもよろしければご教授頂ければと思います。

よろしくお願いします。

なまえなまえ 2009/04/26 19:05 すいません。2重書き込みになってしましましたm(_ _)m

giogio 2009/05/01 22:35 予想通り、get_threadsを少々変更すれば動くかと思いますよ。
threadsを作ってる部分で、フィルタをかければ良いですね。
例えば、「画像」という文字が入ってる場合はthreadsに追加しないみたいな感じで。

なまえなまえ 2009/05/12 18:24 なるほど!ありがとうございました。
プログラムは全くの素人ですが、アタリが間違ってなくてよかったですw
勉強兼ねて色々チャレンジしてみます。
ありがとうございました!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証