PHP视频教学,让你更快更轻松的掌握PHP。

查看完整版本: 从DZ扣出来的通过ip判断省份、城市、线路、位置的代码

robin 2007-9-29 11:12

从DZ扣出来的通过ip判断省份、城市、线路、位置的代码

[size=12px][img]http://www.phpx.com/happy/images/smilies/lol.gif[/img] IP库是纯真的,挺全的,就是文件挺大,想用的话在自己找 QQWry.Dat ,随便去百度搜索 “QQWry.Dat”  纯真的ip库,网上到处有下[/size]


[size=12px][code]
<?php
/***************************************************************************
*                        CvIp.php
*                ------------------------------
*        Date                : Sep 7, 2007
*        Copyright        : [Discuz!] (C) Comsenz Inc.
*        Mail                :
*        Desc.                : IP地址获取真实地址函数
*        History                :
*                Date    :
*                Author  :
*                Modif.  :
*        Usage Example   :
                echo CvIp('218.56.198.104');
                //返回 山东省济南市 网通ADSL
                //如果参数为空则自动获取ip
***************************************************************************/

function CvIp($ip='')
{
        if(empty($ip)) $ip = _Cv_Get_Ip();
        if(!preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip)) { return false; }
        if($fd = @fopen(dirname(__FILE__).'/QQWry.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;
        }
}

function _Cv_Get_Ip()
{
        $_IpArray = array($_SERVER['HTTP_X_FORWARDED_FOR'], $_SERVER['HTTP_CLIENT_IP'], $_SERVER['REMOTE_ADDR'], getenv('REMOTE_ADDR'));
        rsort($_IpArray);
        reset($_IpArray);
        return $_IpArray[0];
}
[/code][/size]

ht5127 2008-3-1 11:10

好,强烈支持!

高手,帮人帮到底,送佛送到西!
可否帮忙给出IP识别后自动调出不同网页的代码,以实现不同浏览者看到同一网站的他当地的内容!

谢谢!

robin 2008-3-1 21:03

if(IP为杭州IP)
{
显示杭州的页面;
}
还有困难不?

lxylxy8866 2008-3-1 21:50

厉害哈,得找点时间仔细学学
:06:

hp198410 2008-6-6 01:31

這東西 以后也許用的上。。 HOHO。。

zxcvva 2008-8-27 11:13

:36: :36: 新手。。不会用。。。还是等学习了再来看吧。
页: [1]
查看完整版本: 从DZ扣出来的通过ip判断省份、城市、线路、位置的代码