Twitterの書き込みをアバウトミーにシンクロするPerlスクリプト、Config::Pitを使ってパスワードをスクリプトの中に書かない版
スポンサードリンク
以前書いたエントリのブックマークコメントで、Config::Pitをつかおうって言われたので、使ってみました。Config::Pitの使い方は、とりあえず、Perl-users.jpに書いておきました。おかしかったらCodeReposにあるから直してくれ。
パスワード設定をコードに書かない(Config::Pit) - モダンなPerl入門 - モダンなPerl入門 [perl-users.jp]
スクリプトを動かす前に、上記リンク先を参照して、コマンドラインからアカウントとパスワードをセットしておこう。こんな感じでいいのでは。
$ perl -MConfig::Pit -e'Config::Pit::set("aboutme.jp", data=>{ username => "ABC12345", password => "password" })'
それでは、cronで定期的に実行させるほうのスクリプト。
filename: twitter2aboutme.pl
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Config::Pit;
use Encode;
use URI::Fetch;
use XML::Feed;
use WWW::Mechanize;
# Twitterの自分のタイムラインのRSSを入れよう
my $uri = 'http://twitter.com/statuses/user_timeline/'
. '14119989.rss';
# aboutmeの自分のアカウント情報はConfig::Pitで
# あらかじめセットしておこう。コマンドラインからは
# $ perl -MConfig::Pit -e'Config::Pit::set("aboutme.jp", data=>{ username => "ABC12345", password => "password" })'
my $config = pit_get("aboutme.jp");
die "not preset account data in Pit." if !%$config;
my $username = $config->{username} or die 'username not found.';
my $password = $config->{password} or die 'password not found.';
my $mech = WWW::Mechanize->new();
my $past = './past.xml';
$mech->agent_alias( 'Windows Mozilla' );
# Main
parse();
exit;
sub parse {
my $content = load();
my $feed = XML::Feed->parse( \$content );
my $list; # 前回のfeedのlinkをキーとしてハッシュ作る
if ($feed) { # 前回のfeedが正常でない場合ループしない
foreach my $entry ( $feed->entries ) {
$list->{ $entry->link } = 1;
}
}
$content = get();
$feed = XML::Feed->parse( \$content );
exit unless $feed; # メンテナンスなどfeedが正常でない場合は終了
save($content);
my $list2; # 今回のfeedで前回のfeedに無いものが溜まるリスト
foreach my $entry ( $feed->entries ) {
if (!exists $list->{ $entry->link } ){ # 前回のfeedに無ければ
push @$list2, { title => $entry->title
}; # 今回のfeedからtitle(post内容)を格納
}
}
return if $#$list2 == -1; # 長さが0ならばparse終わり
# アバウトミーログイン
login( $username, $password );
# 新着分書き込み
for my $item ( reverse @$list2 ) {
(my $title = $item->{title}) =~s/^.+?: //o; #ユーザ名トルツメ
#print encode('utf8', $title."\n"); # デバッグ用
post( encode('utf8', $title ) ); # アバウトミーへ投稿
}
}
sub get { # TwitterからRSSを取得
my $ua = new LWP::UserAgent;
$ua->agent('Mozilla/5.0 (Windows; U; Windows NT 5.1; '
.'ja; rv:1.9.0.6) Gecko/2009011913 '
.'Firefox/3.0.6'); # UAをFirefoxに偽装
$ua->timeout(20); # timeoutを20秒に設定
my $res = URI::Fetch->fetch( "$uri",, UserAgent => $ua )
or die URI::Fetch->errstr; # 未来のことを考えてURI::Fetch
return $res->content;
}
sub load { # 前回feedを読み込み
open my $fh, '<', $past;
my $content = do { local $/; <$fh> }; # 一気読み
close $fh;
return $content;
}
sub save { # 前回feedとして書き込み
my $content = shift;
open my $fh, '>', $past;
print $fh $content;
close $fh;
return;
}
sub login { # アバウトミーへログイン
my $username = shift;
my $password = shift;
my $res = $mech->get('http://aboutme.jp/mypage');
$mech->set_visible( $username, $password );
$mech->submit();
die 'Login Failed.' if ($mech->uri() eq 'https://aboutme.jp/account/login');
return;
}
sub post { # アバウトミーへ投稿
my $text = shift;
my $res = $mech->get('http://aboutme.jp/mypage');
$mech->form_number(2); # HTML内の2番目のフォーム
$mech->set_visible( $text ); # 見えているtextboxにセット
$mech->submit(); # 送信
return;
}
(2009-08-27 09:50訂正)
WWW::Mechanizeの最新バージョンだと、投稿が文字化けしますので、以下のとおり訂正します。
post( encode('utf8', $title ) ); # アバウトミーへ投稿
↓
post( $title ); # アバウトミーへ投稿
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2812





![: Amazon.co.jp: プラスティック・メモリーズ 1【完全生産限定版】(イベントチケット優先販売申込券付) [Blu-ray]](/lists/_9/B00VWX66E8.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 2【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66K2.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 3【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6MV0.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 4【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX66IO.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 5【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX6Y0E.jpg)
![: Amazon.co.jp: プラスティック・メモリーズ 6【完全生産限定版】[Blu-ray]](/lists/_9/B00VWX69D6.jpg)

コメントする