歡迎光臨, 訪客. 請先 登入註冊一個帳號.
十一月 26, 2024, 01:08:53 下午
19595 文章 在 3865 主題 由 4579 會員
最新註冊會員: aa123aa1
LifeType 中文開發論壇  |  開發  |  外掛程式  |  讓 authimage 顯示中文的數字 « 上篇主題 下篇主題 »
頁: [1]
作者 主題: 讓 authimage 顯示中文的數字  (閱讀 21370 次)
twu2
初級會員
**
文章: 61



檢視個人資料 個人網站
« 於: 三月 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 的目錄解開來, 覆蓋原有的檔案就可以了.
« 最後編輯時間: 三月 01, 2007, 04:17:14 下午 由 twu2 » 已記錄

markwu
系統管理員
超級會員
*****
文章: 3928


Mark Wu


檢視個人資料 個人網站
« 回覆文章 #1 於: 三月 01, 2007, 02:15:21 下午 »

這 idea 實在太棒了!可是唯一可惜的事外國人看不懂 ...  傷心

我們應該來順便推廣一下中文。

Mark
已記錄

perlish
新手見習
*
文章: 19


檢視個人資料
« 回覆文章 #2 於: 三月 11, 2007, 07:49:51 上午 »

整好解了燃眉之急
顶一下
已記錄
perlish
新手見習
*
文章: 19


檢視個人資料
« 回覆文章 #3 於: 三月 11, 2007, 08:15:20 上午 »

我应用了一下,发现有下面的问题:
Error  对不起,您所要进行的操作无法执行。
您的回复验证码输入有误,请检查后重试。

我的确正确的输入了汉字,但是还是出现上述错误,有什么调试的办法吗?或者问题大概出在哪里?
我的是lifetype 1.0.3的
下载的这个包
http://www.teatime.com.tw/~tommy/files/lifetype/lifetype_authimage_chinese.tgz
已記錄
twu2
初級會員
**
文章: 61



檢視個人資料 個人網站
« 回覆文章 #4 於: 三月 11, 2007, 10:58:35 上午 »

那個顯示的是漢字, 但是輸入的要是阿拉伯數字才可以.
我的考慮是, 輸入漢字的數字, 對使用者來說, 比較不友善, 要打比較多的字. 而輸入阿拉伯數字就很容易了.

如果你需要使用者也輸入漢字的數字的話, 請自己修改程式的內容, 把檢查碼記算的部份也改成用漢字才可以.
已記錄

perlish
新手見習
*
文章: 19


檢視個人資料
« 回覆文章 #5 於: 三月 11, 2007, 11:49:44 上午 »

我倒……我说难怪我输入老不对……
不过我现在用了模糊的数字了的,也是你写的patch,先用着吧
不过那个有点麻烦,要重新编译php支持ttf
已記錄
twu2
初級會員
**
文章: 61



檢視個人資料 個人網站
« 回覆文章 #6 於: 三月 11, 2007, 03:17:23 下午 »

我有看到那篇, 不過, 我也是用 debian/etch, 並沒有自己重編 php, 都使用內建的模組, 並沒有與你一樣的問題.
已記錄

perlish
新手見習
*
文章: 19


檢視個人資料
« 回覆文章 #7 於: 三月 12, 2007, 07:51:33 上午 »

我有看到那篇, 不過, 我也是用 debian/etch, 並沒有自己重編 php, 都使用內建的模組, 並沒有與你一樣的問題.

apt装的lamp会装上很多php模块的,我的虽然是在debian下,但apache和php是自己编译的所以会遇到这个问题

希望twu2继续多出好东西啊 :)
已記錄
twu2
初級會員
**
文章: 61



檢視個人資料 個人網站
« 回覆文章 #8 於: 三月 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 的話, 每次會隨機決定要使用的背景圖案.
« 最後編輯時間: 三月 15, 2007, 11:05:51 上午 由 twu2 » 已記錄

頁: [1]
LifeType 中文開發論壇  |  開發  |  外掛程式  |  讓 authimage 顯示中文的數字 « 上篇主題 下篇主題 »
    前往: