あっという間の十年ブログ【Ruby篇】

"詮ずるところ#{プログラミング}は、ただ年月長く倦まずおこたらずして、はげみつとむるぞ肝要にて、学びやうは、いかやうにてもよかるべく、さのみかかはるまじきことなり。いかほど学びかたよくても、おこたりてつとめざれば、功はなし。また、人々の才と不才とによりて、その功いたく異なれども、才不才は、生まれつきたることなれば、力に及びがたし。されど、大抵は、不才なる人といへども、おこたらずつとめだにすれば、それだけの功は有る物なり。" - 本居宣長

TwitterBot作った

昨日「初めてのPerlの練習問題を全部解く」」とか言ってたけど、けっきょく途中で他のこと(Twitterbot作り)をやりたくなって6章辺りで投げました。またそのうちやる。

TwitterBotの流れは、

  1. Web::Scraperでつぶやきたい情報を抽出
  2. logファイルを比較して更新されていたらURLを短縮してつぶやく

中身は、
http://pocketstudio.jp/log3/2011/03/30/bitly-shorten-script/
http://d.hatena.ne.jp/enakai00/20110323/1300846444
辺りからほぼ丸パクリ。(更新チェックのアイデアは自分で考えました。:-))

use strict;
use warnings;
use Net::Twitter::Lite;
use WebService::Bitly;
use Web::Scraper;
use utf8;
use URI;
use Encode;
use File::Compare;

my $scraper = scraper {
	process 'hoge', 'title' =>  'TEXT',
        process 'hoge', 'src' => '@href',
};
my $url = URI->new('http://hogehoge');
my $res = $scraper->scrape($url);

my $title = $res->{title};
my $long_url = $res->{src};

my $short_url;
# urlを短くする(bit.ly)
sub bitly {
	if ($long_url !~ /s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+/g) {
		print "NG URL\n";
	} else {
		my $bitly = WebService::Bitly->new(
			user_name => 'hoge',
			user_api_key => 'hoge'
		);
		my $result = $bitly->shorten($long_url);
	
		if ($result->is_error) {
			warn $result->status_code;
			warn $result->status_txt;
		} else {
			$short_url = $result->short_url;
		}
	}
}

open(my $out, '>', 'new.log');
	print $out encode_utf8($title);
close($out);

# logファイルを比較し同じ内容なら(更新がないなら)終了
if (compare("old.log", "new.log") == 0) {
	print "not update\n"

# 更新があればつぶやく
} else {
	my $Consumer_key = 'hoge';
	my $Consumer_key_secret = 'hoge';
	my $Access_token = 'hoge';
	my $Access_token_secret = 'hoge';
	
	my $Tw = Net::Twitter::Lite->new(
  		consumer_key    => $Consumer_key,
  		consumer_secret => $Consumer_key_secret,
  		legacy_lists_api => 0,
	);
	$Tw->access_token($Access_token);
	$Tw->access_token_secret($Access_token_secret);

	sub twitter_post {
 		my $post = $_[ 0 ];
  		eval{ $Tw->update( { status =>$post } ); };
  		warn "Failed to tweet: $@\n" if ( $@ );
	}
	MAIN: {
		&bitly;
 		my $message = "$title $short_url";
  		twitter_post( $message );
	}

	open(my $out, '>', 'old.log');
		print $out encode_utf8($title);
	close($out);
}

追記:
文字制限があってつぶやかれないことがあるのでText::Truncateで文字数を指定すると良い。