偏読日記@はてな

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

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

バージョンアップしました
新バージョンは http://d.hatena.ne.jp/a-park/20071105/p2 にあります。



blogを更新したいけど書く事or時間が無いという時に、ニコニコ動画辺りを初めとする動画共有サイトというのはとても便利なものです。

トップページの人気ランキングから適当に選び出すだけでもネタには困りませんし、特定ジャンルに絞ってもよし。
例えば俺なら「ヤンデレ」で検索して出た結果を毎日一件ずつ取り上げていくなんていいかもしれません。


……なんてことをつらつらと考えて居たんですが、今日の晩に突発的に思い立って上記を自動で行うスクリプト書いてみました。
ニコニコ動画の指定したキーワードでの検索結果(の1ページ目)からランダムで一本の動画を選択して自動ではてなダイアリーに書き込んでくれます。
バージョンが0.1以下なのは構想から完成まで5時間くらいなので超適当だから。


ちなみにActivePerl 5.8.8で動作を確認。
いやしくもはてな住人ならPerlの実行環境くらいは揃えていて当然だと思うので(笑)その辺りの解説は省きます。

#usr/local/bin/perl

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

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

#ID,パスワード,検索キーワードを指定
my $hatena_id   = 'myid';
my $hatena_pass = 'mypass';
my $nico_mail   = 'myaddress';
my $nico_pass   = 'nicopass';
my $keyword     = 'search_keyword';

$mech->get($url);

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

$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 = '*[動画]今日のニコ動';
$text .= $gadget;

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

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

	my $url =
	    'https://www.hatena.ne.jp/login?location=http%3A%2F%2Fd.hatena.ne.jp%2F'
	  . "$user" . '%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" ); }

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

改変等はご自由に、というよりむしろこちらからお願いしたいくらいです。
本当に必要最小限の機能しかない上、WWW::Mechanizeをまともに使うのは今回が初めてなので変なコードを書いている気がするのでおかしい所があればどんどん指摘してください。


ちなみに注意点は以下の通り。

  • HTML::TokePaser WWW::Mechanizeが必要
  • 一番新しい日付の日記に自動で書き込むが、更新対象の日付に既に記述が存在する場合全て上書きされる
  • スクリプトをUTF-8で保存しないと日本語での検索が上手くいかない

また、動画紹介サムネイル生成には自分のサイトにガジェットを追加で生成されるコードを使わせていただいています。


こいつをcron(Windowsマシンの場合はタスク)に登録して一日一回実行するようにしておけば、更新ネタに困る生活ともおさらばですよ!!
狙ったものとは違うタイプの動画が検索結果として出てきたらまたそれをネタに記事を書いてみれば良いですし。