2009/1/3 土曜日

ldr の画像を先読みでキャッシュしたりリスト保存したり

Filed under: アドエス,未分類 — staki @ 20:19:41

前に作った奴をちっと弄っただけ。前のだと毎回全未読フィードの内容をチェックしててものすごく遅かったので、前回取得データから更新日付が違う物だけ拾うように変更した。

ついでに、一回のURL群が小さくなる事で、外部の賢いダウンローダを使わなくても良さげになったので、自前で画像を読む(保存はしない。プロキシキャッシュに入れたいだけ)機能も付けた。引数に何でも良いので文字列をつけるとそっちの動作になる。

そんな感じで、こまめに回すのに適した感じになったのでシェルから

while true; do ruby LdrImgScrap.rb hoge ; sleep 120 ; done 

とかしながら読むと、殆どがキャッシュに入ってサクサク読めてよろしい。(不在時は sleep を広げましょう)

キャッシュするプロキシは polipo よりも gethtmlw の更新チェック無し設定が一番早い感じ。どう頑張っても再取得してしまうサーバーが居るみたいなので。しかもそう言う所に限って馬鹿みたいにデータがでかくて枚数が多いとか。

あ、更新チェック無し設定する場合は、reader.livedoor.com は当然プロキシ除外で。

キャッシュ以外にもコイツのファイルを ircom で irvine さんにどんどん渡したり wget して特定フォルダに保存&古いのを削除みたいなレシピにして、gds についてるデスクトップ写真立てみたいな奴のターゲットフォルダにして置いたりすると、常にデスクトップに知らん画像がホイホイ出てきたりして面白かったりするかも。

require "net/http"
require "zlib"
require "simple-json"
require "stringio"
require "open-uri"

username = "****" # 変えろ
password = "****" # 変えれ

PROXY_ADDR = nil # 必要なら
PROXY_PORT = nil # 必要なら

CACHE_PROXY_URI = "http://localhost:8080" # 不要なら nil

login_parm= "livedoor_id=" + username + "&password=" + password #URI.encode必要?
$apikey = nil
$cookie = {}
$header =  {
  'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language' => 'ja,en-us;q=0.7,en;q=0.3',
  'Accept-Charset' => 'Shift_JIS,utf-8;q=0.7,*;q=0.7',
  "User-Agent" => 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2;.NET CLR 1.1.4322)',
  "Accept-Encoding" => 'gzip,deflate',
  "Content-Type" => "application/x-www-form-urlencoded; charset=UTF-8"
}

def httppost(path, param=nil,server="reader.livedoor.com")
  Net::HTTP.start(server, 80, PROXY_ADDR, PROXY_PORT) {|http|
    param = ["ApiKey=" + $apikey, param].compact.join('&') if $apikey
    resp = http.post(path, param, $header)

    if resp.key?('Set-Cookie')
      resp.get_fields('Set-Cookie').each { |str|
        k,v = str[0...str.index(';')].split('=')
        $cookie.store(k,v)
      }
      $apikey = $cookie['reader_sid']
      $header.merge!({"Cookie" => ($cookie.to_a.map{|value|value.join("=")}).join("; ") })
    end

    return  Zlib::GzipReader.wrap(StringIO.new(resp.body)){|z|z.read}
  }
end

httppost("/login/index", login_parm, "member.livedoor.com" )#login
httppost("/reader/") #apikey 取得

sids = {}
subs = JsonParser.new.parse(httppost("/api/subs?unread=1&from_id=&limit="))

# 古いファイルと比較し新しい物のみ subscribe_id を取得
if File.exist?("subs.dump")
  old = open("subs.dump"){|f|Marshal.load f}
  subs.each do |item|
    exist = false
    old.each do |old_item|
      if item['subscribe_id'] == old_item['subscribe_id']
        exist = true
        if item['modified_on'] != old_item['modified_on']
          sids[item['subscribe_id']] = item['title']
        end
        break
      end
    end
    unless exist
      puts "a"
      sids[item['subscribe_id']] = item['title']
    end
  end
else
  subs.each do |item|
    sids[item['subscribe_id']] = item['title']
  end
end

sids.each do |sid,title|
  begin
    feed = JsonParser.new.parse(httppost("/api/unread", "subscribe_id=" + sid.to_s))
    feed['items'].each do |item|
      puts 'blog:' + title + "---" + item['title']
      File.open("img.list","a+b"){|f|
        URI.extract(item['body']).each do |i|
          if i =~ /(jpg|jpeg|png|gif)$/i
            if ARGV.size > 0
              puts "download:" + i
              begin
                open(i, {"Referer" => item['link'],
                       :proxy => CACHE_PROXY_URI}){|io|io.read}
              rescue Timeout::Error
                puts "NG:" + i
              end
            else
              f.print( i + "\n")
            end
          end
        end
      }
    end
  rescue
  end
end

open("subs.dump", "w+b"){|f|f.print Marshal.dump(subs)}

Powered by WordPress

stakilog