@
plum-logurl.cgiの概要:
私は、IRCボットとして
を使っている。
この中の log/daily.plm モジュールを有効にすると、
毎日ログファイルへチャネルメッセージを記録してくれる。
会話の中には、面白いURLが紹介されていることがある。
しかし、端末の前に常時いないと見落としてしまうものだ。
そこで、plum 出力ログファイルの中からURLだけを抜き出して、
ブラウザなどへHTML/RSS表示するツール
を作ってみた。
これは非常に単純で、cgiページをアクセスすると本日のURL一覧を
HTMLまたはRSS形式で表示する。
いちおう日付指定ができるようになっている。設置方法は、上記cgi
を適当に配置して、ファイル中4変数をカスタマイズして終わりである。
- $docpath: plumログファイルが置かれているディレクトリ(ログファイルは YYYYMMDD.log 形式であることを想定)
- $redirector: cgiページがリファラとして記録に残りたくない場合にリダイレクタを使う場合に指定。使わないならアドレスは空白でOK
- $urltitle: 表示のタイトル。何でも良い。
- $rsslink: RSSにリンクさせるときのリンク名。
@
HTMLとRSSを表示させる方法:
ここ以降の話は私の単なるメモ。結構皆さんご存じな話だとは思いますが。
CgiスクリプトでHTMLとRSSを同時サポートするのは結構簡単に実現できる。
両者は似たフォーマットで記述するため。
以下にPerlを使ったcgiでHTML, RSS表示を両方サポートするコード例を載せる。
- まず、最初に返す文字列で html か xml (RSS) かを指示する。
HTMLの場合: print "Content-type: text/html\n\n";
XMLの場合: print "Content-type: text/xml\n\n";
- ヘッダを返す。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>
- 一覧を書き出す。今回は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";
- 最後に閉じる記述を書いておしまい。
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認証をかける方法:
ディレクトリ毎に認証をかける方法は結構載っているが、
案外ファイル毎は載ってないので念のため記載。
- まず認証をかけるディレクトリに以下を記述した .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 で十分かも。
- パスワードを生成する。.htpasswd ファイル内にユーザ名:パスワードの組ができる。
> ls -a
. .. .htaccess target-filename
> htpasswd -c .htpasswd username
パスワードを入力
> ls -a
. .. .htaccess .htpasswd target-filename
- .htaccess, .htpasswd のパーミッションを制御しておしまい。
@
thanks to::
ar-さん、ayさん、hanzubonさん、mrmtさん他に色々(ほとんど?)教えてもらいました。thanks!