ごとむにっき
先月 2006年05月 来月
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 31

2006年05月14日() [n年日記]

#1 IRCボットplumのメッセージログ中からURLだけ抜き出してHTTPやRSS表示する

plum-logurl.cgiの概要:

私は、IRCボットとして を使っている。 この中の log/daily.plm モジュールを有効にすると、 毎日ログファイルへチャネルメッセージを記録してくれる。 会話の中には、面白いURLが紹介されていることがある。 しかし、端末の前に常時いないと見落としてしまうものだ。

そこで、plum 出力ログファイルの中からURLだけを抜き出して、 ブラウザなどへHTML/RSS表示するツール を作ってみた。

これは非常に単純で、cgiページをアクセスすると本日のURL一覧を HTMLまたはRSS形式で表示する。 いちおう日付指定ができるようになっている。設置方法は、上記cgi を適当に配置して、ファイル中4変数をカスタマイズして終わりである。

HTMLとRSSを表示させる方法:

ここ以降の話は私の単なるメモ。結構皆さんご存じな話だとは思いますが。

CgiスクリプトでHTMLとRSSを同時サポートするのは結構簡単に実現できる。 両者は似たフォーマットで記述するため。 以下にPerlを使ったcgiでHTML, RSS表示を両方サポートするコード例を載せる。
  1. まず、最初に返す文字列で html か xml (RSS) かを指示する。
     HTMLの場合: print "Content-type: text/html\n\n";
     XMLの場合:  print "Content-type: text/xml\n\n";
    
  2. ヘッダを返す。XMLのはblosxomのをそのままパクってしまったが…ちょっとこれは古い記述かも。
     HTMLの場合:
    	print <<EOF;
    	<!DOCTYPE HTML PUBLIC \"-/W3C//DTD HTML 4.0 Transitional//EN\">
    	<HTML><HEAD><TITLE>タイトル</TITLE></HEAD><BODY>
    	EOF
     XMLの場合:
    	print <<EOF
    	<?xml version=\"1.0\"?>
    	<!-- name=\"generator\" content=\"ソフト名\" -->
    	<!DOCTYPE rss PUBLIC \"-//Netscape Communications//DTD RSS 0.91//EN\"
    	 \"http://my.netscape.com/publish/formats/rss-0.91.dtd\">
    	<rss version="0.91">
    	 <channel>
    	  <title>タイトル</title>
    	  <link>このRSSのリンク名</link>
    	  <description>何か説明やタイトルでも書く</description>
    	  <language>en</language>
    
  3. 一覧を書き出す。今回はURLリストが表示できれば良い。各エントリは次のような形で表示。 URL名に含まれるHTML的にまずい文字は変換した方が良い。
     HTMLの場合 ($URLにはURL名が入っているものとする):
    	print "<A HREF=$URL>$URL</A><BR>\n";
     XMLの場合:
    	print "<item><title>$URL</title><link>$URL</link>";
    	print "<description>$URL</description></item>\n";
    
  4. 最後に閉じる記述を書いておしまい。
     HTMLの場合:
    	print "</BODY></HTML>\n";
     XMLの場合:
    	print "</channel></rss>\n";
    
出力するRSSが正常かどうかは、w3cが用意するサイトでチェックできる。 firefoxのLive Bookmark (Bookmark manager -> File -> New Live Bookmark) 機能を用いると RSSリーダを使わずにちゃんと読めるかチェックできる。

リファラについて:

上記のようなcgiを使ってリンク先を読みにいくと、cgiのURLがリファラ元になる。 このリファラ元からcgiのアドレスが漏洩する可能性がある。 これについては注意が必要である。 というのも、自分の会話はともかく他人のIRC会話によって出力されたURLが載っているcgiを、 全くの他人が読む可能性があり、これは面倒を引き起こしそうであるためだ。

そこで、リファラを残さないようにすることを考える。 リファラを消す方法はいくつかあるようだが、リダイレクタを使う方法が汎用的で確実のようだ。 が参考になる。

他の方法として、 というrefreshを使った方法がひとつとしてある。 ただし、 によると、どうもブラウザによってはうまくいかないようだ。 なかなかリファラの話は奥が深そうである。

apacheのファイル毎にBasic認証をかける方法:

ディレクトリ毎に認証をかける方法は結構載っているが、 案外ファイル毎は載ってないので念のため記載。
  1. まず認証をかけるディレクトリに以下を記述した .htaccess ファイルを置く。
     <Files target-filename>
     AuthUserFile /home/.../targetdir/.htpasswd ← フルパスで
     AuthName "Authentication Required"
     AuthType Basic
     AuthGroupFile /dev/null
     require valid-user
     </Files>
    
    なお、apacheのドキュメントによれば、.htaccessでやるよりもメイン設定ファイル httpd.conf で制御した方が性能上有利らしい。個人ベースで管理するなら .htaccess で十分かも。
  2. パスワードを生成する。.htpasswd ファイル内にユーザ名:パスワードの組ができる。
     > ls -a
     .   ..   .htaccess   target-filename
     > htpasswd -c .htpasswd username
     パスワードを入力
     > ls -a
     .   ..   .htaccess   .htpasswd   target-filename
    
  3. .htaccess, .htpasswd のパーミッションを制御しておしまい。

thanks to::

ar-さん、ayさん、hanzubonさん、mrmtさん他に色々(ほとんど?)教えてもらいました。thanks!

以上、1 日分です。
タイトル一覧
カテゴリ分類
Powered by hns-2.19.5, HyperNikkiSystem Project