Hatena::ブログ(Diary)

ゆるやかにくちてゆくこの世界で あがく僕の唯一のかつろ

About | Archive | B!
 | 

2009-09-01

ニコ生アラートのAPIをたたいてみた

| 01:00 |

ニコ生アラート(本家)の仕様とは (ニコナマアラートホンケノシヨウとは) [単語記事] - ニコニコ大百科

Rubyでちょっと書いてみた

入ってるコミュニティが配信を始めた時、タイトルとコミュニティ名を出力する

mechanizeがインストールされてないかたは

% sudo gems install mechanize

してください

といわけで、以下コード

@ alert.rb

  1 #!/usr/bin/env ruby -Ku
  2 
  3 require 'rubygems'
  4 require 'mechanize'
  5 require 'rexml/document'
  6 require 'socket'
  7 
  8 # Account setting
  9 ID  = 'mail_addres'
 10 PWD = 'password'
 11 
 12 # call Mechanize
 13 agent = WWW::Mechanize::new
 14 
 15 # request API 1
 16 ticket = agent.post('https://secure.nicovideo.jp/secure/login?site=nicolive_antenna',
 17           'mail' => "#{ID}", 'password' => "#{PWD}")
 18           
 19 # Set User Agent
 20 agent.user_agent = 'NicoLiveAlert 1.0.0'
 21 
 22 ticket_body = ticket.body
 23 doc = REXML::Document.new ticket_body
 24 
 25 doc.root
 26 get_ticket = doc.elements['nicovideo_user_response/ticket/'].text
 27 
 28 
 29 # request API 2
 30 data = agent.get('http://live.nicovideo.jp/api/getalertstatus', 'ticket' => "#{get_ticket}")
 31 
 32 source = data.body
 33 doc2 = REXML::Document.new source
 34 community = doc2.elements['getalertstatus/communities']
 35 addr = doc2.elements['getalertstatus/ms/addr'].text
 36 port = doc2.elements['getalertstatus/ms/port'].text
 37 thread = doc2.elements['getalertstatus/ms/thread'].text
 38 
 39 # community_id set
 40 i = 0
 41 community_id = Array.new
 42 community.each do |id|
 43   community_id[i] = id.text
 44   i += 1
 45 end
 46 
 47 
 48 socket = TCPSocket.open(addr, port)
 49 query = "<thread thread=\"#{thread}\" version=\"20061206\" res_from=\"-1\"/>\0"
 50 
 51 socket.print query
 52 
 53 # main loop
 54 socket.each("\0") do |line|
 55   info = line.split(/(,)|(<.*?>)/)
 56   community_id.each do |n|
 57     if n == info[4]
 58       live = agent.get("http://live.nicovideo.jp/api/getstreaminfo/lv#{info[2]}")
 59       live_source = live.body
 60       doc3 = REXML::Document.new live_source
 61       puts doc3.elements['getstreaminfo/streaminfo/title'].text
 62       puts doc3.elements['getstreaminfo/communityinfo/name'].text
 63       puts doc3.elements['getstreaminfo/communityinfo/thumbnail'].text
 64     end
 65   end
 66 end

実行

% ruby alert.rb

User Agentをちゃんと設定しないと30行目でエラーになる

 20 agent.user_agent = 'NicoLiveAlert 1.0.0'

変数とかの命名がだめだめすぎるな…

トラックバック - http://d.hatena.ne.jp/kajisuke/20090901/1251734427
 | 
Connection: close