Skip to content

Instantly share code, notes, and snippets.

@raa0121
Created October 18, 2011 17:31
Show Gist options
  • Save raa0121/1296050 to your computer and use it in GitHub Desktop.
Save raa0121/1296050 to your computer and use it in GitHub Desktop.
ニコ生アラート(本家)のAPIを叩いて、入ってるコミュニティの生放送をTwitterにPostするRubyBot
#=================================================================================
#【アプリ名】 ニコ生アラート(本家)のAPIを用いたTwitterBot
#【著作権者】 raa0121
#【対応環境】
# Linux Mac
# gem install twitter_oauth
# gem install mechanize
# 後は ruby nicolivealert.rb で起動が可能です。
#【開発環境】 Cygwin (WindowsVista SP2 32bit)
#【開発言語】 Ruby(1.9.2-p180)(DL元:http://www.artonx.org/data/asr/ )
#【 種 別 】 フリーウエア(修正BSDライセンスに準拠)
#【転載条件】 修正BSDライセンス上で許可
#【連絡先 及び 1次配布】 https://gist.github.com/1296050
#=================================================================================
1 Twitterに連携アプリを登録します。
https://dev.twitter.com にログインし、「Create an app」をクリックします。
各項目は各自適当に入力してください。
筆者のおすすめは
Name:TwitterID
Description:TwitterID のBotです。
WebSite:http://twitter.com/TwitterID か各自のブログ
です。
2 実行する
1で取得できたConsumer keyとConsumer secretを
ruby nicolivealert.rb と実行して求められた入力部分に入力します。
入力したら表示されるURLにBot用アカウントでログインしてるブラウザでアクセスします。
アクセスしたページで認証したら表示されるPINコードを先ほどの入力部分に入力します。
常時無限ループを行うので、screenの中で実行しないとプロンプトを占有します。
ruby nicolivealert.rb を行なってください。
更新履歴
Ver 0.1
- 初回公開
Ver 0.2
- 認証キーをファイルに出力し、コード内に残さないようにした
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
if RUBY_VERSION < '1.9'
require 'rubygems'
require 'kconv'
end
require 'twitter_oauth'
require 'mechanize'
require 'rexml/document'
require 'socket'
config_path = File.expand_path "~/.nicolivealert"
def OAuth_twitter(config_path)
print "Consumer Keyを入力してください: "
consumer_key = gets.chomp.strip
print "Consumer secretを入力してください: "
consumer_secret = gets.chomp.strip
client = TwitterOAuth::Client.new(
:consumer_key => consumer_key,
:consumer_secret => consumer_secret
)
request_token = client.request_token
puts "ここにアクセスしてください: #{request_token.authorize_url}"
print "PIN Codeをここに入力してください: "
oauth_verifier = gets.chomp.strip
acsses_token = client.authorize(
request_token.token,
request_token.secret,
:oauth_verifier => oauth_verifier
)
puts ""
puts "CONSUMER_KEY #{consumer_key}"
puts "CONSUMER_SECRET #{consumer_secret}"
puts "ACSSES_TOKEN #{request_token.token}"
puts "ACSSES_TOKEN_SECRET #{request_token.secret}"
Dir::chdir(config_path)
File::open("twitter_oauth","w"){|f|
f.puts "#{consumer_key}"
f.puts "#{consumer_secret}"
f.puts "#{request_token.token}"
f.puts "#{request_token.secret}"
}
end
unless File.exist? config_path
Dir.mkdir config_path
OAuth_twitter(config_path)
else
Dir::chdir(config_path)
if File.exist? "twitter_oauth"
File::open("twitter_oauth","r"){|f|
CONSUMER_KEY = f.readlines[0]
CONSUMER_SECRET = f.readlines[1]
ACCESS_TOKEN = f.readlines[2]
ACCESS_TOKEN_SECRET = f.readlines[3]
}
else
OAuth_twitter(config_path)
end
end
print "ニコニコ動画のアカウントのアドレスを入力してください: "
nico_id = gets.chomp.strip
print "ニコニコ動画のアカウントのパスワードを入力してください: "
nico_pass = gets.chomp.strip
client = TwitterOAuth::Client.new(
:consumer_key => CONSUMER_KEY,
:consumer_secret => CONSUMER_SECRET,
:token => ACCESS_TOKEN,
:secret => ACCESS_TOKEN_SECRET
)
# call Mechanize
agent = Mechanize.new
agent.user_agent = 'NicoLiveAlertTwitterBot 0.2'
# request API 1
ticket = agent.post('https://secure.nicovideo.jp/secure/login?site=nicolive_antenna','mail' => "#{nico_id}",'password' => "#{nico_pass}")
ticket_body = ticket.body
doc = REXML::Document.new ticket_body
doc.root
get_ticket = doc.elements['nicovideo_user_response/ticket'].text
# request API 2
data = agent.get('http://live.nicovideo.jp/api/getalertstatus', 'ticket' => "#{get_ticket}")
source = data.body
doc2 = REXML::Document.new source
community = doc2.elements['getalertstatus/communities']
addr = doc2.elements['getalertstatus/ms/addr'].text
port = doc2.elements['getalertstatus/ms/port'].text
thread = doc2.elements['getalertstatus/ms/thread'].text
# community_id set
community_id = community.map(&:text)
socket = TCPSocket.open(addr, port)
query = %q|"<thread thread="#{thread}" version="20061206" res_from="-1">0"|
socket.print query
# main loop
socket.each("\0") do |line|
info = line.split(/(,)|(<.*?>)/)
community_id.each do |n|
if n == info[4]
live = agent.get("http://live.nicovideo.jp/api/getstreaminfo/lv#{info[2]}")
live_source = live.body
doc3 = REXML::Document.new live_source
post1 = doc3.elements['getstreaminfo/streaminfo/title'].text
post2 = doc3.elements['getstreaminfo/request_id'].text
posts = '【生放送】'+ post1 + ' を開始しました。'+ ' http://nico.ms/'+post2
puts posts
if RUBY_VERSION < 1.9
client.update(Kconv.toutf8(posts))
else
client.update(posts.encode('utf8'))
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment