hns - 日記自動生成システム - Version 2.19.7

void GraphicWizardsLair( void ); //

otsune GWL
FreeBSD, AfterEffects, RETAS, animo, DigitalAnime, Linux, Mac OS, Win2k

[Who is otsune?] [title] [message] [Policy] [注目エントリー] [top]
Twitter Status :


Namazu for hns による簡易全文検索
詳しくは 詳細指定/ヘルプを参照して下さい

検索式:

先月 2005年06月 来月
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30


2005年06月25日() [長年日記]

#4 [hns] hns-tb.cgiに「__mode=rss」をつける

ishinaoの日記_
個人的には、「日記本文HTML中にその日記に対するTrackBack Ping URL?がRDF形式で埋め込まれており、そのTrackBack Ping URLに__mode=rssという引数をつけて呼ぶと、その日記に対するTrackBack一覧がRSS形式で取得できる」という仕様を実装してもらえるとありがたいなーと思っています。
というのが書かれていて、ふとhns-tb.cgiにその機能が未実装だということに気が付いた。
とりあえずこういうときはめんどくさいので Blog Developer's Cookbook : Trackback Ping 一覧を RSS 出力する_ からほぼパクって、テキトーに書き換える。
ねぎ式_ で配布している状態とのdiffという感じで。
--- hns-tb.cgi.orig	Thu Feb 10 17:12:57 2005
+++ hns-tb.cgi	Sat Jun 25 09:36:26 2005
@@ -7,10 +7,75 @@
 use Jcode;
 use SimpleDB::Scalar;
 use vars qw($DataDir);
+use HNS::System;
+use XML::RSS;
 
 require './config.ph';
 
 $DataDir ||= "$HNS::System::DiaryDir/trackback/";
+our $tb_prefix = jcode($HNS::System::Title)->utf8 ;
+our $tb_link   = "${HNS::System::MyDiaryURI}hns-tb.cgi";
+
+sub hack_rss_node {
+    my $rss = shift;
+    $rss =~ s@<\?xml .*?>\n*@@s;
+    $rss =~ s@<!DOCTYPE rss .*?>\n*@@s;
+    return $rss;
+}
+
+sub send_rss {
+    my($cgi, $rss) = @_;
+    my $rss_node = hack_rss_node($rss->as_string);
+    print $cgi->header('text/xml'), <<XML;
+<?xml version="1.0" encoding="utf-8"?>
+<response>
+  <error>0</error>
+  $rss_node
+</response>
+XML
+    ;
+}
+
+sub show_rss {
+    my($cgi, $id) = @_;
+    my $rss = XML::RSS->new(version => 0.91);
+    $rss->channel(
+        title => "$tb_prefix: $id",
+        link  => "$tb_link/$id",
+        description => "Trackback Discussion on $id",
+    );
+
+	open (F, "<$DataDir/$id") or error($!);
+	while(<F>){
+		my ($title, $excerpt, $url, $blog_name) = split("\t",$_);
+	        $rss->add_item(
+			title => jcode($title)->utf8,
+			link  => $url,
+        	);
+	}
+	close (F);
+    send_rss($cgi, $rss);
+}
+
+sub sendmail($)
+{
+	my $msg = shift;
+	my $email = $HNS::System::UserMail;
+	my $tomail = $HNS::System::MesMail;
+	my $sendmail = '/usr/local/bin/sendmail -t -f';
+
+	my $mail = "";
+	$mail .= "To: $tomail\n";
+	$mail .= "From: $email\n";
+	$mail .= "Content-Type: text/plain; charset=iso-2022-jp\n";
+	$mail .= $msg;	
+
+	Jcode::convert( \$mail, "jis");
+	open(OUT, "| $sendmail $tomail");
+	print OUT $mail;
+	close(OUT);
+	exit;
+}
 
 sub html_convert
 {
@@ -82,27 +147,16 @@
 
 my ($id) = ($ENV{REQUEST_URI} =~ m!cgi/(\d{9}\d*)!);
 
-#error 'invalid id' unless($id =~ /\d+/);
+error 'invalid id' unless($id =~ /\d+/);
 
-my $cgi = new CGI;
+my $cgi = CGI->new();
+   $cgi->charset('utf-8');
 
 if($cgi->param('__mode') eq 'rss'){
-    print "Content-Type: text/xml\r\n\r\n";
-    print "RSS\n";
+	show_rss($cgi, $id);
     exit;
 }
 
-$id = $cgi->param('tb_id') unless($id =~ /\d+/);
-error 'invalid id' unless($id =~ /\d+/);
-
-#my $id = "";
-#
-#my @params = $cgi->param();
-#foreach my $param (@params) {
-#  $id = sprintf("%s%s\t%s\n", $id,$param,$cgi->param($param));
-#}
-
-
 my $title = jcode($cgi->param('title'))->euc;
 my $excerpt = jcode($cgi->param('excerpt'))->euc;
 my $url = jcode($cgi->param('url'))->euc;
@@ -113,10 +167,16 @@
 my $orig_excerpt = $excerpt;
 my $orig_url = $url;
 my $orig_blog_name = $blog_name;
+my $blog_name_subject = jcode($blog_name)->mime_encode;
 
 # URL が空だったら error;
 error "URL is empty" unless($url);
 
+#block trackback spam
+if ($url =~ /casino/){
+error 'You are not allowed to send TrackBack pings'; 
+}
+
 # 要約は 255 文字程度で折る
 $excerpt = truncate_body($excerpt, 255);
 
@@ -130,8 +190,6 @@
 print F "\n";
 close F;
 
-system("chmod 666 $DataDir/$id"); 
-
 print "Content-Type: text/xml\r\n\r\n";
 print <<EOF;
 <?xml version="1.0" encoding="iso-8859-1"?>
@@ -146,24 +204,15 @@
 $last_modified = time;
 untie $last_modified;
 
-my $mailto = 'ore@yar-3.net';
-my $sendmail = '/usr/lib/sendmail';
+	my $mail = "";
+	$mail .= "Subject: [hns] trackback $blog_name_subject $id\n";
+	$mail .= "\n";
+	$mail .= "title: $orig_title\n$orig_blog_name\n";
+	$mail .= "$orig_excerpt\n $orig_url\n";
+	$mail .= "-- \n";
+	$mail .= "trackback sender by $HNS::System::Author\n\n";
+	$mail .= "from $ENV{'REMOTE_HOST'} $ENV{'REMOTE_ADDR'}\n";
+	$mail .= "UA $ENV{'HTTP_USER_AGENT'} \n";
+
+sendmail($mail);
 
-     my $msg = "";
-     $msg .= "To: $mailto\n";
-     $msg .= "From: $mailto\n";
-     $msg .= "Content-Type: text/plain; charset=iso-2022-jp\n";
-     $msg .= "Subject: trackback $orig_blog_name $id\n";
-     $msg .= "\n";
-     $msg .= "title: $orig_title\n$orig_blog_name\n";
-     $msg .= "$orig_excerpt\n $orig_url\n";
-     $msg .= "-- \n";
-     $msg .= "trackback sender by yar-3\n\n";
-     $msg .= "from $ENV{'REMOTE_HOST'} $ENV{'REMOTE_ADDR'}\n";
-     $msg .= "UA $ENV{'HTTP_USER_AGENT'} \n";
-
-
-     Jcode::convert( \$msg, "jis");
-     open(OUT, "| $sendmail $mailto");
-     print OUT $msg;
-     close(OUT);
サーバーにXML::RSSモジュールが無いのであればsub_showrssで
sub add_item {
    my ($title, $url) = @_;
    my $item = <<"RSS";
<item>
  <title>$title</title> 
  <link>$url</link> 
</item>
 RSS
;
   return $item;
}
みたいなsubを呼んで追記するのでもいいかもしれない。

コメントを読む(1) [ コメントする ]

Re: hns-tb.cgiに「__mode=rss」をつける by maki    2005/06/25 16:03
これって2003年の話なんですね。 はてなアイディアにも出してあるのですが未だに実装...
Permalink: http://www.otsune.com/diary/2005/06/25/4.html#200506254
trackback
このエントリーを含むはてなブックマーク del.icio.us livedoor Clip View blog reactions
Last Updated 2005-06-25 00:00:00 By otsune