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)->@
ブログ内検索
__
リンク
