TwitterBot作った
昨日「初めてのPerlの練習問題を全部解く」」とか言ってたけど、けっきょく途中で他のこと(Twitterbot作り)をやりたくなって6章辺りで投げました。またそのうちやる。
TwitterBotの流れは、
- Web::Scraperでつぶやきたい情報を抽出
- 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で文字数を指定すると良い。