web拍手改造

一言メッセージコールバック機能をつける

 2005年はこととねにおけるweb拍手年を合言葉に、web拍手関連文書を次々リリースしてきたのは周知の事実であるが、しかし2005年が過ぎてしまってもweb拍手文書は公開される。ネタがあれば、ネタさえあればこととねにおけるweb拍手関連文書は増え続けるのである。

 というわけで、随分ご無沙汰のweb拍手改造記事。今回扱おうというのは、登録版web拍手にあってダウンロード版web拍手にはない、一言メッセージをコールバックする機能だ。これ、一体いつごろついたんだろう。おそらくは2006年の中ごろだと思うんだが、ある日ふと拍手を送ってみると、自分の送った直前の文章がお礼画面に表示されるようになっていた。これ、ちょっとした工夫であるが、実に便利な機能だ。自分の送った文章、それがたとえつい今し方書いたものであったとしても、忘れてしまうのが私という人間で、ところが今はコールバック機能があるおかげで、安心して続きを書けるようになった。

 しかし、この機能を利用できるのは、登録版web拍手ユーザーだけだ。web拍手CGIユーザーがコールバック機能を利用したいと思えば、自分で改造するしかないわけだ。なので、

CGIを改造する

 今回改造するのはclap.cgiだけだ。改造個所も少ない、手軽な改造であるといえるだろう。

一言メッセージの変数を見つける

 さて、一言メッセージをお礼画面に表示するわけだが、となると入力された一言メッセージを見つけ出す必要がある。つまり、一言メッセージがセットされている変数を見つければいいのだが、ではこいつは一体どこにあるのだろう。

 単純に考えると、一言メッセージをログファイルに保存するあたりを見ればわかりそうな気がする。なので、一言メッセージを処理している個所、具体的にいうとclap.cgiの114行目あたりを見てみよう。

 114行目に一言メッセージの処理というコメントがあるのがわかるだろう。つまりここで一言メッセージが処理されるわけだが、問題の変数はその次の行、115行目に早速あらわれている。そう。$hitokotoが一言メッセージを扱うための変数である。今回はこれをそのまま流用できる。

コールバック処理を追加する

 一言メッセージを扱っている変数がわかったので、次はこれをどこに表示してやるかが問題となるだろう。clap.cgiにおけるHTML出力関係の処理は、HTML表示とのコメントがある129行目から始まっている。ここで我々は、一言メッセージのコールバックが一体お礼画面のどこに出力されるかを知る必要がある。というわけで、私はお気に入りの漫画家のサイトにいって応援のメッセージを送ってきたのだが、すると一言メッセージのコールバックはお礼メッセージの後、拍手ボタンの前に出ることがわかった。つまり、我々は一言メッセージをコールバックするための処理を、お礼メッセージの直後に書いてやればいいというわけだ。

 具体的にどこに書くかというと、clap.cgiの143行目だ。142行目でお礼メッセージが出力され、144行目からはさらに送るボタンと一言メッセージ用フォームを出力するための処理が開始されている。だから、143行目に書くのが一番都合がいいわけだ。

追加するコード

 clap.cgi、143行目には次のようなコードを追加するといいだろう。

if ($hitokoto) {
    print '<p>以下のメッセージが送信されました。<br>';
    print "<strong>$hitokoto</strong></p>";
}

 この直前に、一言メッセージのコールバック処理をしているとわかるように、コメントを加えてもいいかも知れない。こんな風に。

#------一言メッセージのコールバック
if ($hitokoto) {
    print '<p>以下のメッセージが送信されました。<br>';
    print "<strong>$hitokoto</strong></p>";
}

 この処理にif文が使われているのは、一言メッセージが送られた場合にのみコールバック処理をおこなうためだ。Perlはよくしたもので、ifの条件に、中身の入っていない変数(長さ0の文字列や未定義、undefなど)が指定されていると、自動的に偽と判定してくれるのだ。つまり、一言メッセージが入っている(変数$hitokotoに文字列が入っている)とif文の内容が実行され、一言メッセージが入っていないなら、なにもしないまま終わる。つまり、メッセージが送られていないにも関わらず、以下のメッセージが送信されました。と表示されるようなことはないわけだ。

 なお、if文のブロック内でおこなわれているのは、単純なhtmlの出力だけなので、自由に書き換えて構わない。例えば、私は次のように書いている。

if ($hitokoto) {
    print '<div class="your_message"><h2>以下のメッセージが送信されました。</h2>';
    print "<p>$hitokoto</p></div>\n";
}

 ここで気をつけなければならないのは、変数$hitokotoを表示させるところは、シングルクォート(')ではなくダブルクォート(")でくくらなければならないことだろう。Perlのルールでは、シングルクォートでくくられた文字列内では変数は展開されないのだ。だから、もし間違えて$hitokotoをシングルクォートでくくってしまうと、そのまま$hitokotoと変数名が表示されてしまうことになる。

 なので、$hitokotoを含む文字列はダブルクォートでくくるよう気をつけて欲しい。

余談

 もし一言メッセージにHTMLなどが入力されていたらどうなるのだろうと心配する人もあるかも知れないが、web拍手CGIについてはその心配は無用である。

 clapinit.cgi、102行目(フォームのデコード処理)からを見れば、タグ処理及び改行処理がなされていることがわかる。HTML中に現れて問題となるような文字、「&」、「"」、「<」そして「>」が文字実体参照に置き換えられている。

 なので、踏めばJavaScriptが実行されてしまうようなリンクを作成される心配はないわけだ。どうぞ安心していただきたい。


<   >

わたしの愛した機械へ トップページに戻る

公開日:2007.04.21
最終更新日:2007.04.21
webmaster@kototone.jp
Creative Commons License
こととねは、クリエイティブ・コモンズ・ライセンス(表示 - 継承 2.1 日本)の下でライセンスされています。