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