主題: 讓 authimage 顯示中文的數字
作者: twu2 於 三月 01, 2007, 02:08:08 下午
之前雖然把 AuthImage 改成用 Better Captcha 的圖型來顯示, 效果不錯, 不過... Better Captcha 的圖有時仍會不太容易看的懂. 所以就想了另一種方式, 把這個改用中文字來顯示, 對於看不懂中文的外國 bot 來說, 應該就有足夠的效果. 當然... 對人來說, 如果看的懂中文, 也應該是很容易就可以看出結果來. 首先, 為了方便使用, 我們先用下頭的程式產生 0-9 的圖檔: <?php
$aData[0] = "零"; $aData[1] = "一"; $aData[2] = "二"; $aData[3] = "三"; $aData[4] = "四"; $aData[5] = "五"; $aData[6] = "六"; $aData[7] = "七"; $aData[8] = "八"; $aData[9] = "九";
$font = "/usr/share/fonts/truetype/msjhbd.ttf";
foreach ($aData as $num => $str) { $im = ImageCreate(24, 24); $background = ImageColorAllocate($im, 255, 255, 255); $fontcolor = ImageColorAllocate($im, 0, 0, 0); ImageTTFText($im, 16, 0, 2, 21, $fontcolor, $font, $str); ImagePNG($im, $num.'.png'); ImageDestroy($im); }
?> 如果你要使用別的字型, 把 font 改成你喜歡的字型檔就可以. 把產生的 png 檔案, 在 authimage 的路徑下建立一個 image 的子目錄, 把檔案放到裡頭. 然後把原本的 pluginauthimage.class.php 裡頭的 showImage() 改成下頭的內容: function showImage() { // Delete those cached authimage files that never used $this->deleteExpiredAuthImage($this->expiredTime);
define( "AUTHIMAGE_IMAGE_FOLDER", PLOG_CLASS_PATH."plugins/authimage/image/" );
$code = $this->generateCode(); $encrypt = $this->encrypt($code, $this->key); $background = AUTHIMAGE_BACKGROUND_FOLDER.$this->default; $tempFile = $this->cacheFolder."/".$encrypt.".gif";
$len = strlen($code); $image = ImageCreate(24 * $len, 24); $im_bg = ImageCreateFromGIF($background); if ($im_bg) { list($bg_width, $bg_height, $bg_type, $bg_attr) = @GetImageSize($background); if (function_exists('ImageCopyReSampled')) ImageCopyReSampled($image, $im_bg, 0, 0, 0, 0, 24 * $len, 24, $bg_width, $bg_height); else ImageCopyReSized($image, $im_bg, 0, 0, 0, 0, 24 * $len, 24, $bg_width, $bg_height); ImageDestroy($im_bg);
} for ($i = 0; $i < $len; $i++) { $im_num = @ImageCreateFromPNG(AUTHIMAGE_IMAGE_FOLDER.$code[$i].'.png'); if ($im_num) { ImageColorTransparent($im_num, ImageColorAt($im_num, 0, 0)); ImageCopy($image, $im_num, 24 * $i, 0, 0, 0, 24, 24); ImageDestroy($im_num); } }
ImagePNG($image, $tempFile);
ImageDestroy($image);
$temp = fopen($tempFile,"rb"); $buffer = fread($temp,filesize($tempFile)); fclose($temp); // Now zero-length the file. No need for its content anymore. $temp = fopen($tempFile,"w"); fwrite($temp, NULL); fclose($temp);
// Now chmod it so it can be deleted later by the user chmod($tempFile, 0666);
header("Content-type: image/png"); echo $buffer; }
這樣子就可以顯示中文數字的圖型了. 如果不知如何產生圖檔或修改程式, 可以抓這個檔案 http://www.teatime.com.tw/~tommy/files/lifetype/lifetype_authimage_chinese.tgz 回去, 在 authimage 的目錄解開來, 覆蓋原有的檔案就可以了.
主題: Re: 讓 authimage 顯示中文的數字
作者: markwu 於 三月 01, 2007, 02:15:21 下午
這 idea 實在太棒了!可是唯一可惜的事外國人看不懂 ... :-(
我們應該來順便推廣一下中文。
Mark
主題: Re: 讓 authimage 顯示中文的數字
作者: perlish 於 三月 11, 2007, 07:49:51 上午
整好解了燃眉之急 顶一下
主題: Re: 讓 authimage 顯示中文的數字
作者: perlish 於 三月 11, 2007, 08:15:20 上午
我应用了一下,发现有下面的问题: Error 对不起,您所要进行的操作无法执行。 您的回复验证码输入有误,请检查后重试。
我的确正确的输入了汉字,但是还是出现上述错误,有什么调试的办法吗?或者问题大概出在哪里? 我的是lifetype 1.0.3的 下载的这个包 http://www.teatime.com.tw/~tommy/files/lifetype/lifetype_authimage_chinese.tgz
主題: Re: 讓 authimage 顯示中文的數字
作者: twu2 於 三月 11, 2007, 10:58:35 上午
那個顯示的是漢字, 但是輸入的要是阿拉伯數字才可以. 我的考慮是, 輸入漢字的數字, 對使用者來說, 比較不友善, 要打比較多的字. 而輸入阿拉伯數字就很容易了.
如果你需要使用者也輸入漢字的數字的話, 請自己修改程式的內容, 把檢查碼記算的部份也改成用漢字才可以.
主題: Re: 讓 authimage 顯示中文的數字
作者: perlish 於 三月 11, 2007, 11:49:44 上午
我倒……我说难怪我输入老不对…… 不过我现在用了模糊的数字了的,也是你写的patch,先用着吧 不过那个有点麻烦,要重新编译php支持ttf
主題: Re: 讓 authimage 顯示中文的數字
作者: twu2 於 三月 11, 2007, 03:17:23 下午
我有看到那篇, 不過, 我也是用 debian/etch, 並沒有自己重編 php, 都使用內建的模組, 並沒有與你一樣的問題.
主題: Re: 讓 authimage 顯示中文的數字
作者: perlish 於 三月 12, 2007, 07:51:33 上午
我有看到那篇, 不過, 我也是用 debian/etch, 並沒有自己重編 php, 都使用內建的模組, 並沒有與你一樣的問題.
apt装的lamp会装上很多php模块的,我的虽然是在debian下,但apache和php是自己编译的所以会遇到这个问题 希望twu2继续多出好东西啊 :)
主題: Re: 讓 authimage 顯示中文的數字
作者: twu2 於 三月 14, 2007, 02:10:56 下午
加上動態使用背景圖案並把顯示的文字做些旋轉. 修改 pluginauthimage.class.php 裡頭的 showImage() 改成下頭的內容: function showImage() { // Delete those cached authimage files that never used $this->deleteExpiredAuthImage($this->expiredTime);
$code = $this->generateCode(); $encrypt = $this->encrypt($code, $this->key); $background = AUTHIMAGE_BACKGROUND_FOLDER.$this->default; if ($this->default == 'random.gif') { $files = glob(AUTHIMAGE_BACKGROUND_FOLDER.'*.gif'); $cnt = count($files); $choose = rand(0, $cnt-1); $background = $files[$choose]; } $tempFile = $this->cacheFolder."/".$encrypt.".gif";
if (function_exists('ImageRotate')) $size = 36; else $size = 24; $len = strlen($code); $image = ImageCreate($size * $len, $size); $im_bg = ImageCreateFromGIF($background); if ($im_bg) { list($bg_width, $bg_height, $bg_type, $bg_attr) = @GetImageSize($background); if (function_exists('ImageCopyReSampled')) ImageCopyReSampled($image, $im_bg, 0, 0, 0, 0, $size * $len, $size, $bg_width, $bg_height); else ImageCopyReSized($image, $im_bg, 0, 0, 0, 0, $size * $len, $size, $bg_width, $bg_height); ImageDestroy($im_bg); } for ($i = 0; $i < $len; $i++) { $im_num = @ImageCreateFromPNG(AUTHIMAGE_IMAGE_FOLDER.$code[$i].'.png'); if (function_exists('ImageRotate')) { $im_rotate = ImageRotate($im_num, rand(-45, 45), 0); ImageDestroy($im_num); $im_num = ImageCreate($size, $size); if (function_exists('ImageCopyReSampled')) ImageCopyReSampled($im_num, $im_rotate, 0, 0, 0, 0, $size, $size, imagesx($im_rotate), imagesy($im_rotate)); else ImageCopyReSized($im_num, $im_rotate, 0, 0, 0, 0, $size, $size, imagesx($im_rotate), imagesy($im_rotate)); ImageDestroy($im_rotate); } if ($im_num) { ImageColorTransparent($im_num, ImageColorAt($image,0, 0)); ImageCopy($image, $im_num, $size * $i, 0, 0, 0, $size, $size); ImageDestroy($im_num); } }
ImagePNG($image, $tempFile);
ImageDestroy($image);
$temp = fopen($tempFile,"rb"); $buffer = fread($temp,filesize($tempFile)); fclose($temp);
// Now zero-length the file. No need for its content anymore. $temp = fopen($tempFile,"w"); fwrite($temp, NULL); fclose($temp);
// Now chmod it so it can be deleted later by the user chmod($tempFile, 0666);
header("Content-type: image/png"); echo $buffer; }
然後把 backgrounds 下頭的 transparent.gif 複製為 random.gif. 這樣子的話, 如果你在 LifeType 的設定裡頭, 選擇用 random.gif 的話, 每次會隨機決定要使用的背景圖案.
|