トラックバック受信
#! /usr/local/bin/perl
use Jcode;
$TIME = time;
$FILE = "./dat/traba.dat"; #トラックバック保存先
$FILEMAX = 50; #トラックバック保存件数
$TXTMAX = 300; #文字数制限(全角)
if($ENV{'REQUEST_METHOD'} eq 'POST') {
loadTrackback(); #トラックバック受信
printResponse(writeData()); #ファイル書き込み・レスポンス
}
else {
print qq(Content-type: text/html; charset=UTF-8\n\n);
print <<" END";
<!DOCTYPE html>
<html>
<head><title>トラックバック受信</title></head>
<body>
<h1 style="margin:2px;font-size:17px">トラックバック受信</h1>
トラックバック送信先 http://$ENV{'HTTP_HOST'}$ENV{'SCRIPT_NAME'}<br>
END
printData(); #ファイル読み込み・表示
print <<" END";
</body>
</html>
END
}
exit;
#============================================================================== ファイル読み込み・表示
sub printData
{
my ($i);
open(FILE, "<$FILE") or return;
eval{ flock(FILE, 1) };
my @DATA = <FILE>;
close FILE;
for($i = 0 ; $i < @DATA ; $i++) {
my ($tm, $name, $title, $url, $excerpt) = split(/\t/, $DATA[$i]);
my ($sec, $min, $hour, $date, $mon, $year, $day) = localtime($tm);
$mon++;
print << " END";
<p style="width:100%;padding:5px;border:1px solid #333">
【$mon月$date日$hour時$min分】 $name<br>
<a href="$url">$title</a><br>
$excerpt<br>
</p>
END
}
}
#============================================================================== ファイル書き込み
sub writeData
{
return('Error'); #サンプルにつき受信停止
if(!$FORM{'blog_name'} or !$FORM{'title'} or !$FORM{'url'} or !$FORM{'excerpt'}) {
return('Error');
}
open(FILE, "<$FILE") or return('Error-Read');
eval{ flock(FILE, 1) };
my @DATA = <FILE>;
close FILE;
unshift @DATA, "$TIME\t$FORM{'blog_name'}\t$FORM{'title'}\t$FORM{'url'}\t$FORM{'excerpt'}\t\n";
while(@DATA > $FILEMAX) {
pop @DATA;
}
open(FILE, ">$FILE") or return('Error-Write');
eval{ flock(FILE, 2) };
print FILE @DATA;
close(FILE);
return;
}
#============================================================================== レスポンス
sub printResponse
{
my $message = $_[0];
print qq(Content-Type: text/xml;charset=UTF-8\n\n);
print qq(<?xml version="1.0" encoding="UTF-8"?>\n);
print qq(<response>\n);
if($message){
print qq(<error>1</error>\n);
print qq(<message>$message</message>\n);
}
else {
print qq(<error>0</error>\n);
}
print qq(</response>\n);
}
#============================================================================== トラックバック受信
sub loadTrackback
{
my ($query, $pair);
read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
foreach $pair (split(/&/, $query)) {
my ($key, $value) = split(/=/, $pair, 2);
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg;
$value = Jcode::convert($value, 'sjis');
$value =~ s/</</g;
$value =~ s/>/>/g;
$value =~ s/\x0D\x0A/ /g; #改行を半角スペースに変換
$value =~ s/\x81\x40/ /g; #全角スペースを半角スペースに変換
$value =~ s/\s+/ /g; #連続スペースをスペース1文字に変換
$FORM{$key} = $value;
if(length($FORM{$key}) > $TXTMAX * 2) { #文字数チェック
$FORM{$key} = substr($FORM{$key}, 0, $TXTMAX * 2);
$FORM{$key} .= "...";
}
}
}
〔 実行する 〕