有没有办法通过使用 PHP 脚本来检测用户的连接。想要检测 3g、WIFI、4g 和 Lite。我想检测用户来自哪里。我已经有一个 JavaScript 解决方案,但出于某些原因我想要它在 PHP 中。
3 回答
有时你可以分辨出 WIFI 和非 WIFI 的区别,有时你不能分辨出任何区别。
您永远无法区分 3G/4G/LTE 与 php。
假设和术语
我假设智能手机通过浏览器连接到您的 HTTP 服务器,并且您的服务器使用 PHP 来处理请求。如果不是这种情况,请澄清您的问题。
术语:我将使用“ISP”一词来指代提供互联网服务但不是电话运营商的公司。
服务器得到什么信息?
当您的设备连接到 PHP 服务器时,它会告诉服务器一些关于自身的信息,服务器可以知道设备的 IP 地址、用户代理等。
问题
问题是浏览器“不在乎”它在什么连接上,并且它对浏览器发送到服务器的信息没有影响。如果浏览器在 3G/4G/LTE 上,它将发送与在 Wifi 上发送的完全相同的信息。
半“证明”:将数据从设备传输到 HTTP 服务器的 HTTP 协议完全不了解底层网络堆栈。
那么,我们如何识别连接呢?
Wifi/Non-Wifi 之间的唯一区别是:IP 地址。
ISP 有大量保留的 IP 地址。如果您可以检测到此 IP 地址属于特定的 ISP,则这一定是 Wifi 连接。
同样,电话运营商也有大量保留的 IP 地址。如果您可以检测到此 IP 地址属于特定的电话运营商,则这一定是 3G/4G/LTE 连接!
在实践中这样做
我们需要以某种方式将每个 IP 地址与 ISP/运营商相关联,一种方法是拥有一个包含所有 ISP/运营商及其各自保留 IP 的庞大数据库。在实践中,简单的 WHOIS 查询可以揭示来源。
例如,对随机 IP 的 WHOIS 查询:109.168.97.31 显示:
描述: 013 网视
Netvision 是一家以色列互联网提供商。因此,如果这是电话连接(您可以使用用户代理检查),这必须是 Wifi 连接!
用 PHP 做
我对PHP有一点了解,也许有更好的知识的人会更好地编辑这个部分。代码大概是这样的:
$company_name = geoip_isp_by_name($_SERVER['REMOTE_ADDR']);
$this_is_a_wifi_connection = is_this_wifi($company_name);
该功能is_this_wifi
应在数据库中查找公司名称并确定这是电话运营商还是 ISP 公司。
问题
您仍然需要一份 ISP / 运营商列表,以便将您的 WHOIS 查询与他们进行比较。
有些人使用 VPN / 匿名网络,IP 地址可能会撒谎。
有些公司既是 ISP 又是运营商,在这种情况下你永远不会知道它是否是 Wifi 连接。
这在 PHP 或任何其他服务器端语言中是不可能的。您必须从客户端(浏览器)获取此类信息,目前没有标准的 HTTP 标头可供浏览器使用它来传递连接类型信息(HTTP 标头字段列表)。
浏览器可能知道连接类型,您可能能够使用客户端脚本(即 javascript)或插件获取该信息。
一种可能的解决方案是使用 geoip_isp_by_name php 函数来获取 ISP 的名称,然后通过一些 API 或抓取检查该 ISP 提供的技术。