書名をずらずらと羅列するスクリプト
blog.bulknews.netさんのサイドバーには「Now Reading」というハコがあります。現在読んでる本の書名をリンク付きで羅列するハコ。
blog.bulknews.netさんのこのハコはaws.pl - MT plugin for Amazon webservicesというプラグインで実装されてるのですが、コレを見たテキストサイト(非blog)管理者の某氏が
「コレええなぁ。こんなのが簡単に作れるならblogもエエなぁ」
と言ってるのを聞いて、ちょっと考え込んでしまったワタシ。
「確かにこの機能はMTのプラグインで実装されてるけど、これは別にMTのプラグインじゃなくても実装出来る機能な訳で、現状の某氏のトコでも、簡単なアプリケーションとBookMarkletの組み合わせで使えるように出来るんじゃなかろか??」
ということで、実験と勉強を兼ねてPHPで実装してみました次第。
そもそもこのサイトの前身
「こんなの買うたから読みたいヒト居たらワタシんちまで見に来るといいよ」
というサイトだったので、ワタシ的にも使い道がありそうだし。
実装にあたっての目標は↓こんな感じ。
- 極力簡単な操作で書名とAmazonへのリンクを含むHTMLを作成出来ること
- 並んだ書名が一定数で自動的にフェイドアウトすること
- 簡易な認証を実装すること
- 静的ページからの読み込みには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だと警告が出ますが、気にしなくて大丈夫。
リンクの中身は、こんな感じ。
先頭のURL部分を適当に書き換えて使ってください。なお、このBookMarkletはAUSGANG SOFTさんのものをほぼそのままパクらせて頂いてます。大感謝m(__)m
また、このBookMarklet(JavaScript)にによってエンコードされた文字列をデコードするため、
IEのJavascriptでescape()された文字列をデコード - サイケデリックビビアン
のuniDecode()関数を使わせて頂きました。重ねて多謝!m(__)m
Amazonにて目的の商品を表示させた状態で上記BookMarkletをクリックすると
↑こんな画面がポップアップします。ここで「送信」ボタンを押すとフォームの内容をログファイルに書き込み、「ファイル作成」ボタンを押すとログファイルの内容をHTMLに書き出します。そんだけ。
あとは「書名の羅列を表示したいページ」に
とか書いとけばいいです。上記はSSIのファイル読込なんで、勿論このページはSSIを使える必要があります。
PHPなら↑こんな感じ。
既知のバグ>
パスワードをcookieに保存する場合、直後は「cookieに保存」が効きません。一度スクリプトをリロードすると効くようになります。cookieへの保存と読み込みのタイミングによるんですが、いい解決法を思いつかなかったので放置(^_^;)
また、書名をログに書き込んだあと、書名が日本語だとフォーム内の文字が化けます。
これも直す気になれば直せるんすが、「同じ書名を連続で書く」状況はあり得ないと思うので放ってます。フォーム内容が化けてるだけで、「送信」ボタンを押さない限り、ログその他にはまったく影響ありません。(押すとゴミがそのままログに書込まれちゃうので注意)
あと、上掲スクリプトはココのMTに適合したEUC-JP用→SJISやUTF-8な環境では日本語が化けちゃうので改造が必要です。
PHPは大抵EUCのほうが都合いいので、ログファイルまではEUCで、HTMLに日本語を出力する2箇所を
fwrite($op,mb_convert_encoding($title . "\n", "SJIS", "EUC-JP"));
それぞれ↑こんな風に改造するのがいいかと。
ファイル読み書き関連にノウハウが無いので、未だいろいろといじってます。fopenをr+モードで使うとログ末尾にゴミが残る症状が多発したので、rで開いて読み込んで一旦閉じ→wで開いて書込むように変更しました。これで大丈夫かな??