[sb]トラックバックチェッカー対応
2005.02.20 Sunday 21:06
どういうことか簡単に説明しますと、TrackBackのパラメータとして__mode=rssをつけるとトラックバック一覧をRSSで取得できる機能に対応します。
ex. http://blog.underdone.net/sb.cgi/480?__mode=rss
__mode=viewにも対応させたいところですが、css対応などが大変なので、今回は行っていません。
まずlib/sbres.plのsbres_tb関数を以下のように書き換えます。
そしてsbres_tb関数の次にしたの関数を追加します。
ex. http://blog.underdone.net/sb.cgi/480?__mode=rss
__mode=viewにも対応させたいところですが、css対応などが大変なので、今回は行っていません。
まずlib/sbres.plのsbres_tb関数を以下のように書き換えます。
sub sbres_tb {
my $eid = shift;
my $lfile = &sblock_lock() or die($gMsg{'error'}{'file_lock'} . "\n");
eval {
my ($subj,$url,$body,$name,$check) = ();
my ($host,$addr,$refe,$agnt) = &sbhtml_gethost();
{ # ファイル読込み
&sbfile_read_datafile('ent');
&sbfile_read_datafile('tb');
&sbfile_read_entry($eid);
}
{ # 下準備
$subj = &sbtxt_decform($gIn{'title'},1,'utf8');
$url = &sbtxt_decform($gIn{'url'},1,'utf8');
$body = &sbtxt_decform($gIn{'excerpt'},2,'utf8');
$name = &sbtxt_decform($gIn{'blog_name'},1,'utf8');
$gIn{'title'} = '';
$gIn{'url'} = '';
$gIn{'excerpt'} = '';
$gIn{'blog_name'} = '';
}
# チェック
if (!($gIn{'__mode'} eq 'rss' || $gIn{'__mode'} eq 'view')) {
die('url field is necessary.' . "\n") if ($url eq '');
die('The ping is denied.' . "\n") if ( $gData{'entry'}{$eid}{'ent'}{'atb'} == 0 );
die('The ping is denied.' . "\n") if ( $refe ne '' );
die('The ping is denied.' . "\n") if ( !&sbres_check_ip($addr) );
die('The ping is denied.' . "\n") if ( !&sbres_check_agent($agnt) );
die('The ping has already received.' . "\n") if ( !&sbres_check_redundancy($eid,'tb',$body,$url) );
}
if (!($gIn{'__mode'} eq 'rss' || $gIn{'__mode'} eq 'view')) {
# データ更新
require 'sbgen.pl';
my $num = @{$gData{'entry'}{$eid}{'tb'}};
$gData{'entry'}{$eid}{'tb'}[$num]{'id'} = $gData{'num'}{'tb'};
$gData{'entry'}{$eid}{'tb'}[$num]{'wid'} = 0;
$gData{'entry'}{$eid}{'tb'}[$num]{'eid'} = $eid;
$gData{'entry'}{$eid}{'tb'}[$num]{'stat'} = ($gData{'entry'}{$eid}{'ent'}{'atb'} == 1) ? 1 : 0;
$gData{'entry'}{$eid}{'tb'}[$num]{'date'} = $gNowTime;
$gData{'entry'}{$eid}{'tb'}[$num]{'body'} = $body;
$gData{'entry'}{$eid}{'tb'}[$num]{'subj'} = $subj;
$gData{'entry'}{$eid}{'tb'}[$num]{'name'} = $name;
$gData{'entry'}{$eid}{'tb'}[$num]{'url'} = $url;
$gData{'entry'}{$eid}{'tb'}[$num]{'host'} = $addr;
&sbini_creat_newtb($eid,$gData{'entry'}{$eid}{'tb'}[$num]{'stat'},$gNowTime,$subj,$name,$url);
$gData{'entry'}{$eid}{'ent'}{'tb'} = &sbres_count($eid,'tb');
$gData{'ent'}[$eid]{'tb'} = $gData{'entry'}{$eid}{'ent'}{'tb'};
&sbres_sendmail($eid,'tb',$num);
&sbfile_update_entry($eid);
&sbfile_update_datafile('tb');
&sbfile_update_datafile('ent');
&sbres_build_files($eid);
}
};
&sblock_unlock($lfile) if (!$@);
&sbres_tb_xml($@) if (!($gIn{'__mode'} eq 'rss' || $gIn{'__mode'} eq 'view'));
&sbres_tb_rss($eid, $num) if ($gIn{'__mode'} eq 'rss');
&sbres_tb_view($eid, $num) if ($gIn{'__mode'} eq 'view');
exit(0);
}
そしてsbres_tb関数の次にしたの関数を追加します。
sub sbres_tb_rss {
my ($eid,$num) = @_;
my $err = 0;
my $aDescLen = 200;
my $data = $gData{'entry'}{$eid}{'ent'};
my $subj = $$data{'subj'};
my $link = &sbcms_permalink($eid,$$data{'date'});
my $sum = &sbcms_make_summary($$data{'sum'},$$data{'body'},$aDescLen,$$data{'form'});
my $aTbLength = 300; # トラックバック文字数
my $num = 0;
my $data = $gData{'entry'}{$eid}{'tb'};
my @order = @{$data};
@order = reverse(@order) if ($gEnv{'conf'}{'tb' . '_sort'} == 1);
print 'Content-Type: text/xml;',"\n\n";
print '<?xml version="1.0" encoding="euc-jp"?>',"\n";
print '<response>',"\n";
print '<error>1</error>',"\n" if ($err);
print '<message>',$err,'</message>',"\n" if ($err);
print '<error>0</error>',"\n" if (!$err);
if (!$err) {
print '<rss version="0.91">',"\n";
print ' <channel>',"\n";
print ' <title>',$subj,'</title>',"\n";
print ' <link>',$link,'</link>',"\n";
print ' <description>',$sum,'</description>',"\n";
print ' <language>','ja-jp','</language>',"\n";
foreach my $elem ( @order ) {
next if ($$elem{'id'} eq '');
next if ($$elem{'stat'} == 0);
print ' <item>',"\n";
print ' <title>',$$elem{'subj'},'</title>',"\n";
print ' <link>',$$elem{'url'},'</link>',"\n";
print ' <description>',&sbcms_make_summary('',$$elem{'body'},$aTbLength,1),'</description>',"\n";
print ' </item>',"\n";
}
print ' </channel>',"\n";
print '</rss>',"\n";
}
print '</response>',"\n";
return();
}

Comments
Comment Form