统计
  • 文章总数:238 篇
  • 评论总数:608 条
  • 分类总数:7 个
  • 最后更新:2月23日

评论者添加IP地址归属地信息

本文阅读 5 分钟
首页 建站项目 正文
暂无AI摘要
摘要由智能技术生成

Test

  最近,百度、微博、抖音、知乎、小红书都上线了评论IP属地功能,国内显示到省份/地区,国外显示到国家,且用户无法关闭该功能。

微博一直致力于维护健康有序的讨论氛围,保障用户第一时间获取真实有效信息的权益。为减少冒充热点事件当事人、恶意造谣、蹭流量等不良行为,确保传播内容的真实、透明,站方于今年3月上线展示用户“IP属地”功能。
抖音安全中心官微消息,为维护真实有序的讨论氛围,减少冒充热点事件当事人、恶意造谣、蹭流量等不良行为。抖音拟在个人主页等位置展示帐号IP属地,相关功能在4月底进行测试,将根据测试情况逐步在其他场景全量上线。平台展示的帐号IP属地为最近一次发文或评论时的网络位置,境内展示到省(区、市),境外展示到国家(地区),帐号IP属地以运营商提供信息为准,相关展示不支持手动开启或关闭。
  我这几天有时间折腾,决定跟上这个风,加上这个功能,我的博客是Typecho搭建的,目前测试两种方式都可以实现:一个是调用百度、太平洋、淘宝这些网站的api,问题是影响网站加载速度;第二个是利用本地数据库,这个就快了很多。
所以我用的第二种利用纯真IP数据库。

具体效果如下

请输入图片描述



具体操作如下

第一种方法

这里使用太平洋网络IP地址查询web接口
参数有三个
第一个是ip,这个从评论表就能拿到
第二个是level,这个是用来设置输出精度的,=1/=2/=3分别代表只输出省名称/输出省市名称/输出省市区名称
第三个就是domId,用来指定结点ID

然后就开始了
首先找到现在使用的主题的评论展示的代码,这个根据主题不同位置也不一样,我的这个在主题文件夹comments.php文件中
然后再需要的地方加上一个的标签,这个标签id需要是该条评论的id,前缀可以随便加一个以便区分
最后再标签后面加上js脚本,脚本的url参数中需要注意:level根据需要自定义,domId和上面标签的id一样,ip则是该条评论的ip。

  1. <span class="t-g">来自<span id="ip-<?php $comments->theId();?>"></span></span>
  2. <script src="https://whois.pconline.com.cn/jsDom.jsp?level=1&domId=ip-<?php $comments->theId(); ?>&ip=<?php echo $comments->ip; ?>"></script>

博客主题的head中加上no-referrer的标签

  1. <meta name="referrer" content="no-referrer"/>

效果如图
请输入图片描述

第二种方法

将下面代码放入主题的functions.php文件中,可插入在最尾部。
代码

  1. /** 获取评论者地址 */
  2. function convertip($ip){
  3. $ip1num = 0;
  4. $ip2num = 0;
  5. $ipAddr1 ="";
  6. $ipAddr2 ="";
  7. $dat_path = './qqwry.dat';
  8. if(!preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/", $ip)) {
  9. return 'IP 数据库路径不对';
  10. }
  11. if(!$fd = @fopen($dat_path, 'rb')){
  12. return 'IP 数据库路径不正确';
  13. }
  14. $ip = explode('.', $ip);
  15. $ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
  16. $DataBegin = fread($fd, 4);
  17. $DataEnd = fread($fd, 4);
  18. $ipbegin = implode('', unpack('L', $DataBegin));
  19. if($ipbegin < 0) $ipbegin += pow(2, 32);
  20. $ipend = implode('', unpack('L', $DataEnd));
  21. if($ipend < 0) $ipend += pow(2, 32);
  22. $ipAllNum = ($ipend - $ipbegin) / 7 + 1;
  23. $BeginNum = 0;
  24. $EndNum = $ipAllNum;
  25. while($ip1num>$ipNum || $ip2num<$ipNum) {
  26. $Middle= intval(($EndNum + $BeginNum) / 2);
  27. fseek($fd, $ipbegin + 7 * $Middle);
  28. $ipData1 = fread($fd, 4);
  29. if(strlen($ipData1) < 4) {
  30. fclose($fd);
  31. return 'System Error';
  32. }
  33. $ip1num = implode('', unpack('L', $ipData1));
  34. if($ip1num < 0) $ip1num += pow(2, 32);
  35. if($ip1num > $ipNum) {
  36. $EndNum = $Middle;
  37. continue;
  38. }
  39. $DataSeek = fread($fd, 3);
  40. if(strlen($DataSeek) < 3) {
  41. fclose($fd);
  42. return 'System Error';
  43. }
  44. $DataSeek = implode('', unpack('L', $DataSeek.chr(0)));
  45. fseek($fd, $DataSeek);
  46. $ipData2 = fread($fd, 4);
  47. if(strlen($ipData2) < 4) {
  48. fclose($fd);
  49. return 'System Error';
  50. }
  51. $ip2num = implode('', unpack('L', $ipData2));
  52. if($ip2num < 0) $ip2num += pow(2, 32);
  53. if($ip2num < $ipNum) {
  54. if($Middle == $BeginNum) {
  55. fclose($fd);
  56. return 'Unknown';
  57. }
  58. $BeginNum = $Middle;
  59. }
  60. }
  61. $ipFlag = fread($fd, 1);
  62. if($ipFlag == chr(1)) {
  63. $ipSeek = fread($fd, 3);
  64. if(strlen($ipSeek) < 3) {
  65. fclose($fd);
  66. return 'System Error';
  67. }
  68. $ipSeek = implode('', unpack('L', $ipSeek.chr(0)));
  69. fseek($fd, $ipSeek);
  70. $ipFlag = fread($fd, 1);
  71. }
  72. if($ipFlag == chr(2)) {
  73. $AddrSeek = fread($fd, 3);
  74. if(strlen($AddrSeek) < 3) {
  75. fclose($fd);
  76. return 'System Error';
  77. }
  78. $ipFlag = fread($fd, 1);
  79. if($ipFlag == chr(2)) {
  80. $AddrSeek2 = fread($fd, 3);
  81. if(strlen($AddrSeek2) < 3) {
  82. fclose($fd);
  83. return 'System Error';
  84. }
  85. $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
  86. fseek($fd, $AddrSeek2);
  87. } else {
  88. fseek($fd, -1, SEEK_CUR);
  89. }
  90. while(($char = fread($fd, 1)) != chr(0))
  91. $ipAddr2 .= $char;
  92. $AddrSeek = implode('', unpack('L', $AddrSeek.chr(0)));
  93. fseek($fd, $AddrSeek);
  94. while(($char = fread($fd, 1)) != chr(0))
  95. $ipAddr1 .= $char;
  96. } else {
  97. fseek($fd, -1, SEEK_CUR);
  98. while(($char = fread($fd, 1)) != chr(0))
  99. $ipAddr1 .= $char;
  100. $ipFlag = fread($fd, 1);
  101. if($ipFlag == chr(2)) {
  102. $AddrSeek2 = fread($fd, 3);
  103. if(strlen($AddrSeek2) < 3) {
  104. fclose($fd);
  105. return 'System Error';
  106. }
  107. $AddrSeek2 = implode('', unpack('L', $AddrSeek2.chr(0)));
  108. fseek($fd, $AddrSeek2);
  109. } else {
  110. fseek($fd, -1, SEEK_CUR);
  111. }
  112. while(($char = fread($fd, 1)) != chr(0)){
  113. $ipAddr2 .= $char;
  114. }
  115. }
  116. fclose($fd);
  117. if(preg_match('/http/i', $ipAddr2)) {
  118. $ipAddr2 = '';
  119. }
  120. $ipaddr = "$ipAddr1 $ipAddr2";
  121. $ipaddr = preg_replace('/CZ88.NET/is', '', $ipaddr);
  122. $ipaddr = preg_replace('/^s*/is', '', $ipaddr);
  123. $ipaddr = preg_replace('/s*$/is', '', $ipaddr);
  124. if(preg_match('/http/i', $ipaddr) || $ipaddr == '') {
  125. $ipaddr = '可能来自火星';
  126. }
  127. $ipaddr = iconv('gbk', 'utf-8//IGNORE', $ipaddr);
  128. return $ipaddr;
  129. }

下载QQWry.Dat放在网站根目录,注意是网站根目录!

下载
  

来源:城通网盘 | 提取码:8188

打开主题评论模板comments.php文件,在您想显示的位置加上如下代码:

  1. <?php echo convertip($comments->ip); ?>

Typecho配置CDN后获取访客真实IP地址可能会受到影响,请在Typecho站点根目录里的config.inc.php添加下面这段代码即可。有的虚拟主机会自带CDN,所以哪怕没有配置CDN,只要不能正常显示,也可以尝试插入以下代码。

  1. //绕过 CDN 代理IP获取客户真实IP地址
  2. if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
  3. {
  4. $list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
  5. $_SERVER['REMOTE_ADDR'] = $list[0];
  6. }

效果如图
请输入图片描述

本文来自投稿,不代表本站立场,如若转载,请注明出处:
-- 展开阅读全文 --
给TYPECHO加上导航菜单
« 上一篇 10-06
网站插入高清bilibili视频代码
下一篇 » 10-31

发表评论

  • 泡泡
  • 阿呆
  • 阿鲁
  • 蛆音娘

行为验证™ 安全组件加载中...

V注册会员 L评论等级
R31 条回复
  1. Qicloud  山东省
    2022-10-31     Win 8 /    Chrome

    [secret]  俺也加了,用的高德[/secret]

    1. 云帆沧海  河北省
      2022-10-31     iPhone /    Safari

      @Qicloud

      嗯嗯

  2. chenmo  湖南省
    2022-10-31     Win 10 /    Chrome

    如果 是IPV6的地址呢?

    1. 云帆沧海  河北省
      2022-10-31     iPhone /    Safari

      @chenmo

      暂不支持

  3. 风记星辰  辽宁省
    2022-10-31     Win 10 /    Chrome

    时间 ::(你懂的)

    1. 云帆沧海  河北省
      2022-10-31     iPhone /    Safari

      @风记星辰

      刚把操作方法整理出来

  4. Guangran  湖南省
    2022-08-17     Win 10 /    Chrome

    试试看我的坐标

    1. Guangran  江西省
      2022-08-17     Win 10 /    Chrome

      @Guangran

      闪现

  5. 晚风  广东省
    2022-08-11     Win 10 /    Chrome

    老哥可以解答一下php代码怎么解析到省吗,我在网上看到的都是全部解析了,那段代码我看了很久不知道怎么修改,只让他解析到省份

    1. 云帆沧海  河北省
      2022-08-11     Win 10 /    Chrome

      @晚风

      只显示地区,不显示后面的网络请把$ipaddr = "$ipAddr1 $ipAddr2";改为$ipaddr = "$ipAddr1";即可。至于如何只显示省份或者国家,可以使用 strpos()来匹配文字并截断返回就可以了

      1. 晚风  广东省
        2022-08-11     Win 10 /    Chrome

        @云帆沧海

        感谢老哥提供的思路,我也不判断了,直接截断3个字符去了, $ipaddr = substr($ipaddr,0,9);

  6. xmmmmmovo  山东省
    2022-08-09     MacOS /    Chrome

    话说这个博客主题是老哥自己写的吗 真的好看

    1. 云帆沧海  河北省
      2022-08-09     iPhone /    Safari

      @xmmmmmovo

      不是,别人的简单修改了下

  7. xmmmmmovo  山东省
    2022-08-09     MacOS /    Chrome

    测试测试~

  8. Net  河北省
    2022-07-23     Win 7 /    Chrome

    河北 前来报道!

    1. 云帆沧海  河北省
      2022-07-23     iPhone /    Safari

      @Net

      欢迎

  9. HELLOYOSI  江苏省
    2022-07-17     Win 10 /    Chrome

    跟你的风,我也搞了一个::(笑尿)

    1. 云帆沧海  河北省
      2022-07-17     Win 10 /    Chrome

      @HELLOYOSI

      挺好

  10. Teacher Du  北京市
    2022-07-06     Win 10 /    Chrome

    这个得支持下!

  11.  江苏省
    2022-07-04     MacOS /    Safari

    有些网站就是社会舆论场,龙蛇混杂,显示ip省份感觉还是有必要的,虽然国内可以是国外的代理,但是国外的无法使用国内的代理,因为国内所有的服务商都是备案的。

    1. 云帆沧海  河北省
      2022-07-04     Win 10 /    Chrome

      @锦

      是的是的

  12. S̆̈  江苏省
    2022-07-03     MacOS /    Safari

    [secret]  大发的插件最好用[/secret]

    1. 云帆沧海  河北省
      2022-07-03     Win 10 /    Chrome

      @S̆̈

      typecho 有么?

没有更多评论了
AI
AI在线
以确保在用户需要帮助时能够及时提供解答和技术支持
您好,这里是乙未博客 - 一万年太久只争朝夕,请问有什么能帮到您?