qrcode.inc.php†
サマリ | QRコード表示プラグイン |
リビジョン | 0.5 |
対応バージョン | 1.4 |
投稿者 | みこ |
投稿日 | |
qrcodeプラグイン by miko†
- 概要
- 最近あちこちで使われている2次元バーコードのQRコードをPNG画像で表示するプラグインです。もともとは、ドコモなどの携帯リンクを常にMenuBarに表示させたいという目的からつくってみました。
ダウンロード†
わたしのサイトに最新をおきますので、→こちらへ
設置方法(qrcode-0.5.zipの場合)†
- デフォルト環境での設置について
みこ氏のページにあるファイルをローカルにて解凍したときに3つのフォルダが出てきます。
- \plugin
- \image
- \data
これらのフォルダを各ディレクトリに設置してください。
- \pluginの設置場所
wiki設置ディレクトリ\plugin\qrcode.inc.php(通常pluginがまとめて置いてあるところ)
- \imageの設置場所
wiki設置ディレクトリ\image\qr\*.png(imageディレクトリ下にqrディレクトリを作成してください)
- \dataの設置場所
wiki設置ディレクトリ\data\qr\*.dat(wikiの初期状態ではdataディレクトリは存在しませんので新規に作成してください)
はりつける方法については下記の通り†
&qrcode{バーコード化する文字列};
&qrcode(サイズ){バーコード化する文字列};
&qrcode(サイズ,訂正方法){バーコード化する文字列};
&qrcode(サイズ,訂正方法,バージョン){バーコード化する文字列};
&qrcode(サイズ,訂正方法,バージョン,分割数){バーコード化する文字列};
引数については、みこ氏のページをご参照ください。
コメント†
- nao-pon
おもしろそうですね。 :D 頂戴いたしました。
$d = mb_convert_encoding($d,'SJIS',SOURCE_ENCODING);
の前に
$d = str_replace("<br />","\r\n",$d);
$d = strip_tags($d);
を追加するといいかも。
- 名無しさん
XSSの脆弱性が存在します。
else {
return FALSE;
}
+ $s = htmlspecialchars($s);
+ $e = htmlspecialchars($e);
+ $v = htmlspecialchars($v);
+ $n = htmlspecialchars($n);
+ $d = htmlspecialchars($d);
// if no string, no display.
if (empty($d)) return FALSE;
- みこ
ご指摘ありがとうございます。以下のように修正しました。(ただ、$d は下の strip_tags によりすでにサニタイズされているはずなのですが・・・)
else {
return FALSE;
}
+ // thx, nanashi and customized
+ $s = intval($s);
+ if ( $s <= 0 ) { $s = 0; }
+ $v = intval($v);
+ if ( $v <= 0 && $v > QRCODE_MAX_VERSION ) { $v = 0; }
+ $n = intval($n);
+ if ( $n <= 0 && $n > QRCODE_MAX_SPLIT ) { $n = 0; }
+ $e = htmlspecialchars($e);
// if no string, no display.
if (empty($d)) return FALSE;
- believe
大変興味があるのですが、GD1.8.4対応にするには、、、。勉強します;;
- 名無しさん
感動しました。ありがとう
- 名無しさん
生成される画像ファイルにFrontPageのHTMLソースがそのまま連結されてしまっているのでサイトによっては処理がかなり重くなると思われます。本体に処理を戻すのが原因のようなので
return QRcode($qr);
となっているところを
echo QRcode($qr);
die();
と変更することで回避ができました。
- 名無しさん
もひとつ。現在24Bitカラーなので減色も入れてみました。
ImagePng($output_image);
の手前で1Bit(2色)インデックスカラーに変更します。
ImageTrueColorToPalette($output_image,false,2);
ImagePng($output_image);
これでファイルサイズは1KBをきるようになるはずです。
- みこ
上記、回避コードおよび減色を入れて0.4としました。
- micono
miconoといいます。qrcodeのこと検索していたら、mikoさんのページが引っかかりました。ハンドル名(ページ名)が似てて、びっくりしました。というかQRCodeの作成/読取りのソフトを私も作ってるし!(http://micono.hp.infoseek.co.jp)。 swetakeさんのコードは、単一モードでしか吐き出せないし、漢字モードも使えないから、場合によってはもっと小さいバージョンのQRcodeが作れると思って、漢字モード対応と、混在モードでも吐き出せる様に書き換えしてます。mikoさんのは、もうそうなってるんですか?アルゴリズム考えるのが面倒っすよね。JIS仕様書の最後の方にちらっと書いてあるけど、排他的文字集合が、[6、7、8]個とか、意味わからな~い。。(汗)
- みこ
まず、結論から言うと同じ制限(内部でモードの変更ができない+8ビットモードを使用している)はあります。ただ、もともと携帯QR用が出発点だったので、そこまでクリティカルな業務用で使用するわけでもなし、減色している今は多少バージョンが大きくなってもそれほど画像サイズは変わらないし、また日本語だけを相手にすると国際化のときにはろくなことがないので、そのあたりは考慮していません。したがって、swetakeさんのサブセットとおもってもらったほうがいいかもしれません。
- みこ
ただ、今後は引数を加えておこなうのはありかとおもいます。心配なのはアルゴリズムに凝ってしまうとサーバー負荷が高くなるほうを気にしています(^^; どちらかというとアルゴリズムの高速化はいつかはおこなおうとおもっているのですが・・・
- micono
ありがとうございます。確かにサーバー上だと、いらぬことしない方がいいかもね。でもDoCoMoはversion10
- micono
すいません、書きかけで、リターンしてしまいました。DoCoMoはversion10以上読めないみたいだし、数字2文字で11ビット、英文字2文字で10ビットは、効いてきそうな気がします。ネット上で扱うわけじゃ無いので、私は混在モード対応をやろうと思ってますです。
- みこ
たしかに、オフラインでは(version10ぎりぎりで2画面に分割するかしないかで)効いてくるでしょうね。もし、速度的にも良好ならぜひおしえてください⌣
- maja
動作確認…au端末(W21S)○
- みこ
qrcode.inc.php(0.5) で XHTML 1.1 に対応させました。
- Windows + IIS でそのままでは動かなかったので
// QRデータの格納ディレクトリ
define('QRCODE_DATA_DIR', DATA_HOME.'data/qr/');
から
define('QRCODE_DATA_DIR', 'data/qr/');
にしたら動きましたが これでいいのかな・・ -- k
- それっぽいのできるけど コードシンボルありませんって・・・ -- k
- そうですね。まず、 QRCODE_DATA_DIR の中にある DATA_HOME は 1.4.4 のものなので、1.4.3以前の場合は、不要(というわけでもないんですけど (^^; )かもしれません。 -- みこ
- また、注意しなければならないのはQRコードはいっしょですが、各社の携帯フォーマット(もしくは独自フォーマット)に対応しているか注意が必要です。一般的に携帯でQRコードを扱うときのフォーマットはShift_JISですがそのあたりは大丈夫でしょうか? -- みこ
- それでも問題があるばあいは、該当サイトへのリンクもしくは、表示されているQRコードのPNGファイルを添付してもらえませんか? -- みこ
- 文字コードなのかな とりあえず upしたので お時間ある時みてください -- k
- &qrcode(2){MEBKM:TITLE:みこのカフェテラス;URL:http\://cafelounge.net/;;}; -- k.pngの内容
- 上記の方法はdocomoのみの方法(ezweb, vodafoneなどは読めない)ですが、読めない携帯はdocomoのですか? -- みこ
- 検証は携帯電話用QRコードエディタ(psytec)で行いました みこさんのページや ほかのページのコードはこのソフトで 読めました -- k
- うーん、そうすると気がかりなのは2点ですね。1つは、PHPが同梱しているGDのバージョンでこれはGD2.0.11未満だと問題が存在する場合があります。もうひとつは QRCODE_DATA_DIR および QRCODE_IMAGE_DIR で指定されているデータが読み込めていない場合に誤ったデータが表示される可能性があります。 -- みこ
- ちなみに、GD2.0.11以降を標準サポートしているPHPは4.3.2以降になります。(自力でPHPをコンパイルしている場合を除く) -- みこ
- とりあえずバージョン情報です PHP Version 4.3.8 GD bundled (2.0.23 compatible) -- k
$filename=QRCODE_DATA_DIR ."/update.log";
if (!$fp = fopen($filename,"a")){
echo "logfile(QRCODE_DATA_DIR)が開けません";
}else{
fwrite($fp,"ok\n");
fclose($fp);
}
$filename=QRCODE_IMAGE_DIR ."/update.log";
if (!$fp = fopen($filename,"a")){
echo "logfile(QRCODE_IMAGE_DIR)が開けません";
}else{
fwrite($fp,"ok\n");
fclose($fp);
}
- 上記で試してみましたが okみたい -- k
- うーん、あれからいろいろ調べているのですが現象が再現しないです(T-T おそらくは GD の描画か fopen でファイルを開けないor別ファイルを開いているぐらいしか考えられないのですが・・・(PHPがOSバンドルのGDを使用しているとかあります?) -- みこ
- /qrv*.pngを見れなくすると真っ黒 /qrv*.dat見れなくするとベース?のみ /rsc*.dat見れなくするとパターン変化 です GDですかね・・ -- k
- GDはPHP Version 4.3.9(win)のバイナリのものです bundled (2.0.23 compatible) -- k
- ちょっと、わたしのほうでも Windows の PHP 環境作ってやってみます・・・ -- みこ
- えっと、わたしのほうで現存する最新(Apache2.0.52/Win + PHP4.3.9/Win)を Windows 2000 にインストールしても現象は再現しなかったです。。。 -- みこ
- ただ、わたしもPHP4.3.9/Win のバイナリをダウンロードしたのですが、phpinfo でみると GDは 2.0.28 compatible となっていました。php.ini-recommended を使い、extenstion で有効にしたモジュールは bz2, gd2, mb_string, zip です。(その他はインストールのままです。) -- みこ
- もしかするとGD側に問題がある可能性があるかもしれません。(ちなみに PHP はマニュアルインストール(ZIP版)で、SAPIを使用しています(=CGI版ではありません。) -- みこ
- 3キャリア(docomo,ezweb,vodafone)に対応させる場合の(無難な)引数はどうすればいいんでしょうか? --
- 亀レスです (^^; 内容のおはなしなのでちょっとわかりません (..; わたしは特殊コードをわたさずにアドレスだけを入れている場合もあります。 -- みこ
- phpのgd2-extensionを有効にしておかないと「PHP Fatal error: Call to undefined function: gd_info() in qrcode.inc.php on line 158」というエラーが出て止まるのですが、これはバグでしょうか? -- mitty
- はい、QRcodeプラグインは GD2 を必要とします。 GD2 がない場合はエラーとなるかもしれません。(現在は先に GDが存在するかチェックをおこなっています。) -- みこ
- 早速ダウンロードさせていただきましたが,どうも画像が表示されないようです.プラグインはプラグインのフォルダー,イメージはイメージのフォルダーに入れてありますが,QRコードが表示されるはずのところに×ボタン付きの四角い長方形しか表示されません.設置の仕方が間違っているのでしょうか? -- qr
- ×ボタン付きの四角い長方形はQRcode表示時に表示できないとそのようになります。文章から推測するに data フォルダ(←のなかにはQRcode算出用のデータが存在します。)を展開していない可能性があります。 -- みこ
- qrcode.inc.phpのdataディレクトリ指定に、デフォルトで DATA_HOME.'data/qr/'となっています。ここでちょっと苦労しました。実際に配布されているもののデータはdataフォルダに直に入っているので、'data/' に変更しておいた方が良いと思います。 -- Taketan
- はじめまして。PukiwikiMod で使わせて頂いているのですが、どうも@が入ってしまうと化けてしまうようです。解決方法はありますでしょうか? -- Tackmix
- 素晴らしいプラグインありがとうございます。 1.4.7でHPにあるMenubar埋め込みにすると日本語名のあるページのアドレスが化けてるようでサイトに繋がりません。 読み取りはフォーマF902iでやってます また通常のページ内に記述したのは支障なく動作しますが、同一ページに4個配置すると4個目のコードのサイズが若干小さくなります。-- ど素人
- 日本語名のアドレスは文字コード*1に依存しますので、その場合はURLエンコードしたものを渡すようにしてください。 -- みこ
- お返事ありがとうございます。 MenuBarに設置しているので.......エンコードしたものをどうやって渡せばいいでしゅか? -- ど素人
- URLエンコードされたアドレスの文字列ってIEならアドレスバーにでてる「http://pukiwiki.sourceforge.jp/?%E8%87%AA%E4%BD%9C%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%2Fqrcode.inc.php」ですよね? 違ったらすいません。 テストコードでrawurlencodeで出力したものと同一だったのでそう思いました。 もちろん:は¥:に変換して試してみましたが.jp/?以下は化けてしまいます。 プラグイン内にecho入れて$dの内容も見ましたがちゃんとURLエンコードされた文字列は渡されている様です。 -- ど素人
- ほんとにこれを調べるためにPHPの本を見ながらやってるので、手法が正しいのかわかりませんが、$r_pageをデコードしてSJISやUTF-8、ASCIIに変換してURLエンコードして渡しても全部エラーです。 SJISについては読み取るとURLに漢字で表示されてエラー.....んー どうすればいいでしょうか? -- ど素人
- 日本語が化ける件、下記の部分を変更してみてください。私も同じような現象が発生して、これで正常に動作するようになりました。 -- teanan
plugin/qrcode.inc.php : 126行目付近
}
- $qr['data'] = rawurldecode($vars['d']);
+ $qr['data'] = rawurldecode(mb_convert_encoding($vars['d'],QRCODE_ENCODING,SOURCE_ENCODING));
$qr['size'] = (empty($vars['s'])) ? 1 : $vars['s'];