PerlでローカルからTwitterにポストする。(仮)後で変更を加える。
タイトル通り。
参考にしたのは、http://d.hatena.ne.jp/layerzero/20090930/p1。
tweet_poster.pl
use utf8; use strict; use warnings; # 日本語で書いてます。 my $comfile = 'command.txt'; -e $comfile or exit(); # コマンドファイルがなければ何もしない。 my $resfile = 'result.txt'; # コマンドを読み込む use Jcode; my $j = Jcode->new(); open ( IN, $comfile ); my $ck = <IN>; chomp $ck; chomp $ck; my $cks = <IN>; chomp $cks; chomp $cks; my $user = <IN>; # ユーザー名の取得 chomp $user; chomp $user; my $pass = <IN>; # パスワードの取得 chomp $pass; chomp $pass; my $status = ''; # ポスト内容の取得 while ( my $line = <IN> ) { chomp $line; chomp $line; $status .= $line; } close ( IN ); $status = $j->set($status=>'sjis')->utf8; # utf8に変換。sjis決め打ち。 $status = utf8::is_utf8($status) ? $status : Encode::decode("utf8", $status); # 念のためにフラグを立てる。 # ntオブジェクトを作成する。 use Net::Twitter; my $nt = Net::Twitter->new( traits=>['API::REST', 'OAuth'], consumer_key=>$ck, consumer_secret=>$cks, ); # トークン取得処理。 use WWW::Mechanize; my $ua = WWW::Mechanize->new(); $ua->get($nt->get_authorization_url()); $ua->field('session[username_or_email]', $user); $ua->field('session[password]', $pass); my $res = $ua->click_button(number=>2); my $content = $res->decoded_content(); # gzipされてるのを解凍して得る。 $content =~ /<div id\=\"oauth_pin\">\s+(\d+)\s+<\/div>/s; my $v = $1; # pinコード取得 # 取得したトークンをセット my ( $at, $ats ) = $nt->request_access_token(verifier=>$v); $nt->access_token($at); $nt->access_token_secret($ats); # ポスト! $res = $nt->update({status=>$status}); # ポスト! 二重ポスト対策はしてません。 # ログ取り open ( OUT, ">$resfile" ); binmode ( OUT, 'utf8' ); use Data::Dumper; print OUT Data::Dumper->new([$res], ['res'])->Dump(); # ポスト内容を出力 close ( OUT ); unlink( $comfile ); # コマンドファイルを削除して終了。 exit();
解説
そもそも、NScripterからTwitterにポストすると言う命題のソリューションとして作成しました。
最終的には、これで作成した*.plをppで*.exe化させる予定ですが、そこまでいきませんでした。
使用方法
これをNScripterに組み込みたいと思う開発者は、事前にtwitter.comにアクセスして、コンシューマーキーを取得しなければなりません。(いや、私が取得したのを使ってもいいんですけど、それは流石に無責任なので。プログラムにべた書きするのもアレだし)
以下、*.exeができたと想定しての使い方を記述します。
NScripterでcommand.txtを作成します。これには、csv系命令を使います。1行目がコンシューマーキー、2行目がコンシューマー秘密鍵、3行目がユーザー名、4行目がパスワード、5行目以降がポスト内容です。
csvopen "command.txt","w" ; この辺は予めnumaliasで設定したり、取得しておくこと。 csvwrite $twitter_consumer_key csvwrite $twitter_consumer_secret csvwrite $twitter_username csvwrite $twitter_password csvwrite $twitter_post_strength csvclose
そして、
fileremove "result.txt" ; 前回の結果を破棄。 winexec "tweet_poster.exe",0 ; 非同期実行。
このように実行します。
command.txtが存在している限り、tweet_poseter.exeが実行中ですので、終了するまで待ちます。
~ wait 10 fileexist %0,"command.txt" if %0=1 jumpb ; ここまで来たら、ポストしたか、もしくは失敗したかどちらか。
ここを抜けたら、兎にも角にも終了したので、元の処理に戻ります。