typecho网站评论者UA及IP转真实地址

具体实现的效果可看下图。

4172008559.jpg

要实现此效果共分两部分,我们一步一步来。

首先第一步先实现UA部分,在此再次感谢黑冰技术站的博主大大提供的教程。

在主题模板的functions.php文件里添加以下代码。

  1. /** 获取浏览器信息 */
  2. function getBrowser($agent){
  3. $outputer = false;
  4. if (preg_match('/MSIE\s([^\s|;]+)/i', $agent, $regs)) {
  5. $outputer = 'IE浏览器';
  6. } else if (preg_match('/FireFox\/([^\s]+)/i', $agent, $regs)) {
  7. $str1 = explode('Firefox/', $regs[0]);
  8. $FireFox_vern = explode('.', $str1[1]);
  9. $outputer = '火狐浏览器 '. $FireFox_vern[0];
  10. } else if (preg_match('/Maxthon([\d]*)\/([^\s]+)/i', $agent, $regs)) {
  11. $str1 = explode('Maxthon/', $agent);
  12. $Maxthon_vern = explode('.', $str1[1]);
  13. $outputer = '傲游浏览器 '.$Maxthon_vern[0];
  14. } else if (preg_match('#SE 2([a-zA-Z0-9.]+)#i', $agent, $regs)) {
  15. $outputer = '搜狗浏览器';
  16. } else if (preg_match('#360([a-zA-Z0-9.]+)#i', $agent, $regs)) {
  17. $outputer = '360浏览器';
  18. } else if (preg_match('/Edge([\d]*)\/([^\s]+)/i', $agent, $regs)) {
  19. $str1 = explode('Edge/', $regs[0]);
  20. $Edge_vern = explode('.', $str1[1]);
  21. $outputer = 'Edge '.$Edge_vern[0];
  22. } else if (preg_match('/EdgiOS([\d]*)\/([^\s]+)/i', $agent, $regs)) {
  23. $str1 = explode('EdgiOS/', $regs[0]);
  24. $outputer = 'Edge';
  25. } else if (preg_match('/UC/i', $agent)) {
  26. $str1 = explode('rowser/', $agent);
  27. $UCBrowser_vern = explode('.', $str1[1]);
  28. $outputer = 'UC浏览器 '.$UCBrowser_vern[0];
  29. }else if (preg_match('/OPR/i', $agent)) {
  30. $str1 = explode('OPR/', $agent);
  31. $opr_vern = explode('.', $str1[1]);
  32. $outputer = '欧朋浏览器 '.$opr_vern[0];
  33. } else if (preg_match('/MicroMesseng/i', $agent, $regs)) {
  34. $outputer = '微信内嵌浏览器';
  35. } else if (preg_match('/WeiBo/i', $agent, $regs)) {
  36. $outputer = '微博内嵌浏览器';
  37. } else if (preg_match('/QQ/i', $agent, $regs)||preg_match('/QQBrowser\/([^\s]+)/i', $agent, $regs)) {
  38. $str1 = explode('rowser/', $agent);
  39. $QQ_vern = explode('.', $str1[1]);
  40. $outputer = 'QQ浏览器 '.$QQ_vern[0];
  41. } else if (preg_match('/MQBHD/i', $agent, $regs)) {
  42. $str1 = explode('MQBHD/', $agent);
  43. $QQ_vern = explode('.', $str1[1]);
  44. $outputer = 'QQ浏览器 '.$QQ_vern[0];
  45. } else if (preg_match('/BIDU/i', $agent, $regs)) {
  46. $outputer = '百度浏览器';
  47. } else if (preg_match('/LBBROWSER/i', $agent, $regs)) {
  48. $outputer = '猎豹浏览器';
  49. } else if (preg_match('/TheWorld/i', $agent, $regs)) {
  50. $outputer = '世界之窗浏览器';
  51. } else if (preg_match('/XiaoMi/i', $agent, $regs)) {
  52. $outputer = '小米浏览器';
  53. } else if (preg_match('/UBrowser/i', $agent, $regs)) {
  54. $str1 = explode('rowser/', $agent);
  55. $UCBrowser_vern = explode('.', $str1[1]);
  56. $outputer = 'UC浏览器 '.$UCBrowser_vern[0];
  57. } else if (preg_match('/mailapp/i', $agent, $regs)) {
  58. $outputer = 'email内嵌浏览器';
  59. } else if (preg_match('/2345Explorer/i', $agent, $regs)) {
  60. $outputer = '2345浏览器';
  61. } else if (preg_match('/Sleipnir/i', $agent, $regs)) {
  62. $outputer = '神马浏览器';
  63. } else if (preg_match('/YaBrowser/i', $agent, $regs)) {
  64. $outputer = 'Yandex浏览器';
  65. } else if (preg_match('/Opera[\s|\/]([^\s]+)/i', $agent, $regs)) {
  66. $outputer = 'Opera浏览器';
  67. } else if (preg_match('/MZBrowser/i', $agent, $regs)) {
  68. $outputer = '魅族浏览器';
  69. } else if (preg_match('/VivoBrowser/i', $agent, $regs)) {
  70. $outputer = 'vivo浏览器';
  71. } else if (preg_match('/Quark/i', $agent, $regs)) {
  72. $outputer = '夸克浏览器';
  73. } else if (preg_match('/mixia/i', $agent, $regs)) {
  74. $outputer = '米侠浏览器';
  75. }else if (preg_match('/fusion/i', $agent, $regs)) {
  76. $outputer = '客户端';
  77. } else if (preg_match('/CoolMarket/i', $agent, $regs)) {
  78. $outputer = '基安内置浏览器';
  79. } else if (preg_match('/Thunder/i', $agent, $regs)) {
  80. $outputer = '迅雷内置浏览器';
  81. } else if (preg_match('/Chrome([\d]*)\/([^\s]+)/i', $agent, $regs)) {
  82. $str1 = explode('Chrome/', $agent);
  83. $chrome_vern = explode('.', $str1[1]);
  84. $outputer = '<i class="fa fa-chrome"></i> Chrome '.$chrome_vern[0];
  85. } else if (preg_match('/safari\/([^\s]+)/i', $agent, $regs)) {
  86. $str1 = explode('Version/', $agent);
  87. $safari_vern = explode('.', $str1[1]);
  88. $outputer = 'Safari '.$safari_vern[0];
  89. } else{
  90. return false;
  91. }
  92. return $outputer;
  93. }
  94. /** 获取操作系统信息 */
  95. function getOs($agent){
  96. $os = false;
  97. if (preg_match('/win/i', $agent)) {
  98. if (preg_match('/nt 6.0/i', $agent)) {
  99. $os = '<i class="fa fa-windows"></i> Windows Vista';
  100. } else if (preg_match('/nt 6.1/i', $agent)) {
  101. $os = '<i class="fa fa-windows"></i> Windows 7';
  102. } else if (preg_match('/nt 6.2/i', $agent)) {
  103. $os = '<i class="fa fa-windows"></i> Windows 8';
  104. } else if(preg_match('/nt 6.3/i', $agent)) {
  105. $os = '<i class="fa fa-windows"></i> Windows 8.1';
  106. } else if(preg_match('/nt 5.1/i', $agent)) {
  107. $os = '<i class="fa fa-windows"></i> Windows XP';
  108. } else if (preg_match('/nt 10.0/i', $agent)) {
  109. $os = '<i class="fa fa-windows"></i> Windows 10';
  110. } else{
  111. $os = '<i class="fa fa-windows"></i> Windows';
  112. }
  113. } else if (preg_match('/android/i', $agent)) {
  114. if (preg_match('/android 9/i', $agent)) {
  115. $os = '<i class="fa fa-android"></i> Android P';
  116. }
  117. else if (preg_match('/android 8/i', $agent)) {
  118. $os = '<i class="fa fa-android"></i> Android O';
  119. }
  120. else if (preg_match('/android 7/i', $agent)) {
  121. $os = '<i class="fa fa-android"></i> Android N';
  122. }
  123. else if (preg_match('/android 6/i', $agent)) {
  124. $os = '<i class="fa fa-android"></i> Android M';
  125. }
  126. else if (preg_match('/android 5/i', $agent)) {
  127. $os = '<i class="fa fa-android"></i> Android L';
  128. }
  129. else{
  130. $os = '<i class="fa fa-android"></i> Android';
  131. }
  132. }
  133. else if (preg_match('/ubuntu/i', $agent)) {
  134. $os = '<i class="fa fa-linux"></i> Linux';
  135. } else if (preg_match('/linux/i', $agent)) {
  136. $os = '<i class="fa fa-linux"></i> Linux';
  137. } else if (preg_match('/iPhone/i', $agent)) {
  138. $os = '<i class="fa fa-apple"></i> iPhone';
  139. } else if (preg_match('/iPad/i', $agent)) {
  140. $os = '<i class="fa fa-apple"></i> iPad';
  141. } else if (preg_match('/mac/i', $agent)) {
  142. $os = '<i class="fa fa-OSX"></i> OSX';
  143. }else if (preg_match('/cros/i', $agent)) {
  144. $os = 'chrome os';
  145. }else {
  146. return false;
  147. }
  148. return $os;
  149. }

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

  1. <span class="agent"><?php echo getOs($comments->agent); ?></span>
  2. <span class="agent"><?php echo getBrowser($comments->agent); ?></span>

至此,你的网站评论处就会出现浏览器及操作系统。注意,博主使用的是font awesome的图标,如您也想要和博主一样的效果,去font awesome官网下载图标包或直接引用其官网的BootstrapCDN即可,否则不会出现图标。

当然这只是最普通的显示效果,您也可以设置成只显示图标,鼠标放到图标上面时再显示文字等等效果。

接下来第二步,实现IP地址转换成真实地址。

其实网上的方法一共有两种,一种是利用淘宝、新浪、百度等的IP地址查询API进行查询并通过截取字段进行前台显示。第二种就是博主使用的方法,利用纯真IP数据库进行服务器本地查询。此方法的好处是速度快,坏处就是需要定期更新数据库,不过网上更新纯真数据库的教程很多,这里就不赘述了。

继续教程,将下方代码放入主题的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放在同一级目录,否则就需要修改$dat_path的数据库地址。

添加完成后,再次打开主题评论模板comments.php文件,在您想显示的位置加上如下代码。

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

此时,评论者的IP地址就转换成了真实地址,受数据库影响,其真实地址不一定准确哈。

同时,Typecho配置CDN后获取访客真实IP地址可能会受到影响,请在Typecho站点根目录里的config.inc.php添加下面这段代码即可。

  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. }

至此,所有教程完毕。

来源:https://www.jdeal.cn/archives/ua.html


新更新一篇,相对来跟简单,容易看懂,需要可以看这里

Typecho 博客评论显示 UserAgent (UA)

将下面的样式表外链加入到header.php的head部分,当然也可通过主题设置界面添加 ua图标下载:https://www.veimoz.com/usr/upl....

文章由官网发布,如若转载,请注明出处:https://www.veimoz.com/79
2 条评论
7k

发表评论

已有 2 条评论

  1.     Win 10 /    Chrome
    2020-04-16 15:42

    如何设置成只显示图标

    1. 【管理员】Vv     Win 7 /    Chrome
      2020-04-16 16:42

      @轩

      找到相对应的functions.php代码,一般都在这个文件里面去掉相关的字就行了,保留图标:咖啡:

!