M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2009年7月24日 01:38

Twitterの書き込みからJAGAT SNSのTodoへ共有設定でシンクロするPerlスクリプト

このエントリーをはてなブックマークに追加 mixiチェック

Twitterの自分の書き込みをRSSの差分をとることで抽出して、JAGAT SNS [www.jagat.jp] に書き込みます。cronで好きな間隔でまわすといいよ。

Synctwitters
▲Twitterで書き込むと……

Syncjagatsnss
▲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へ投稿

投稿 大野 義貴 [Perl] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/2923

コメントする