【发布时间】:2009-05-13 03:43:44
【问题描述】:
如何找到查看 PHP 页面的人的 ISP 提供商?
是否可以使用 PHP 来跟踪或揭示它?
如果我使用如下内容:
gethostbyaddr($_SERVER['REMOTE_ADDR']);
它返回我的 IP 地址,而不是我的主机名或 ISP。
【问题讨论】:
标签: php internet-connection user-tracking gethostbyaddr
如何找到查看 PHP 页面的人的 ISP 提供商?
是否可以使用 PHP 来跟踪或揭示它?
如果我使用如下内容:
gethostbyaddr($_SERVER['REMOTE_ADDR']);
它返回我的 IP 地址,而不是我的主机名或 ISP。
【问题讨论】:
标签: php internet-connection user-tracking gethostbyaddr
这似乎是您要查找的内容,如果可能,它将尝试返回完整的主机名:
【讨论】:
编辑:此方法不再有效,因为它所访问的网站现在会阻止自动查询(以前此方法违反了网站的使用条款)。下面还有其他几个不错的 [合法!] 答案(包括 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>
【讨论】:
HTTP 标头中没有任何内容表明用户来自哪个 ISP,因此答案是否定的,没有 PHP 内置函数会告诉您这一点。您必须使用某种将 IP 映射到网络/ISP 的服务或库。
【讨论】:
gethostbyaddr 不被认为是“内置函数”吗? 也许该函数在 09 年不存在,但如今,它似乎可以识别基于 ISP在 IP 上,没有问题。
为什么不使用 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
【讨论】:
有时字段会发生变化,所以这是对上述帖子的改进。
<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>
【讨论】:
GeoIP 将为您提供帮助:http://www.maxmind.com/app/locate_my_ip
有一个用于访问geoip数据的php库:http://www.maxmind.com/app/php
注意,您需要将 geoip db 放在您的机器上才能使其工作,所有说明都在那里 :)
【讨论】:
您不能依靠 IP 地址或主机名来了解某人正在使用的 ISP。 事实上,他可能根本不使用 ISP,或者他可能通过 VPN 连接登录到他的工作地点,从那里使用另一个 VPN 或远程桌面到世界另一端的托管服务,然后从那里连接到你. 您获得的 IP 地址可能来自最后一台远程机器,也可能来自该机器所在的某个防火墙,而该防火墙可能又位于其他地方。
【讨论】:
我试图更正 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>
请注意,仅提供用户代理可能就足够了,而且很可能不需要额外的标头,我只是添加它们以使请求看起来更真实。
【讨论】:
如果所有这些答案都没有用,那么您可以尝试 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。
【讨论】:
您可以从 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();
?>
【讨论】:
我认为您需要使用一些第三方服务(可能是 Web 服务)来查找 IP 并找到服务提供商。
【讨论】:
这将为您提供您的互联网地址。将该地址插入数据库http://arin.net/whois
【讨论】:
<?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) 名称
【讨论】:
一个快速的选择。 (该网站每分钟最多允许 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 详细信息。
【讨论】:
这是从站点或 ip 找到 isp 的正确方法。
<?php
$isp = geoip_isp_by_name('www.example.com');
if ($isp) {
echo 'This host IP is from ISP: ' . $isp;
}
?>
【讨论】: