<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>IP归属地相关文章列表 | 皇家元林</title>
	<atom:link href="https://hjyl.org/tags/ip%E5%BD%92%E5%B1%9E%E5%9C%B0/feed/" rel="self" type="application/rss+xml" />
	<link>https://hjyl.org</link>
	<description>刘元林的个人博客</description>
	<lastBuildDate>Sun, 25 Aug 2024 13:34:34 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://img.hjyl.org/uploads/2019/10/cropped-about-me-32x32.png</url>
	<title>IP归属地相关文章列表 | 皇家元林</title>
	<link>https://hjyl.org</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>WordPress接入纯真IP库CZDB版本</title>
		<link>https://hjyl.org/wordpress-cz88-czdb/</link>
					<comments>https://hjyl.org/wordpress-cz88-czdb/#comments</comments>
		
		<dc:creator><![CDATA[皇家元林]]></dc:creator>
		<pubDate>Sun, 25 Aug 2024 13:33:06 +0000</pubDate>
				<category><![CDATA[元林手札]]></category>
		<category><![CDATA[CZDB]]></category>
		<category><![CDATA[IP归属地]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[纯真IP]]></category>
		<guid isPermaLink="false">https://hjyl.org/?p=5288</guid>

					<description><![CDATA[之前，本站基于纯真IP库实现评论者IP归属地，用的好好的，突然官方又改变策略了，推出czdb数据格式，并在10 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>之前，本站<a href="https://hjyl.org/qqwry-ip-location/">基于纯真IP库实现评论者IP归属地</a>，用的好好的，突然官方又改变策略了，推出czdb数据格式，并在10月1日开始停止dat格式和exe格式的发布（详情见<a href="https://hjyl.org/go/aHR0cHM6Ly9tcC53ZWl4aW4ucXEuY29tL3M/X19iaXo9TXpnM016YzBOVEEzTkE9PSZhbXA7bWlkPTIyNDc0ODUzMjImYW1wO2lkeD0yJmFtcDtzbj02OWI3M2RiZTkxNjYwMmY0ODE2YzY5ZTJkYWJjNzE1ZiZhbXA7Y2hrc209Y2VkYTE4NTdmOWFkOTE0MWRiYmU0ZTU0MzE3ZjA3NTQ1YmQ0ZmQ2YzVjNTJiNDczZWI4MDYyMzA4ZjNlM2I4ZjUxYjRkYmE5ZmRmZCZhbXA7c2NlbmU9MjEjd2VjaGF0X3JlZGlyZWN0" rel="nofollow" target="_blank">官方公众号</a>）。</p>



<p>新版本的要求就多了，首先你得在官方注册登录，其次根据它的要求帮它宣传（我是在本博客底部加上他们网站的链接），并截图给他审核，通过之后你才会有授权，你才能得到key。有了这个key你才能使用czdb格式数据库。我个人是不太喜欢需要通过这种方式才能得到的一些东西，吃相有点难看了。但是没办法，好像也找不到更好的选择了。</p>



<p>CZDB目前官方已支持JAVA、C语言和PHP解析程序，我们直接拿来用就可以了。下面主要说说咱们WordPress的食用方法，也就是PHP的解析程序。</p>



<p>PHP解析程序的GitHub地址：<a href="https://hjyl.org/go/aHR0cHM6Ly9naXRodWIuY29tL3RhZ3BoaS9jemRiX3NlYXJjaGVyX3BocA==" rel="nofollow" target="_blank">czdb_searcher_php</a></p>



<p>在项目目录下运行以下命令来安装 CZDB Searcher：</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash line-numbers">composer require czdb/searcher</code></pre>



<p>如果找不到包，可能是因为你没有使用composer 2.x版本，可以使用以下命令来安装composer 2.x版本：</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash line-numbers">composer self-update --2</code></pre>



<p>然后将下面代码扔进functions.php文件里：</p>



<pre class="wp-block-code"><code lang="php" class="language-php line-numbers">//解析纯真IP获取评论者ip归属地 开始

require_once __DIR__ . '/vendor/autoload.php';

use Czdb\DbSearcher;

//评论作者归属地函数
//Code by HJYL.ORG
//IP数据库由纯真CZ88提供
function getCity($ip){
    $dbSearcher = new DbSearcher("cz88_public_v4.czdb的路径", "BTREE", "key");
    // get_template_directory() . "/czdb/cz88_public_v4.czdb" 这是某主题目录下的文件夹
    // 默认BTREE，搜索模式（例如，"BTREE" 少量查询 或者 "MEMORY" 大量查询）。
    // key，即密钥，从https://cz88.net/geo-public获取
    
    $region = $dbSearcher-&gt;search($ip);
    // 将字符串拆分成各个部分
    if(strpos($region, "\t")){
        $region = preg_replace('/\t+/','–',$region);

    }elseif(strpos($region, " ")){
        $region = str_replace(' ','–',$region);
    }

    $region = explode("–", $region);

    //分别获取国家、省、市字段
    $country = $region[0] ?? "";
    $province = $region[1] ?? "";
    $city = $region[2] ?? "";

    $dbSearcher-&gt;close();

    //优先显示城市，其次省，最后国家
    if($ip == '127.0.0.1'){
        $data = '小黑屋';
    }elseif($city == "" || false !== strpos($city, '移动') || false !== strpos($city, '电信') || false !== strpos($city, '联通')){
        $data = $province;
    }elseif($province == "" || false !== strpos($province, '移动') || false !== strpos($province, '电信') || false !== strpos($province, '联通')){
        $data = $country;
    }else{
        $data = $city;
    }
    
    return $data;
}

//解析纯真IP获取评论者ip归属地 结束</code></pre>



<p>调用方法：</p>



<pre class="wp-block-code"><code lang="php" class="language-php line-numbers">echo getCity(get_comment_author_IP());</code></pre>



<p>结束撒花~~~</p>



<p>花絮：</p>



<p>这个版本的数据库支持IPv4和IPv6，其实之前的那个itbdw/ip-database也是支持IPv4和IPv6的，只是纯真没有IPv6数据库。这次发布了IPv6数据库，但是我也用不上。</p>



<p>这段代码的解析思路是这样的：根据IP查询数据库，得到的格式是这样的——“中国–安徽–合肥  移动”，然后将其拆解，分别得到国家、省、市。别看这格式很简单，我测试了很久，才发现移动前的空格不仅有空格，还有制表符“\t”，这是目前我遇到的，不知道还有没有其他看不见的符号了。</p>



<p>最让人吐槽的是纯真社区版IP库在地级市的准确率上不是很高。所以不必较真，仅供娱乐而已。</p>
<div id="content-copyright"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;font-size: 13px;">版权声明: </span><span style="font-size: 13px;">本文采用 <a href="https://hjyl.org/go/aHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLXNhLzMuMC8=" rel="nofollow" target="_blank">BY-NC-SA</a> 协议进行授权，如无注明均为原创，转载请注明转自 <a href="https://hjyl.org">皇家元林</a><br>本文链接: <a rel="bookmark" title="WordPress接入纯真IP库CZDB版本" href="https://hjyl.org/wordpress-cz88-czdb/">WordPress接入纯真IP库CZDB版本</a></span></div>]]></content:encoded>
					
					<wfw:commentRss>https://hjyl.org/wordpress-cz88-czdb/feed/</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
			</item>
		<item>
		<title>WordPress发布文章显示IP归属地</title>
		<link>https://hjyl.org/wordpress-post-get-ip-location/</link>
					<comments>https://hjyl.org/wordpress-post-get-ip-location/#comments</comments>
		
		<dc:creator><![CDATA[皇家元林]]></dc:creator>
		<pubDate>Mon, 25 Mar 2024 16:37:10 +0000</pubDate>
				<category><![CDATA[元林手札]]></category>
		<category><![CDATA[IP归属地]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[文章作者]]></category>
		<category><![CDATA[纯真IP库]]></category>
		<guid isPermaLink="false">https://hjyl.org/?p=4994</guid>

					<description><![CDATA[之前呢，利用纯真IP库实现评论者IP归属地。最近突然想折腾一下，或许是在扬州行的想法吧，像朋友圈那样，可以显示 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>之前呢，利用<a href="https://hjyl.org/qqwry-ip-location/">纯真IP库实现评论者IP归属地</a>。最近突然想折腾一下，或许是在扬州行的想法吧，像朋友圈那样，可以显示发布信息的定位，以后或许能将这些定位串起来，形成一个轨迹，也许这也是人生的轨迹。本想直接找段代码直接来用的，没找到，或许大家没有这样的需求。后来还是找到了一款插件，叫apoyl-ip，有兴趣可以去看看。看了下代码，他是将IP地址记录到数据库里，然后读取数据库信息来显示IP归属地的。我感觉有点复杂了（看了下数据库才发现，评论的IP信息是有数据库字段的，文章作者却没有，希望官方可以考虑加一个）。</p>



<p>于是我想到了另外一种方法——自定义字段。没错，就是在发布文章时将作者的IP地址记录到自定义字段里，然后get字段，转换为归属地。好，思路有了，说干就干。</p>



<p>演示见本文标题下所显示的城市。</p>



<h3 class="wp-block-heading">获取作者发布文章时的IP</h3>



<pre class="wp-block-code"><code lang="php" class="language-php line-numbers">//在发布文章时添加作者IP字段，开始
add_action('publish_post', 'get_the_author_ip');
function get_the_author_ip($post_id) {
    // 添加自定义字段
    $meta_key = 'hjylIP'; // 自定义字段名称
    $meta_value = $_SERVER['REMOTE_ADDR']; // 自定义字段值

    // 添加自定义字段到文章
    add_post_meta($post_id, $meta_key, $meta_value, true);
}
//在发布文章时添加作者IP字段，结束</code></pre>



<p>这个简单吧，WP官网上抄来的，其中关键的是$_SERVER['REMOTE_ADDR']，正常都是这个，如果是用代理或者反向代理，可能需要根据实际情况修改，譬如$_SERVER['HTTP_CLIENT_IP']或者$_SERVER['HTTP_X_FORWARDED_FOR']。</p>



<h3 class="wp-block-heading">将IP信息转换为归属地信息</h3>



<p>这个就用现成的，利用之前的纯真IP库同样可以实现。纯真IP库有个好处就是每周都会更新数据库，而且社区版是免费的，只是准确率没有收费版的精确。这也是我为什么在自定义字段里记录IP，而不直接记录归属地信息。具体可以了解之前的文章（<a href="https://hjyl.org/qqwry-ip-location/">点此跳转</a>），这里修改部分代码。</p>



<pre class="wp-block-code"><code lang="php" class="language-php line-numbers">//文章作者发文归属地函数
function getAuthorIp($ip){
    if(empty($ip)) $ip = get_post_meta($post-&gt;ID,"hjylIP", true);
    $qqwry_filepath = get_template_directory() .'/qqwry.dat';
    $getLocation = json_encode(IpLocation::getLocation($ip, $qqwry_filepath), JSON_UNESCAPED_UNICODE) . "\n";
    $IPinfo = json_decode($getLocation, true);
    $country = $IPinfo['country'];
    $province = $IPinfo['province'];
    //优先显示城市，其次省，最后国家
    $city = $IPinfo['city'];
    if($ip == '127.0.0.1'){
        $data = '小黑屋';
    }elseif($city != ""){
        $data = $city;
    }elseif($province !== "" &amp;&amp; $city == ""){
        $data = $province;
    }else{
        $data = $country;
    }
    
    return $data;
}</code></pre>



<p>这里与评论不同的是精确到了城市，所以希望纯真IP越做越精确啊，这样我的人生轨迹也完整和精确。</p>



<h3 class="wp-block-heading">调用IP归属地代码</h3>



<p>在single.php你想放的位置调用归属地代码即可。</p>



<pre class="wp-block-code"><code lang="php" class="language-php line-numbers">&lt;?php 
	if(function_exists('getAuthorIp') &amp;&amp; !empty(get_post_meta($post->ID,"hjylIP", true))) {
		echo 'φ';
		echo getAuthorIp(get_post_meta($post->ID,"hjylIP", true));
	}//支持文章作者IP归属地
?></code></pre>



<p>别看这么简单的代码，搞得我一身汗，可能大家需求没那么高，毕竟IP这个东西也算是隐私。当然希望对有需求的人有所帮助。可能有人会问，为什么以前的文章没有归属地信息呢？因为之前没有IP信息记录啊！</p>
<div id="content-copyright"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;font-size: 13px;">版权声明: </span><span style="font-size: 13px;">本文采用 <a href="https://hjyl.org/go/aHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLXNhLzMuMC8=" rel="nofollow" target="_blank">BY-NC-SA</a> 协议进行授权，如无注明均为原创，转载请注明转自 <a href="https://hjyl.org">皇家元林</a><br>本文链接: <a rel="bookmark" title="WordPress发布文章显示IP归属地" href="https://hjyl.org/wordpress-post-get-ip-location/">WordPress发布文章显示IP归属地</a></span></div>]]></content:encoded>
					
					<wfw:commentRss>https://hjyl.org/wordpress-post-get-ip-location/feed/</wfw:commentRss>
			<slash:comments>24</slash:comments>
		
		
			</item>
		<item>
		<title>基于纯真IP库实现评论者IP归属地</title>
		<link>https://hjyl.org/qqwry-ip-location/</link>
					<comments>https://hjyl.org/qqwry-ip-location/#comments</comments>
		
		<dc:creator><![CDATA[皇家元林]]></dc:creator>
		<pubDate>Tue, 26 Sep 2023 15:07:50 +0000</pubDate>
				<category><![CDATA[元林手札]]></category>
		<category><![CDATA[IP归属地]]></category>
		<category><![CDATA[qqwry.dat]]></category>
		<category><![CDATA[qqwry.ipdb]]></category>
		<category><![CDATA[纯真IP数据库]]></category>
		<guid isPermaLink="false">https://hjyl.org/?p=4655</guid>

					<description><![CDATA[还记得纯真IP——QQWry.dat吗？ 从我开始会上网的时候，外挂版QQ上的小卡片就显示对方的IP地址及其归 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>还记得纯真IP——QQWry.dat吗？</p>



<p>从我开始会上网的时候，外挂版QQ上的小卡片就显示对方的IP地址及其归属地了。</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>来自于<a href="https://hjyl.org/go/aHR0cHM6Ly96aHVhbmxhbi56aGlodS5jb20vcC8zNjA2MjQ5NTI=" rel="nofollow" target="_blank">知乎</a></p>
<cite>QQWry.dat文件是显IP版QQ的数据库文件，用于获取对方IP及位置，纯真IP数据库也采用了这个格式，并沿用至今。<br><br>纯真IP库[<a href="https://hjyl.org/go/aHR0cHM6Ly9jejg4Lm5ldC8=" rel="nofollow" target="_blank">官网</a>]是民间自发收集、提交、聚合而来的数据库，囊括了国内外的大量IP数据，部分记录甚至比商业付费数据库更加准确。它的官网提供了记录提交和纠错的功能，来自全国各地的网友将不同地区的ISP及位置数据上传，管理员在统一整合后每5天更新一次。从2005年到现在的16年间，这个数据库已经聚合了超过五十万条IP记录。<br><br>纯真IP库是完全免费的，它的官网上有在线查询功能，同时也可以下载离线数据库用于低延迟场景，但数据不可用于商业用途。这些记录在稍加分析处理后能达到不错的效果，基本满足定位IP所处城市及ISP信息的需求，不过它目前只支持IPv4地址，在一些应用场景下稍显不足。</cite></blockquote>



<p>话不多说，言归正传，此PHP解析纯真IP数据库的源代码来自于<a href="https://hjyl.org/go/aHR0cHM6Ly9naXRodWIuY29tL2l0YmR3L2lwLWRhdGFiYXNl" rel="nofollow" target="_blank">itbdw/ip-database</a>，有很长一段时间没更新了，最新版本为3.X，支持ipv4+ipv6，如需要2.x稳定版请访问 <a href="https://hjyl.org/go/aHR0cHM6Ly9naXRodWIuY29tL2l0YmR3L2lwLWRhdGFiYXNlL3RyZWUvMi54" rel="nofollow" target="_blank">https://github.com/itbdw/ip-database/tree/2.x</a>。</p>



<p>下载好文件IpLocation.php、QQwry.php、IpV6wry.php、StringParser.php、IpParserInterface.php，放在一个文件夹里（或者直接用<a href="https://alist.hjyl.org/d/%E7%BE%A4%E6%99%96%E7%B3%BB%E5%88%97/qqwry.zip">我整理好的文件</a>），上传到主题目录里。</p>



<p>把以下代码甩进functions.php即可：</p>



<pre class="wp-block-code"><code lang="php" class="language-php line-numbers">//解析纯真IP获取评论者ip归属地 开始
//Code By HJYL.ORG
require get_template_directory() . '/qqwry/IpParserInterface.php';
require get_template_directory() . '/qqwry/IpLocation.php';
require get_template_directory() . '/qqwry/QQwry.php';
require get_template_directory() . '/qqwry/IpV6wry.php';
require get_template_directory() . '/qqwry/StringParser.php';
use itbdw\Ip\IpLocation;
function getCity($ip){
    $qqwry_filepath = get_template_directory() .'/qqwry/qqwry.dat';
    $getLocation = json_encode(IpLocation::getLocation($ip, $qqwry_filepath), JSON_UNESCAPED_UNICODE) . "\n";
    $IPinfo = json_decode($getLocation, true);
    $country = $IPinfo['country'];
    $province = $IPinfo['province'];
/***************************************
    //优先显示城市，其次省，最后国家
    $city = $IPinfo['city'];
	if($ip == '127.0.0.1'){
		$data = '小黑屋';
	}elseif($city != ""){
        $data = $city;
    }elseif($province !== "" &amp;&amp; $city == ""){
        $data = $province;
    }else{
    	$data = $country;
    }
**************************************/
	if($ip == '127.0.0.1'){
		$data = '小黑屋';
    }elseif($province !== ""){
        $data = $province;
    }else{
    	$data = $country;
    }
    
    return $data;
}
//解析纯真IP获取评论者ip归属地 结束</code></pre>



<p>调用方法：</p>



<pre class="wp-block-code"><code lang="php" class="language-php line-numbers">echo getCity(get_comment_author_IP());</code></pre>



<p>它支持composer写入内存，再读取：</p>



<pre class="wp-block-code"><code lang="php" class="language-php line-numbers">composer require 'itbdw/ip-database'   #注意^3.0只支持PHP5.4~7.0</code></pre>



<p>到此结束！</p>



<p>画外音：折腾了一圈才发现，纯真数据库qqwry.dat也有 IPIP.net 格式版——qqwry.ipdb，来自于<a href="https://hjyl.org/go/aHR0cHM6Ly9naXRodWIuY29tL21ldG93b2xmL3Fxd3J5LmlwZGIvdHJlZS9tYXN0ZXI=" rel="nofollow" target="_blank">metowolf /qqwry.ipdb</a>，目前最新纯真IP免费版数据库日期为2023.09.20。也就是说我之前用的大发分享的WordPress插件Easy Location IP数据库也可以更新到纯真IP最新版数据库了，不想麻烦的，也可以用这个。</p>



<p>—— 完 ——</p>
<div id="content-copyright"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;font-size: 13px;">版权声明: </span><span style="font-size: 13px;">本文采用 <a href="https://hjyl.org/go/aHR0cHM6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LW5jLXNhLzMuMC8=" rel="nofollow" target="_blank">BY-NC-SA</a> 协议进行授权，如无注明均为原创，转载请注明转自 <a href="https://hjyl.org">皇家元林</a><br>本文链接: <a rel="bookmark" title="基于纯真IP库实现评论者IP归属地" href="https://hjyl.org/qqwry-ip-location/">基于纯真IP库实现评论者IP归属地</a></span></div>]]></content:encoded>
					
					<wfw:commentRss>https://hjyl.org/qqwry-ip-location/feed/</wfw:commentRss>
			<slash:comments>14</slash:comments>
		
		
			</item>
	</channel>
</rss>
