2010/11/24 (Wed) 21:01
用意するもの:
このコードを書いたcgiファイル
ログを格納する空のtxtファイル(result.txt)
これを同じディレクトリに置いておいてください。
初期状態なら、ライブラリ->Web Server->CGI-Executablesというフォルダの中に。
下記がコードです。
前の記事で作ったテストコードもご参照ください。
以上です。
これで、取得したツイートを書き換えて投稿することができます。
投稿し終えたツイートのIDは、result.txtに書きこまれていきます。
わたし自身がperlにぜんぜん慣れていないので、この書き方がもっともスマートとは思いません。
現に、"my"のスコープへの理解が怪しいので、for文の中身をi,j,kとしていたり。これ全部iでもいいんじゃないの。
ザ・行き当たりばったり。
もっと楽な方法あるよ!とか、ありましたら、お気軽にコメントください。
次回は、
・パーミッションの変更(特にテキストファイルは、読み書きができるよう設定する必要があります)
・ほかのディレクトリに置いてもCGIが作動するようにhttpd.confを書き換える
の2本の予定です。
このコードを書いたcgiファイル
ログを格納する空のtxtファイル(result.txt)
これを同じディレクトリに置いておいてください。
初期状態なら、ライブラリ->Web Server->CGI-Executablesというフォルダの中に。
下記がコードです。
前の記事で作ったテストコードもご参照ください。
#!/usr/bin/perl use warnings; use strict; use CGI::Carp qw(fatalsToBrowser); # ライブラリのパスを追加したい場合 use lib '/パス'; # Twitterのモジュールを使用 use Net::Twitter::Lite; # エンコードにutf8を使用 use utf8; use Encode; use JSON 'decode_json'; binmode(STDOUT, ":utf8"); # HTML出力 print "Content-Type: text/html\n\n"; # 変数の宣言 my @flags; my @status; my @ids; # 結果を格納するテキストファイル my $file = 'result.txt'; my %CONSUMER_TOKENS = ( consumer_key => 'コンシューマトークンのキー', consumer_secret => 'コンシューマトークンのパスワード', ssl => 1 ); my $ACCESS_TOKEN = 'アクセストークンのキー'; my $ACCESS_TOKEN_SECRET = 'アクセストークンのパスワード'; # Net::Twitterの呼び出し(引数はコンシューマトークン) my $twit = Net::Twitter->new(%CONSUMER_TOKENS); # トークンをセット $twit->access_token($ACCESS_TOKEN); $twit->access_token_secret($ACCESS_TOKEN_SECRET); # 取得するパラメータ(今回は自分へのリプライ) my $param; $param = $twit->mentions() # 取得した値の格納 foreach my $str (@$param){ # リプライの内容を取り出す my $desc = $str->{'text'}; # "@of_forum_jp"は不要なので取り除く $desc =~ s/\@of_forum_jp//g; #ツイートの長さ、usernameの長さを取得 my $statusLength = length $desc; my $idLength = length $str->{'user'}{'screen_name'}; #ツイート+username+3([@]の記号ぶん)が140をオーバーしていた場合の処理 if($statusLength + 3 + $idLength > 140){ $desc = substr($desc, 0, 140 - $idLength - 6); $desc = join('', $desc, "..."); } # "内容[@発言者]"の形に連結しなおす my $s = join('', $desc, "[\@", $str->{'user'}{'screen_name'}, "]"); # 配列に格納 push @status, $s; # 内容に対応するIDも格納 push @ids, $str->{'id'}; } # ログファイルをオープン(共用読み取り) open (my $fh, '+<', $file) or die "Can't open file : $!"; for(my $i=0; $i<@ids; $i++){ while( my $line = <$fh> ){ # ファイルの中にidが見つかるかどうか(二重投稿の防止のため) if($line =~ /$ids[$i]/){ # 結果をフラグに格納。0=ある、1=新しい # 既にある場合は、すぐにループから抜ける $flags[$i] = 0; last; } else{ $flags[$i] = 1; } } } # フラグが1の場合のみ、発言を投稿 for(my $j=0; $j<@ids; $j++){ if($flags[$j] == 1){ $twit->update($status[$j]); } } # 発言し終えたIDをログファイルに書き込み for(my $k=0; $k<@ids; $k++){ if($flags[$k] == 1){ print $fh $ids[$k]; # 1行送り print $fh "\n"; } } #ファイルクローズ close $fh; exit; __END__
以上です。
これで、取得したツイートを書き換えて投稿することができます。
投稿し終えたツイートのIDは、result.txtに書きこまれていきます。
わたし自身がperlにぜんぜん慣れていないので、この書き方がもっともスマートとは思いません。
現に、"my"のスコープへの理解が怪しいので、for文の中身をi,j,kとしていたり。これ全部iでもいいんじゃないの。
ザ・行き当たりばったり。
もっと楽な方法あるよ!とか、ありましたら、お気軽にコメントください。
次回は、
・パーミッションの変更(特にテキストファイルは、読み書きができるよう設定する必要があります)
・ほかのディレクトリに置いてもCGIが作動するようにhttpd.confを書き換える
の2本の予定です。
PR
Comment
カテゴリー
最新記事
(12/07)
(12/06)
(10/17)
(08/09)
(07/18)
最新トラックバック
プロフィール
follow me!
@ar_tama
ar_tama / Makoto Arata
東京のはしっこでプログラミング、ときどきコンピュータ音楽。
音大生。
にゃんこともちもちが好き。
詳細
contact:arata.makoto(at)gmail.com
(at)->@
ブログ内検索
__
リンク