偏読日記@はてな

本を読んだりゲームをしたり、インターネットの話をしたりします。小説も書きます。

自動ニコニコ動画紹介記事生成スクリプト AutoNicoDiary 0.1

注:ニコニコ動画の仕様変更により、現在本スクリプトは使用不能です

昨日作って公開した自動ニコ動紹介日記生成スクリプトを改良。
書き込み先の日付の日記を無条件で上書きするという凶悪な仕様を修正し、既に何か書かれている場合は追記するようになりました。
検索キーワードを指定した場合は検索結果の1ページ目の動画の中からランダムで一件、キーワードが無い場合はニコ動トップページの人気動画一覧からランダムで一件を選択し、指定したIDのはてなダイアリーの最新の日付に自動で書き込みます。
紹介サムネイルの生成には 自分のサイトにガジェットを追加 で生成されるコードを利用しています。


自動生成される記事のサンプルはこちら:今日のニコニコ人気動画 - 偏読日記@はてな
(これは検索キーワードを指定しなかった場合の例です)



検索結果一覧の動画を全て出力するとか、Perlでニコニコ動画のflvとコメントxmlをダウンロードする (Yusukebe::Tech) と組み合わせて対象動画に付いたコメントも抜粋してみるとか、はてなブックマークの人気エントリから選ぶようにするとか色々考えましたが、その辺りの改造は使う皆さんでご自由にどうぞ。
俺は今のところ現状で十分です。


それと連続実行はニコニコ&はてなのサーバーに優しくない(ログイン処理を繰り返すことになる)ので注意して……というよりやめて下さい。*1


長くなるのでコード本文は「続きを読む」で。

はてなID,Pass ニコ動登録メールアドレス,Pass 検索キーワードはそれぞれ書き換えてください。

#usr/local/bin/perl

use strict;
use HTML::TokeParser;
use WWW::Mechanize;

my $mech = WWW::Mechanize->new();
my $url  = 'http://www.nicovideo.jp/';

my $hatena_id   = 'hatenaID';
my $hatena_pass = 'hatenaPass';
my $nico_mail   = 'nicoMail';
my $nico_pass   = 'nicoPass';
my $keyword     = 'SearchKeyword';

$mech->get($url);

$mech->form_number(1);
$mech->field( mail     => $nico_mail );
$mech->field( password => $nico_pass );
$mech->click();

if ($keyword) {
	$mech->form_number(1);
	$mech->field( s => $keyword );
	$mech->click();
}

my @url;
my $p = HTML::TokeParser->new( \( $mech->content() ) );

#リンク取得
while ( my $token = $p->get_tag("a") ) {
	unless ( $token->[1]{href} =~ s/(watch\/)// ) { next }
	push @url, $token->[1];
}

my $video = ${ $url[ int( rand(@url) ) - 1 ] }{'href'};

my $gadget =
'<script src="http://gmodules.com/ig/ifr?url=http://ja2yka.homeip.net/~mitsu/gadget/nicovideo.xml&amp;up_video_id='
  . $video
  . '&amp;up_dummy=&amp;synd=open&amp;w=312&amp;h=176&amp;title=%E3%83%8B%E3%82%B3%E3%83%8B%E3%82%B3%E5%8B%95%E7%94%BB&amp;border=%23ffffff%7C3px%2C1px+solid+%23999999&amp;output=js"></script>';

my $text;
if($keyword){
$text = "*[動画]今日の$keyword";
}
else{$text = '*[動画]今日のニコニコ人気動画';}

$text .= $gadget;

editDiary( $hatena_id, $hatena_pass, \$text );
print $video;
exit;

#はてなダイアリー書き込み
sub editDiary {
	my $user     = shift;
	my $password = shift;
	my $textref  = shift;

	my $url = qw|https://www.hatena.ne.jp/login?location=http%3A%2F%2Fd.hatena.ne.jp%2F|."$user".qw/%2F/;

	$mech->get($url);

	$mech->form_number(1);
	$mech->field( name     => $user );
	$mech->field( password => $password );
	$mech->click();

	$mech->follow_link( url => "http://d.hatena.ne.jp/$user/" );
	if ( $mech->find_link( url => "http://d.hatena.ne.jp/$user/edit" ) ) {
		$mech->follow_link( url => "http://d.hatena.ne.jp/$user/edit" );
	}
	else { $mech->follow_link( url => "/$user/edit" ); }

	my $p      = HTML::TokeParser->new( \( $mech->content() ) );
	my $token  = $p->get_tag("textarea");
	my $writed = $p->get_text("/textarea");

	if ($writed) {
		$$textref = $writed . "\n" . $$textref;
	}

	$mech->form_number(1);
	$mech->field( body => $$textref );
	$mech->click('edit');
}

ActivePerl 5.8.8で動作を確認しています。
注意点は以下の通り。

  • WWW::Mechanize HTML::TokePaser が必要
  • UTF-8で保存しないと日本語を検索キーワードに使えない

他にも俺が見落としているものが有る可能性があるので、発見した場合は指摘お願いします。

*1:連続実行しても迷惑のかからないようなコード書けよ、という話でもありますが。