まめ畑

ゆるゆると書いていきます

ニコニコ静画のお気に入りお題をRSSで観測するスクリプト書いた

ニコニコ静画のAPIを少し調べてみた - まめ畑でニコニコ静画のAPIの事を書いたのですが、このAPIを使用してお気に入りのお題をRSSで観測するためのスクリプトを書いてみました。croneなどで定期的に実行しておくといいと思うのですが、画像リストの取得の際にログインを行うため、他の場所でログインしている場合は、そちらがログアウトされてしまうので注意です。(画像の閲覧にはログインは必要ありません)
SSLを使用するので証明書が必要です、エクスポートの仕方はRubyでSSLはややっこしい - まめ畑を参照して、「nico.cer」という名前で保存して下さい。
簡単に実装したので、お好きに改造などして使用して下さい(取得漏れなどあるかも知れません・・・)


設定ファイル(nicoVideo.yaml / UTF-8で保存して下さい)

user:
 id: ID
 pass: PASS
seiga_id:
 - id: 1088
   title: 何故保存したのかわからない画像
 - id: 1134
   title: AxisPowersヘタリア
 - id: 
   title: 

こちらのファイルにログイン情報と、RSS化するお題のタイトルとIDを書いていきます(全て必須項目です)
タイトルは何でもかまいませんが、idは「sg966」などのsgを除いた数字です。


スクリプト(seiga_rss.rb)

# -*- coding: utf-8 -*-

require "net/http"
require "net/https"
require "yaml"
require "rexml/document"
require "rubygems"
require "rss"

$KCODE = "UTF8"


UA = "Seiga Rss Ver0.1 (Created by con_mame)"
LIST_XML_URL = "seiga.nicovideo.jp"
LIST_XML_PATH = "/api/theme/res/list?theme_id="
IMAGE_URL = "http://lohas.nicoseiga.jp/img/#ID#l"
RSS_FILE = "./seiga.xml"    #RSSファイル名
Net::HTTP.version_1_2

def init
    @rss_data = {}
    settings = YAML::load(File.open('nicoVideo.yaml'))
    @id = settings["user"]["id"]
    @pass = settings["user"]["pass"]
    @ids = settings["seiga_id"]
end

def login
    begin
        https = Net::HTTP.new('secure.nicovideo.jp', 443)
        https.use_ssl = true
        https.ca_file = "./nico.cer"
        https.verify_mode = OpenSSL::SSL::VERIFY_PEER
        https.verify_depth = 5

        https.start do |access|
            req = Net::HTTP::Post.new("/secure/login")
            req["User-Agent"] = UA
            req.set_form_data({:mail=>@id, :password=>@pass})
            res = access.request(req)
            @cookie = res['Set-Cookie'].scan(/user_session=user_session_\d+_\d+/)
        end
    rescue => ex
        puts ex
    end
end

def load_list_xml
    @ids.each do |id|
        begin
            Net::HTTP.new(LIST_XML_URL, 80).start do |access|
                req = Net::HTTP::Get.new(LIST_XML_PATH + id["id"].to_s)
                req["User-Agent"] = UA
                req['Cookie'] = @cookie
                res = access.request(req).body
                parse_xml(res, id["title"] || id["id"].to_s)
            end
        rescue => ex
            puts ex
        end
    end
end

def parse_xml(list_xml, title)
    begin
        counter = 0
        @rss_data["#{title}"] = {}
        lists = REXML::Document.new(list_xml)
        lists.elements.each("/response/res_list/res") do |list|
            comments_list = []
            list.elements.each("comment_list/comment") do |comment|
                comments_list << comment.elements["content"].text unless comment.elements["content"].text.nil?
            end
            @rss_data["#{title}"][counter] = {"image_id" => list.elements["image_id"].text, "time" => list.elements["created"].text, "comment" => comments_list.join("\n")}
            counter += 1
        end
    rescue => ex
        puts ex
    end
end

def make_rss
    begin
       rss = RSS::Maker.make("2.0") do |make|
             make.channel.title = "ニコニコ静画ウォッチRSS"
             make.channel.description = "ニコニコ静画のお気に入りをチェック"
             make.channel.link = "http://seiga.nicovideo.jp/"
             make.image.title = "ニコニコ静画"
             make.image.url = "http://seiga.nicovideo.jp/img/common/img_logo_nicoseiga.gif"
             make.items.do_sort = true

             @rss_data.each do |title, data|
                data.each do |index, seiga|
                    make.items.new_item do |item|
                       time = Time.parse(seiga["time"].to_s.gsub("-", "/"))
                       item.link = IMAGE_URL.gsub("#ID#", seiga["image_id"])
                       item.title = title.to_s + " - " + seiga["image_id"].to_s
                       item.date = time
                       item.description = seiga["comment"]
                    end
                end
             end
          end

       File.open(RSS_FILE, "w") do |f|
          f.write(rss)
       end
    rescue => ex
        puts ex
    end
end

init
login
load_list_xml
make_rss

これを実行して生成されたファイルにアクセスすると


の様な感じでRSSが生成されます。
画像についているコメントも取得しています。


用法・容量にお気を付けください。