Created
October 18, 2011 17:31
-
-
Save raa0121/1296050 to your computer and use it in GitHub Desktop.
ニコ生アラート(本家)のAPIを叩いて、入ってるコミュニティの生放送をTwitterにPostするRubyBot
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#================================================================================= | |
#【アプリ名】 ニコ生アラート(本家)の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 | |
- 認証キーをファイルに出力し、コード内に残さないようにした |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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