書名羅列スクリプト改 reading.php
書名を羅列したHTMLを作成するPHPスクリプトってのを公開しましたところ、稚拙なスクリプトにも関らずそれなりの反応や要望を頂きました。
頂いた要望は
ざっとこんな感じ。
ということで、拙作スクリプトを上記要望に添えるようなカタチになるよう書き換えてみました。
「SJISやUTF-8対応」は、マルチバイト文字列(mbstring)関数が有れば簡単です。最終的に出力する文字列のうち、日本語のものをmb_convert_encoding()で変換すればいいだけ。(内部的にはEUC-JPのまま)
こうして見ると、多コード対応は最初からしてても良かったですね(^_^;)
画像表示は、ちょっと苦労しました。
Amazonのサムネイルサイズ画像は
https://images-jp.amazon.com/images/P/4757512260.09.THUMBZZZ.jpg
例えば↑こんなURLで表現されます。
で、「上記画像をリクエストしてエラーが返って来た場合」という処理を実験してみたのですが、これが上手くいかない。何故か、エラーが出ません。
実験を繰り返した結果、どうも「https://images-jp.amazon.com/images/P」以下へのリクエストで「存在しないファイル名」を指定した場合、1*1ピクセルの透明画像を返してくる→エラーを返して来ない模様。
これは言うまでもなく(画像が存在しなくても赤い『×』が出ない、という意味で)非常に良い手なのですが、画像の有無を調べたい場合にはちょっと困る→思案の末、エラーではなく「取得した画像の横幅」を調べるようにしました。
まず一番小さな(=回線負荷の少ない)サムネイルファイルを探し、これが駄目なら標準サイズ画像を探し、これも無い場合は自前の「無いよ画像」のファイル名を返す...というアルゴリズムで画像ファイル名を生成します。
そのため、羅列する本の数にもよりますが、「ファイル生成」ボタンを押すと、ちょっと考え込んで返ってくるまで時間が掛かります(^_^;) これはファイル作成時に裏でAmazonと通信し、ファイルが有るか無いかを1つ1つ判定しているため。
JavaScriptでの表示は、こちらで組み込ませて頂いたプチログを、大いに参考にさせて貰いました。外部スタイルシートの使い方とかも、殆どココからパクらせて(^^;貰ってます。重ねて感謝!
ファイル名 パーミッション ファイル内容 reading.php 644 スクリプト本体 reading.log 666 ログファイル reading.inc 666 出力JavaScriptファイル reading.css 644 スタイルシート no-image.png 644 「無いよ」画像
スクリプト側の設定部分は先頭部に集中してます。
$logfile = "reading.log"; //ログファイル名
$outputfile = "reading.inc"; //出力ファイル名
$maxcount = 10; //最大ログ数
$str_width = 100; //書名の最大表示文字幅
$label = "読みかけの本"; //書名表示部のタイトルラベル
$close = "true"; //ファイル作成後のウインドウ閉
$thumb = "true"; //サムネイル表示
$password = "password"; //動作時のパスワード
$encoding = "EUC-JP";
//出力ファイルのエンコーディング形式
//EUC-JP, UTF-8, SJIS等を指定してください
$amazon = "crusherfactor-22";
//AmazonのアソシエイトID。持ってない場合は空にしときませう
$style = 'https://crusherfactory.net/~yas_/reading/reading.css';
//スタイルシートのパス
$noimage = "reading/no-image.png";
//サムネイルファイルが無い場合に表示する「無いよ」画像。
//MT等で「呼出元ファイルのディレクトリ変更が予想される」場合は
//相対指定でなく、ちゃんとURLで指定
//表示形態等については添付のスタイルシートで調整のこと
//初期設定終了
たぶん、太線部さえ設定すればそれで動くだろうと思います。なお、当スクリプトは文字コード/改行コードにEUC/LFを使っているのでWindows付属のメモ帳等では書き換えできません。EUC対応のエディターを使ってください。
あとは、スタイルシートも含めて適当に変えてください。「文字幅」ってのは「半角文字何文字分に相当する幅か」ということです。全角文字のみだと「設定数値の半分」数の文字が表示されます。
BookMarkletは前と同じで大丈夫です。Amazonで羅列したい本を表示した状態でBookMarkletを呼び出し、「送信」を押して「ファイル作成」を押すことでインクルードされるJavaScriptファイル「reading.inc」が生成されます。
その後、HTML(またはXHTML)の書名を表示したい部分に
とか書いておけばOK!(^_^)
なお、このサイトではたまたまMovable Typeのサイドバーに組み込んで使ってますが、MTの機能を何も使ってないスタンドアロンなスクリプト→mbstring可能なPHPが使える環境であれば、HTMLな非blogサイトでもそのまま使えます。