落拓居论坛 » 电脑网络 » 网页技术 » phpwind所有版本 直接使用珊瑚虫/纯真IP库 代码修改方法
本页主题: phpwind所有版本 直接使用珊瑚虫/纯真IP库 代码修改方法 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

落拓居士

头衔:骆驼 骆驼

级别: 管理员
精华: 28
发帖: 3944
威望: 3338 点
金钱: 70044 银两
贡献值: 27 点
好评度: 391 点
朋友圈: 落拓
在线时间:521(小时)
注册时间:2005-12-13
最后登录:2020-09-15

phpwind所有版本 直接使用珊瑚虫/纯真IP库 代码修改方法

本帖被 落拓居士 从 版主交流 移动到本区(2010-04-13)
改 require/postfunc.php 找到 cvipfrom
如果论坛是gbk的,整个函数改成:
Copy code
function cvipfrom($ip) {
    if(!preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip)) {
        return '';
    }

    if($fd = @fopen(R_P.'./ipdata/wry.dat', 'rb')) {

        $ip = explode('.', $ip);
        $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];

        $DataBegin = fread($fd, 4);
        $DataEnd = fread($fd, 4);
        $ipbegin = implode('', unpack('L', $DataBegin));
        if($ipbegin < 0) $ipbegin += pow(2, 32);
        $ipend = implode('', unpack('L', $DataEnd));
        if($ipend < 0) $ipend += pow(2, 32);
        $ipAllNum = ($ipend - $ipbegin) / 7 + 1;

        $BeginNum = 0;
        $EndNum = $ipAllNum;

        while($ip1num > $ipNum || $ip2num < $ipNum) {
            $Middle= intval(($EndNum + $BeginNum) / 2);

            fseek($fd, $ipbegin + 7 * $Middle);
            $ipData1 = fread($fd, 4);
            if(strlen($ipData1) < 4) {
                fclose($fd);
                return 'System Error';
            }
            $ip1num = implode('', unpack('L', $ipData1));
            if($ip1num < 0) $ip1num += pow(2, 32);

            if($ip1num > $ipNum) {
                $EndNum = $Middle;
                continue;
            }

            $DataSeek = fread($fd, 3);
            if(strlen($DataSeek) < 3) {
                fclose($fd);
                return 'System Error';
            }
            $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
            fseek($fd, $DataSeek);
            $ipData2 = fread($fd, 4);
            if(strlen($ipData2) < 4) {
                fclose($fd);
                return 'System Error';
            }
            $ip2num = implode('', unpack('L', $ipData2));
            if($ip2num < 0) $ip2num += pow(2, 32);

            if($ip2num < $ipNum) {
                if($Middle == $BeginNum) {
                    fclose($fd);
                    return 'Unknown';
                }
                $BeginNum = $Middle;
            }
        }

        $ipFlag = fread($fd, 1);
        if($ipFlag == chr(1)) {
            $ipSeek = fread($fd, 3);
            if(strlen($ipSeek) < 3) {
                fclose($fd);
                return 'System Error';
            }
            $ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
            fseek($fd, $ipSeek);
            $ipFlag = fread($fd, 1);
        }

        if($ipFlag == chr(2)) {
            $AddrSeek = fread($fd, 3);
            if(strlen($AddrSeek) < 3) {
                fclose($fd);
                return 'System Error';
            }
            $ipFlag = fread($fd, 1);
            if($ipFlag == chr(2)) {
                $AddrSeek2 = fread($fd, 3);
                if(strlen($AddrSeek2) < 3) {
                    fclose($fd);
                    return 'System Error';
                }
                $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
                fseek($fd, $AddrSeek2);
            } else {
                fseek($fd, -1, SEEK_CUR);
            }

            while(($char = fread($fd, 1)) != chr(0))
                $ipAddr2 .= $char;

            $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
            fseek($fd, $AddrSeek);

            while(($char = fread($fd, 1)) != chr(0))
                $ipAddr1 .= $char;
        } else {
            fseek($fd, -1, SEEK_CUR);
            while(($char = fread($fd, 1)) != chr(0))
                $ipAddr1 .= $char;

            $ipFlag = fread($fd, 1);
            if($ipFlag == chr(2)) {
                $AddrSeek2 = fread($fd, 3);
                if(strlen($AddrSeek2) < 3) {
                    fclose($fd);
                    return 'System Error';
                }
                $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
                fseek($fd, $AddrSeek2);
            } else {
                fseek($fd, -1, SEEK_CUR);
            }
            while(($char = fread($fd, 1)) != chr(0))
                $ipAddr2 .= $char;
        }
        fclose($fd);

        if(preg_match('/http/i', $ipAddr2)) {
            $ipAddr2 = '';
        }
        $ipaddr = "$ipAddr1 $ipAddr2";
        $ipaddr = preg_replace('/CZ88\.NET/is', '', $ipaddr);
        $ipaddr = preg_replace('/^\s*/is', '', $ipaddr);
        $ipaddr = preg_replace('/\s*$/is', '', $ipaddr);
        if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
            $ipaddr = 'Unknown';
        }

        return ''.$ipaddr;

    } else {

        $datadir = R_P.'./ipdata/';
        $ip_detail = explode('.', $ip);
        if(file_exists($datadir.$ip_detail[0].'.txt')) {
            $ip_fdata = @fopen($datadir.$ip_detail[0].'.txt', 'r');
        } else {
            if(!($ip_fdata = @fopen($datadir.'0.txt', 'r'))) {
                return 'Invalid IP data file';
            }
        }
        for($i = 0; $i <= 3; $i++) {
            $ip_detail[$i] = sprintf('%03d', $ip_detail[$i]);
        }
        $ip = join('.', $ip_detail);
        do {
            $ip_data = fgets($ip_fdata, 200);
            $ip_data_detail = explode('|', $ip_data);
            if($ip >= $ip_data_detail[0] && $ip <= $ip_data_detail[1]) {
                fclose($ip_fdata);
                return ''.$ip_data_detail[2].$ip_data_detail[3];
            }
        } while(!feof($ip_fdata));
        fclose($ip_fdata);
        return 'UNKNOWN';

    }

}

然后找个ip库,放在 ipdata/wry.dat
至此大功告成……phpwind 5.3中测试通过。
男人就应该象个男人,说男人的话,做男人的事!
顶端 Posted: 2008-03-11 09:26 | [楼 主]
落拓居论坛 » 网页技术

Total 0.026493(s) query 5, Time now is:12-22 00:05, Gzip disabled 蜀ICP备11007877号-1
Powered by PHPWind v5.3 Certificate Code © 2003-07 PHPWind.com Corporation