ニコニコ静画のお気に入りお題を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が生成されます。
画像についているコメントも取得しています。
用法・容量にお気を付けください。