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


