2023/11/30 Blog相关 6 Comments Typecho评论ip定位归属地入库存储 ### 背景 typecho留言评论增加IP地址定位归属地信息入库存储,即在访客提交评论时同步存储访客的IP地址定位归属地,便于直接输出显示。 虽然目前有插件能动态解析IP地址归属地并呈现,但缺点是较容易触发各地图开放平台IP定位服务的每秒并发量约定上限。 `本文基于Typecho 1.2.1环境编写。最后更新于2023-11-30 15:08:56 星期四` ### 增加步骤 1. 评论数据表(comments)增加IP归属地字段ipLocation ```sql alter table comments add ipLocation varchar(64) default NULL comment 'IP归属地'; ``` 1. 评论基类文件修改 /var/Widget/Base/Comments.php (1)增加ip地址解析方法 ```php //根据ip地址获取归属地 By:未来往事 2023/11/29 public function getIpLocation($ip){ $json = file_get_contents('https://apis.map.qq.com/ws/location/v1/ip?ip='.$ip.'&key=填入你在腾讯地图申请的秘钥'); $array = json_decode($json, true); $status = $array['status']; $province = $array['result']['ad_info']['province']; $city = $array['result']['ad_info']['city']; if ($array['status'] == 0) { if (in_array($province, array('北京市', '天津市', '上海市', '重庆市'))) { $location = $city; } else if (empty($province)) { $location = '未知'; } else { $location = $province.' / '.$city; } } else if (empty($ip) || $ip == '127.0.0.1') { $location = '未知'; } else { //$location = $status; $location = ''; } return $location; } ``` (2)insert插入方法修改 在public function insert(array $rows): int方法内插入结构$insertStruct函数后增加 ```php /** 获取ip归属地并入库 */ $ipLocation = $this->getIpLocation($insertStruct['ip']); if($ipLocation != ''){ $insertStruct['ipLocation'] = $ipLocation; } ``` 完整示例: ```php public function insert(array $rows): int { /** 构建插入结构 */ $insertStruct = [ ………… ]; /** 获取ip归属地并入库 */ $ipLocation = $this->getIpLocation($insertStruct['ip']); if($ipLocation != ''){ $insertStruct['ipLocation'] = $ipLocation; } ………… ``` (3)修改查询方法,增加'table.comments.ipLocation' ```php /** * 获取查询对象 * * @return Query * @throws Exception */ public function select(): Query { return $this->db->select( …………, 'table.comments.ipLocation' ) ->from('table.comments'); } ``` 1. 调用显示IP定位归属地 修改评论归档组件类文件var/Widget/Comments/Archive.php, 找到 “threadedCommentsCallback” 评论回调函数,在适当位置插入以下代码,例如我们在评论时间之后插入: ```php if($this->ipLocation != ''){ //如果存储的有IP地址归属地,则直接输出 echo 'IP 属地:'.$this->ipLocation.''; } ``` **特殊情况:** - 某些主题会对评论列表使用 threadedComments 进行自定义,此时,需要在其函数体内适当位置添加以上代码,注意匹配参数 $this - 例如:你的主题使用 threadedComments($comments, $options) 对评论列表进行自定义时,则调用插件的代码为: ```php if($comments->ipLocation != ''){ //如果存储的有IP地址归属地,则直接输出 echo 'IP 属地:'.$comments->ipLocation.''; } ``` ### 其他补充 如果有历史评论(以前没有入库存储评论用户的IP地址归属地信息),也可以结合其他IP地址归属地定位插件进行判断输出显示。示例: ```php ipLocation != ''){ //如果已存储IP地址归属地,直接输出 echo 'IP 属地:'.$this->ipLocation.''; }else{ //如果没存储IP地址归属地,则调用插件 ………… } ?> ``` ###[点击查看示例效果](/post/681.html#comment-10441 "点击查看示例效果") 本文最后更新于 2023-12-04 10:37:13 并被添加「typecho 博客」标签,已有 5047 位童鞋阅读过。 本文作者:未来往事 本文链接:https://felixway.cn/post/685.html 本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处 相关文章 未来往事博客更换域名了,新域名felixway.cn Typecho文章阅读量自定义 typecho管理员帐号密码忘记的修改找回方法 未来往事个人blog上线咯
老铁,虽然说我看不懂,一点都看不懂,但是我还是想说:“我感觉会写代码的人都是很牛逼的!!!”
@Net
老铁,我是菜鸟,哈哈哈。我看你博客评论/留言IP归属地解析显示没有提示并发量达限的错误代码,是用的默认评论嘛,还是其他插件呢?
我用的是默认的评论,但是这个主题支持评论ip归属地的。我不会搞啦,傻瓜试滴。
@Net
嗯嗯 我这也是默认的评论 安装了那个Lopwon IP归属地显示插件后经常显示异常(定位接口超过并发限制) 然后就有了这篇文章 哈哈哈
好文,刚测试OK,感谢一下~
@mgt
欢迎,好用就好~~