2ã¡ããããBOTã®ä½ãæ¹ å®è£ ç·¨2
2ちゃんねるBOTの作り方 準備編 - GIOの日記
2ちゃんねるBOTの作り方 設計編 - GIOの日記
2ちゃんねるBOTの作り方 実装編1 - GIOの日記
åããã¡ã¤ã«ããã¦ã³ãã¼ãããªãããã«ããã
ãã®æ©è½ã¯å®è£
æ¹æ³ã«æ©ã
1.DATãååèªã¿è¾¼ãã åã ãã·ã¼ã¯ããã¦ãæ®ãããç»åãæ¢ã
2.ãã¦ã³ãã¼ãããç»åURLãDBã«ããã¨ã
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ãã¿ã¹ã¯ã¹ã±ã¸ã¥ã¼ã©ï¼ã§å®æçã«åãããªãã好ããªããã«ã
æ¬æ°ã§åãããªã
ä»åã¯åãããããããçºã«ã·ã³ãã«ã«å®è£ ãã¾ããããæ¬æ°ã§ä½¿ããªãã°
- ãã£ããä¾å¤å¦çããã
- è¨èªå¤ããããThread使ã£ãããã¦é«éå
- ãã¦ã³ãã¼ããããã¡ã¤ã«ããã§ãã¯(ããã¼å¤æ°)
- è¤æ°åæã«ãã¦ã³ãã¼ãããå ´åãç¸æã«è¿·æããããªãã
çã®å¯¾å¿ãå¿
è¦ã§ãã
æå¾ã«
ã¨ãããã¨ã§ã³ã¬ã¯ã¿ã¼ã¯ãªãªã¸ãã«ç»åããã¦ã³ãã¼ããããè¯ãã¨æãã¾ããã
è¦ãã ããªã2ch画像まとめããªã¹ã¹ã¡
2chã¯ç»å以å¤ã«ãã¢ããªãã®ãå¤æ°ããã®ã§ãé¢ç½ããã®ãã¾ã ã¾ã ä½ãããã§ãã
2ã¡ããããBOTã®ä½ãæ¹ å®