【问题标题】:How do I retrieve the visitor's ISP through PHP?如何通过 PHP 检索访问者的 ISP?
【发布时间】:2009-05-13 03:43:44
【问题描述】:

如何找到查看 PHP 页面的人的 ISP 提供商?

是否可以使用 PHP 来跟踪或揭示它?

如果我使用如下内容:

gethostbyaddr($_SERVER['REMOTE_ADDR']);

它返回我的 IP 地址,而不是我的主机名或 ISP。

【问题讨论】:

    标签: php internet-connection user-tracking gethostbyaddr


    【解决方案1】:

    这似乎是您要查找的内容,如果可能,它将尝试返回完整的主机名:

    http://us3.php.net/gethostbyaddr

    【讨论】:

    • 这就是我要找的……非常感谢
    • 没找到你.. 你如何找到使用这个的服务提供商?如果可以,请澄清
    • 等待..它返回我的IP地址...这不是我想要的
    • 此功能作为任何类型的 RDNS 查找(反向 DNS),仅当 IP 地址具有注册的 RDNS 记录时才有效。还要记住,所有注册的域名都有一个 IP,但并不是所有的 IP 都有一个相关的域。
    【解决方案2】:

    编辑:此方法不再有效,因为它所访问的网站现在会阻止自动查询(以前此方法违反了网站的使用条款)。下面还有其他几个不错的 [合法!] 答案(包括 my alternative 这个这个。)


    您可以从以下 PHP 编码中获得所有这些东西。,

    <?php
      $ip=$_SERVER['REMOTE_ADDR'];
      $url=file_get_contents("http://whatismyipaddress.com/ip/$ip");
      preg_match_all('/<th>(.*?)<\/th><td>(.*?)<\/td>/s',$url,$output,PREG_SET_ORDER);
      $isp=$output[1][2];
      $city=$output[9][2];
      $state=$output[8][2];
      $zipcode=$output[12][2];
      $country=$output[7][2];
    ?>
    <body>
      <table align="center">
        <tr><td>ISP :</td><td><?php echo $isp;?></td></tr>
        <tr><td>City :</td><td><?php echo $city;?></td></tr>
        <tr><td>State :</td><td><?php echo $state;?></td></tr>
        <tr><td>Zipcode :</td><td><?php echo $zipcode;?></td></tr>
        <tr><td>Country :</td><td><?php echo $country;?></td></tr>
      </table>
    </body>
    

    【讨论】:

    • 不知道为什么不承认这一点。效果很好!谢谢。
    • 这违反了TOS:“未经事先书面许可,您不得使用脚本、代理、应用程序或以其他方式自动查询本网站。”
    • 那么它的替代品是什么@JeffWinkworth。你能告诉我。
    • @JeffWinkworth 谁能知道谁在爬他们的网站?因此,在这种情况下,服务条款的用途是什么。
    • @عثمانغني 我没有立即意识到替代方案,但这并不能使这个“解决方案”变得更可接受。违反 TOS 就是违反 TOS。
    【解决方案3】:

    HTTP 标头中没有任何内容表明用户来自哪个 ISP,因此答案是否定的,没有 PHP 内置函数会告诉您这一点。您必须使用某种将 IP 映射到网络/ISP 的服务或库。

    【讨论】:

    • gethostbyaddr 不被认为是“内置函数”吗? 也许该函数在 09 年不存在,但如今,它似乎可以识别基于 ISP在 IP 上,没有问题。
    • 更正:那个函数确实早在 09 年就存在了。 (要爱archive.org!)
    【解决方案4】:

    为什么不使用 ARIN 的 REST API。

    <?php
    
    // get IP Address
    $ip=$_SERVER['REMOTE_ADDR'];
    
    // create a new cURL resource
    $ch = curl_init();
    
    // set URL and other appropriate options
    curl_setopt($ch, CURLOPT_URL, 'http://whois.arin.net/rest/ip/' . $ip);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json'));
    
    // execute
    $returnValue = curl_exec($ch);
    
    // close cURL resource, and free up system resources
    curl_close($ch);
    
    $result = json_decode($returnValue);
    
    echo <<<END
    <pre>
    Handle: {$result->net->handle->{'$'}}
    Ref: {$result->net->ref->{'$'}}
    Name: {$result->net->name->{'$'}}
    echo "OrgRef: {$result->net->orgRef->{'@name'}}";
    </pre>
    END;
    
    // eof
    

    https://www.arin.net/resources/whoisrws/whois_api.html

    【讨论】:

    • 仅将 ARIN 的 REST API 用于解析 ISP 名称的行为违反了他们的使用条款:arin.net/resources/registry/whois/tou
    • @MerlinTheMagic - 实际上,这取决于 OP 在检索信息时的 目的 ...您只是假设它是邪恶的,但有很多正当理由可以查询服务,属于 API 的 TOU。无论哪种方式,考虑到这个问题已有十年之久,这都是一个有争议的问题(但感谢您对互联网进行监管......我们需要更多的人这样做......或者我们需要的可能是 *fewer*。)
    • @ashleedawg 我对使用没有任何假设。 ARIN 概述了 8 种可接受的用途并声明:“……除本条款中明确描述的以外,不得暗示或允许对 Whois 服务的其他用途”。您认为 OP 用例属于 8 种可接受的用途中的哪一种?
    • @MerlinTheMagic - 我无法谈论 OP 的用例或任何发现这篇文章的人 - 这正是我的观点。没有理由假设 OP 打算违反政策。我可以说出我自己的需求,例如,很容易属于"conducting scientific research into network operations"。假设 OP 违反政策是自大/傲慢/无礼的。
    【解决方案5】:

    有时字段会发生变化,所以这是对上述帖子的改进。

    <body> 
        <table align="center">
    
    <?
     $ip=$_SERVER['REMOTE_ADDR'];
     $url=file_get_contents("http://whatismyipaddress.com/ip/$ip");
     preg_match_all('/<th>(.*?)<\/th><td>(.*?)<\/td>/s',$url,$output,PREG_SET_ORDER);
     for ($q=0; $q < 25; $q++) {
        if ($output[$q][1]) {
            if (!stripos($output[$q][2],"Blacklist")) {
                echo "<tr><td>".$output[$q][1]."</td><td>".$output[$q][2]."</td></tr>";
    
            }
        }
    }
    ?> 
        </table>
    </body> 
    

    【讨论】:

      【解决方案6】:

      GeoIP 将为您提供帮助:http://www.maxmind.com/app/locate_my_ip

      有一个用于访问geoip数据的php库:http://www.maxmind.com/app/php

      注意,您需要将 geoip db 放在您的机器上才能使其工作,所有说明都在那里 :)

      【讨论】:

        【解决方案7】:

        您不能依靠 IP 地址或主机名来了解某人正在使用的 ISP。 事实上,他可能根本不使用 ISP,或者他可能通过 VPN 连接登录到他的工作地点,从那里使用另一个 VPN 或远程桌面到世界另一端的托管服务,然后从那里连接到你. 您获得的 IP 地址可能来自最后一台远程机器,也可能来自该机器所在的某个防火墙,而该防火墙可能又位于其他地方。

        【讨论】:

          【解决方案8】:

          我试图更正 Ram Kumar 的回答,但每当我编辑他们的帖子时,我都会被暂时禁止,并且我的更改被忽略。 (至于为什么,我不知道,这是我在这个网站上所做的第一次也是唯一一次编辑。)

          自从他发帖后,由于网站更改和管理员实施基本机器人检查(检查标题),他的代码不再工作:

          <?php
          $IP = $_SERVER['REMOTE_ADDR'];
          
          $User_Agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0';
          $Accept = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
          $Accept_Language = 'en-US,en;q=0.5';
          $Referer = 'http://whatismyipaddress.com/';
          $Connection = 'keep-alive';
          
          $HTML = file_get_contents("http://whatismyipaddress.com/ip/$IP", false, stream_context_create(array('http' => array('method' => 'GET', 'header' => "User-Agent: $User_Agent\r\nAccept: $Accept\r\nAccept-Language: $Accept_Language\r\nReferer: $Referer\r\nConnection: $Connection\r\n\r\n"))));
          
          preg_match_all('/<th>(.*?)<\/th><td>(.*?)<\/td>/s', $HTML, $Matches, PREG_SET_ORDER);
          
          $ISP = $Matches[3][2];
          $City = $Matches[11][2];
          $State = $Matches[10][2];
          $ZIP = $Matches[15][2];
          $Country = $Matches[9][2];
          ?>
          <body>
              <table align="center">
                  <tr><td>ISP :</td><td><?php echo $ISP;?></td></tr>
                  <tr><td>City :</td><td><?php echo $City;?></td></tr>
                  <tr><td>State :</td><td><?php echo $State;?></td></tr>
                  <tr><td>Zipcode :</td><td><?php echo $ZIP;?></td></tr>
                  <tr><td>Country :</td><td><?php echo $Country;?></td></tr>
              </table>
          </body>
          

          请注意,仅提供用户代理可能就足够了,而且很可能不需要额外的标头,我只是添加它们以使请求看起来更真实。

          【讨论】:

            【解决方案9】:

            如果所有这些答案都没有用,那么您可以尝试 API 方式。

            1.http://extreme-ip-lookup.com/json/[IP地址在这里]

            示例: http://extreme-ip-lookup.com/json/106.192.146.13

            2.http://ip-api.com/json/[IP地址在这里]

            示例: http://ip-api.com/json/113.14.168.85

            一旦它适用于您,别忘了将 JSON 转换为 PHP。

            【讨论】:

              【解决方案10】:

              您可以从 ipinfo.io 或类似服务获取此信息。

              <?php
              
              /**
               * Get ip info from ipinfo.io
               *
               * There are other services like this, for example
               * http://extreme-ip-lookup.com/json/106.192.146.13
               * http://ip-api.com/json/113.14.168.85
               *
               * source: https://stackoverflow.com/a/54721918/3057377
               */
              function getIpInfo($ip = '') {
                  $ipinfo = file_get_contents("https://ipinfo.io/" . $ip);
                  $ipinfo_json = json_decode($ipinfo, true);
                  return $ipinfo_json;
              }
              
              function displayIpInfo($ipinfo_json) {
                  var_dump($ipinfo_json);
                  echo <<<END
              <pre>
              ip      : {$ipinfo_json['ip']}
              city    : {$ipinfo_json['city']}
              region  : {$ipinfo_json['region']}
              country : {$ipinfo_json['country']}
              loc     : {$ipinfo_json['loc']}
              postal  : {$ipinfo_json['postal']}
              org     : {$ipinfo_json['org']}
              </pre>
              END;
              }
              
              function main() {
                  echo("<h1>Server IP information</h1>");
                  $ipinfo_json = getIpInfo();
                  displayIpInfo($ipinfo_json);
              
                  echo("<h1>Visitor IP information</h1>");
                  $visitor_ip = $_SERVER['REMOTE_ADDR'];
                  $ipinfo_json = getIpInfo($visitor_ip);
                  displayIpInfo($ipinfo_json);
              }
              
              main();
              
              ?>
              

              【讨论】:

                【解决方案11】:

                我认为您需要使用一些第三方服务(可能是 Web 服务)来查找 IP 并找到服务提供商。

                【讨论】:

                  【解决方案12】:

                  转到http://whatismyip.com

                  这将为您提供您的互联网地址。将该地址插入数据库http://arin.net/whois

                  【讨论】:

                  • 这与通过 PHP 做这件事有关,究竟如何?
                  • 我没有看到您使用 php Chad 的更好方法。您可以使用 curl 或 whois - 许多选项,但如果您不了解 arin 或 whois,我提供的信息很有帮助。
                  【解决方案13】:
                  <?php
                  $isp = geoip_isp_by_name('www.example.com');
                  if ($isp) {
                      echo 'This host IP is from ISP: ' . $isp;
                  }
                  ?>
                  

                  (PECL geoip >= 1.0.2)

                  geoip_isp_by_name — 获取 Internet 服务提供商 (ISP) 名称

                  http://php.net/manual/ru/function.geoip-isp-by-name.php

                  【讨论】:

                    【解决方案14】:

                    一个快速的选择。 (该网站每分钟最多允许 50 个电话。)

                    $json=file_get_contents("https://extreme-ip-lookup.com/json/$ip");
                    extract(json_decode($json,true));
                    echo "ISP: $isp ($city, $region, $country)<br>";
                    

                    page 底部的 API 详细信息。

                    【讨论】:

                    • 限速10K/月,价格25欧元/月
                    【解决方案15】:

                    这是从站点或 ip 找到 isp 的正确方法。

                    <?php
                    $isp = geoip_isp_by_name('www.example.com');
                    if ($isp) {
                        echo 'This host IP is from ISP: ' . $isp;
                    }
                    ?>
                    

                    【讨论】:

                    • geoip_isp_by_name() 该功能目前仅适用于购买了商业GeoIP ISP版的用户。
                    • GeoIP 是一个付费库,它的源代码被高度混淆以避免分发
                    猜你喜欢
                    • 1970-01-01
                    • 2012-05-14
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-03-09
                    • 2011-12-21
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多