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();

command.txtの内容

文字コードはShift-JISで。理由は後述。

consumer_key
consumer_secret
username
password
ポストしたい内容

解説

そもそも、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
; ここまで来たら、ポストしたか、もしくは失敗したかどちらか。

ここを抜けたら、兎にも角にも終了したので、元の処理に戻ります。

注意点

  • 140文字制限はしてませんので、適当に手加減して文字列を作ってください。
  • 失敗した場合の処理もしてませんので、ループ回数を数えて1分以上は失敗とみなしたりしてください。
  • ハッシュタグ等をつけたい場合は、NScripterの方でやってください。
  • ユーザー名やパスワードをユーザーに入力させる方法も、NScripterの方でなんとか作ってください。