書名をずらずらと羅列するスクリプト

投稿日:

blog.bulknews.netさんのサイドバーには「Now Reading」というハコがあります。現在読んでる本の書名をリンク付きで羅列するハコ。

blog.bulknews.netさんのこのハコはaws.pl - MT plugin for Amazon webservicesというプラグインで実装されてるのですが、コレを見たテキストサイト(非blog)管理者の某氏が

「コレええなぁ。こんなのが簡単に作れるならblogもエエなぁ」

と言ってるのを聞いて、ちょっと考え込んでしまったワタシ。

「確かにこの機能はMTのプラグインで実装されてるけど、これは別にMTのプラグインじゃなくても実装出来る機能な訳で、現状の某氏のトコでも、簡単なアプリケーションとBookMarkletの組み合わせで使えるように出来るんじゃなかろか??」

ということで、実験と勉強を兼ねてPHPで実装してみました次第。

そもそもこのサイトの前身(最初は漢字で「破壊王工務店」だった。ソレ以前にも歴史があるが、黒歴史につきすでに記録抹消済(笑))は、ワタシが買うた本を知人の皆さんに告知→

「こんなの買うたから読みたいヒト居たらワタシんちまで見に来るといいよ」

というサイトだったので、ワタシ的にも使い道がありそうだし。

実装にあたっての目標は↓こんな感じ。

  1. 極力簡単な操作で書名とAmazonへのリンクを含むHTMLを作成出来ること
  2. 並んだ書名が一定数で自動的にフェイドアウトすること
  3. 簡易な認証を実装すること
  4. 静的ページからの読み込みにはSSIを使う

某氏んトコはMySQLが使えないサーバなので、データはテキストファイルで管理することにします。ワタシは未だに「データベースを使わないスクリプト」を書いたことが殆どなかったので、勉強になりました。

cookieも今回初使用。

ファイル内容。phpはperlと比べパーミッションに気を使う場面が少ないですが、ファイルを読み書きするので対象ファイルを読み書き可能な属性にしておく必要があります。

ファイル名 パーミッション ファイル内容
reading.php 644 スクリプト本体
reading.log 666 ログファイル
reading.htm 666 出力されるHTML

設定箇所は下記の通り。

//初期設定
$logfile = "reading.log"; //ログファイル名
$outputfile = "../reading.htm"; //出力ファイル名
$maxcount = 5; //最大ログ数
$amazon = "crusherfactor-22"; //AmazonのアソシエイトID
$password = "password"; //動作時のパスワード

パスワードとアソシエイトIDはかならず変更してください。他はまぁ、環境に応じて適当に。

使用法>

書名を羅列する

↑このリンクをブラウザのリンクバーかお気に入り(ブックマーク)にドラッグします。IEだと警告が出ますが、気にしなくて大丈夫。

リンクの中身は、こんな感じ。

javascript:var cgi='https://crusherfactory.net/~yas_/reading/reading.php';d=document;var tl=d.title.substr(13).split(': ');var t=escape(tl[1]);var url=escape(d.location.href);if(d.location.hostname.substr(4,6)=='amazon'){text=escape(t)+'%250D%250AISBN:'+url.substr(43,10);}void(window.open(cgi+'?text='+text,'_blank','scrollbars=yes,width=450,height=500,status=yes,resizable=yes,scrollbars=yes'))

先頭のURL部分を適当に書き換えて使ってください。なお、このBookMarkletはAUSGANG SOFTさんのものをほぼそのままパクらせて頂いてます。大感謝m(__)m

また、このBookMarklet(JavaScript)にによってエンコードされた文字列をデコードするため、

IEのJavascriptでescape()された文字列をデコード - サイケデリックビビアン

のuniDecode()関数を使わせて頂きました。重ねて多謝!m(__)m

Amazonにて目的の商品を表示させた状態で上記BookMarkletをクリックすると

040724a.gif

↑こんな画面がポップアップします。ここで「送信」ボタンを押すとフォームの内容をログファイルに書き込み、「ファイル作成」ボタンを押すとログファイルの内容をHTMLに書き出します。そんだけ。

あとは「書名の羅列を表示したいページ」に

<!--#include file="reading.htm" -->

とか書いとけばいいです。上記はSSIのファイル読込なんで、勿論このページはSSIを使える必要があります。

<?php include 'reading.htm'?>

PHPなら↑こんな感じ。

既知のバグ>

パスワードをcookieに保存する場合、直後は「cookieに保存」が効きません。一度スクリプトをリロードすると効くようになります。cookieへの保存と読み込みのタイミングによるんですが、いい解決法を思いつかなかったので放置(^_^;)

また、書名をログに書き込んだあと、書名が日本語だとフォーム内の文字が化けます。

これも直す気になれば直せるんすが、「同じ書名を連続で書く」状況はあり得ないと思うので放ってます。フォーム内容が化けてるだけで、「送信」ボタンを押さない限り、ログその他にはまったく影響ありません。(押すとゴミがそのままログに書込まれちゃうので注意)

あと、上掲スクリプトはココのMTに適合したEUC-JP用→SJISやUTF-8な環境では日本語が化けちゃうので改造が必要です。

PHPは大抵EUCのほうが都合いいので、ログファイルまではEUCで、HTMLに日本語を出力する2箇所を

fwrite($op,mb_convert_encoding("読みかけの本\n", "SJIS", "EUC-JP"));

fwrite($op,mb_convert_encoding($title . "\n", "SJIS", "EUC-JP"));

それぞれ↑こんな風に改造するのがいいかと。(要マルチバイト文字列(mbstring)関数)


ファイル読み書き関連にノウハウが無いので、未だいろいろといじってます。fopenをr+モードで使うとログ末尾にゴミが残る症状が多発したので、rで開いて読み込んで一旦閉じ→wで開いて書込むように変更しました。これで大丈夫かな??