トラックバック受信
#! /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=Shift_JIS\n\n); print <<" END"; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <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} .= "..."; } } }
〔 実行する 〕