LifeType 中文開發論壇

開發 => 外掛程式 => 主題作者是: twu2 於 三月 01, 2007, 02:08:08 下午



主題: 讓 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(2424);
    
$background ImageColorAllocate($im255255255);
    
$fontcolor ImageColorAllocate($im000);
    
ImageTTFText($im160221$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 的話, 每次會隨機決定要使用的背景圖案.