Twitterの書き込みからJAGAT SNSのTodoへ共有設定でシンクロするPerlスクリプト
スポンサードリンク
Twitterの自分の書き込みをRSSの差分をとることで抽出して、JAGAT SNS [www.jagat.jp] に書き込みます。cronで好きな間隔でまわすといいよ。
▲JAGAT SNSのTodoに「全員に共有」設定でシンクロされます
ユーザーID、パスワードはConfig:Pitで管理する方式です。
パスワード設定をコードに書かない(Config::Pit) - モダンなPerl入門 - モダンなPerl入門 [perl-users.jp]
スクリプトを動かす前に、上記リンク先を参照して、コマンドラインからアカウントとパスワードをセットしておこう。こんな感じでいいのでは。
$ perl -MConfig::Pit -e'Config::Pit::set("www.jagat.jp", data=>{ username => "ABC12345", password => "password" })'
filename: twitter2jagatsns.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("www.jagat.jp", data=>{ username => "ABC12345", password => "password" })' my $config = pit_get("www.jagat.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終わり # JAGAT SNSログイン login( $username, $password ); # 新着分書き込み for my $item ( reverse @$list2 ) { (my $title = $item->{title}) =~s/^.+?: //o; #ユーザ名トルツメ #print encode('utf8', $title."\n"); # デバッグ用 post( $title ); # JAGAT SNSへ投稿 } } 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 { # JAGAT SNSへログイン my $username = shift; my $password = shift; my $res = $mech->get('http://www.jagat.jp/mypage/login.php'); $mech->form_number(2); $mech->set_visible( $username, $password ); $mech->submit(); die 'Login Failed.' if ($mech->uri() =~m|https://www.jagat.jp/index.php?option=login|); return; } sub post { # JAGAT SNS Todoへ投稿 my $text = shift; my $res = $mech->get('http://www.jagat.jp/igns/?m=pc&a=page_h_home'); $mech->form_number(3); # HTML内の3番目のフォーム $mech->set_visible( $text, [ checkbox => 1 ] ); # 見えているtextboxにセット # checkbox=>1で共有書き込み $mech->submit(); # 送信 return; }
これをみんなで使うとJAGATのTodo欄がTwitterのタイムラインみたいになると思うよ。
(2009-08-27 09:50訂正)
WWW::Mechanizeの最新バージョンだと、投稿が文字化けしますので、以下のとおり訂正します。
post( encode('utf8', $title ) ); # JAGAT SNSへ投稿
↓
post( $title ); # JAGAT SNSへ投稿
スポンサードリンク
トラックバック(0)
トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2923
コメントする