ニコニコ生放送でコメントを書き込むperlプログラム
にこ生にコメントを書くほうも、ついでに。
#!/usr/local/bin/perl
use LWP::UserAgent;
use HTTP::Cookies;
use URI::Escape;
use HTTP::Request;
use HTTP::Headers;
use IO::Socket;
use IO::Select;
# 初期設定
my $video_id = $ARGV[0] || die “lvから始まる生放送IDを入力してください”;
my $mail = メールアドレス;
my $password = パスワード;
# UserAgentの設定
my $ua = LWP::UserAgent->new;
$ua->cookie_jar( HTTP::Cookies->new(
file => ‘cookie.lwp’,
autosave => 1,
));
# ログイン
my $res=$ua->post( “https://secure.nicovideo.jp/secure/login”,
[
mail => $mail,
password => $password,
]);
print “Login : “,$res->status_line,”\n”;
#$ua->get( “http://live.nicovideo.jp/watch/$video_id” );
$res = $ua->get(“http://live.nicovideo.jp/api/getplayerstatus?v=$video_id”);
$\=”\n”;
print “API connect : “,$res->status_line,”\n”;
my $content = uri_unescape($res->content);
use XML::Simple;
my $parser = XML::Simple->new;
my $xml = $parser->XMLin($content);
my $server = $xml->{ms}->{addr};
my $port = $xml->{ms}->{port};
my $thread_id = $xml->{ms}->{thread};
my $ticket= $xml->{rtmp}->{ticket};
my $base_time= $xml->{stream}->{base_time};
#use Time::HiRes;
#print Time::HiRes::time;
#my $now= Time::HiRes::time;
my $vpos=(time-$base_time)*100;
my $mail=”184”;
my $user_id = $xml->{user}->{user_id};
my $premium = $xml->{user}->{is_premium};
#save xml
my $post_data = “<thread res_from="-100" version="20061206" thread="” . $thread_id .”" />\0”;
my $selecter = IO::Select->new; # select の前準備
print “$server:$port\n”;
my $sock = IO::Socket::INET->new(“$server:$port”); # 各サーバのソケットを生成
$selecter->add($sock); # select の対象ソケットに追加
my $sock2host = “$server:$port”; # メッセージ表示用ハッシュ
print $sock $post_data;
$sock->flush(); # バッファをフラッシュ
my $thread=&getComment();
die “” unless($thread=~/last_res=”(\d+)”/);
my $block_no=int ($1/100);
$res = $ua->get(“http://live.nicovideo.jp/api/getpostkey?thread=$thread_id&block_no=$block_no”);
my $data=$res->content;
my $postkey=substr($data,index($data,’=’)+1);
my $comment= “<chat thread="$thread_id" ticket="$ticket" vpos="$vpos" postkey="$postkey" mail="$mail" user_id="$user_id" premium="$premium">こんにちは〜</chat>\0”;
print $sock $comment;
# 読み込みが完了していないソケットが残っていたら
sub getComment
{
my ($readable_socks) = IO::Select->select($selecter, undef, undef, undef);
# 読み込み可能なソケットがあれば、以下の foreach ループが実行される
foreach my $sock (@$readable_socks){
my $len = sysread($sock, $buf, 4096); # ソケットから 4096 バイト読み込む
print “read ${len}bytes from $sock2host\n $buf…”;
if ( $buf=~/\/disconnect/)
{
print “放送終了: $sock2host\n”; # そのソケットからの読み込みは終了
$selecter->remove($sock); # select の対象から外す
$sock->close(); # ソケットをクローズ
$continue=0;
}
return $buf;
}
}
ちょー汚いですが、用は
<chat thread="$thread_id" ticket="$ticket" vpos="$vpos" postkey="$postkey" mail="$mail" user_id="$user_id" premium="$premium">こんにちは〜</chat>
っていうデータを送信したいだけです。
そのデータ収集のために、いろいろやってます^^;
参考サイトは、先日の日記とほぼ同じなので割愛 (´もω(+”)ノ