忍者ブログ
a pot of tea,
プログラミング勉強中。備忘録や、つくったものの紹介を書いています。openFrameworks(ofxiPhone)/Perl/PHP/as3(flash,AIR)などなど。
Admin / Write
2017/05/01 (Mon) 05:42
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2010/11/24 (Wed) 21:01
第3回。
第2回と併せての投稿です。
実際に、自分宛の投稿を取得・書き換え・投稿するプログラムを書いていきます。

@12/27追記。
プログラムの内容を修正しました。





用意するもの:
このコードを書いた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
Name
Title
Mail
URL
Comment
Pass   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
  HOME   11  10  9  8  7  6  5  4  3  2  1 
最新コメント
[02/22 通りすがり]
[10/05 ar_tama]
[10/02 すぎゃーん]
[10/02 すぎゃーん]
最新トラックバック
プロフィール
twitter
follow me!
@ar_tama


ar_tama / Makoto Arata
東京のはしっこでプログラミング、ときどきコンピュータ音楽。
音大生。
にゃんこともちもちが好き。
詳細

contact:arata.makoto(at)gmail.com
(at)->@
バーコード
ブログ内検索
__
忍者ブログ [PR]