使用PHP检测用户的连接类型:3G、4G、WiFi或数据流量。

6

有没有办法使用PHP脚本检测用户的连接。想要检测3g,WIFI,4g和Lite。我想检测用户来自哪里。我已经有JavaScript的解决方案,但因为某些原因我希望用PHP实现。


我认为这是不可能的。客户端机器为什么会告诉你呢?有什么JavaScript解决方案吗? - John Dvorak
在JavaScript中,我发现了这个navigator.connection。就像我们可以使用PHP找到客户端的IP一样,所以我在想是否有任何解决方案来获取他的连接类型。 - Daniyal Ahmed
这只在Firefox浏览器中出现。 - Praveen Puglia
你可以在PHP中获取用户的IP地址(或者至少是用户所在洋葱路由网络中的某个IP地址)。不过,不确定这能告诉你多少信息。对于TOR IP地址来说... 作用不大。 - John Dvorak
3个回答

18

有时你可以区分WiFi和非WiFi连接,但有时你无法区分它们。

使用PHP你永远无法区分3G / 4G / LTE连接。

假设和术语

我假设智能手机通过浏览器连接到您的HTTP服务器,而您的服务器使用PHP处理请求。如果不是这种情况,请澄清您的问题。

术语:我将使用“ISP”一词来指代提供互联网服务但不是电话运营商的公司。

服务器收到哪些信息?

当您的设备连接到PHP服务器时,它会向服务器提供一些关于自身的信息,例如设备的IP地址,用户代理等。

问题

问题在于浏览器“不关心”它连接到了什么网络,也不会影响浏览器发送给服务器的信息。如果浏览器连接到了3G / 4G / LTE网络,那么它发送的信息将与连接到WiFi网络时发送的完全相同。

半证明:传输数据从设备到HTTP服务器的HTTP协议完全忽略底层网络堆栈。

那么我们如何识别连接呢?

唯一区分WiFi / 非WiFi的方法是:IP地址。

ISP有一个保留IP地址的大列表。如果您可以检测到此IP地址属于特定的ISP,则必须是WiFi连接。

同样,电话运营商也有一个保留IP地址的大列表。如果您可以检测到此IP地址属于特定的电话运营商,则必须是3G / 4G / LTE连接!

实践中如何实现

我们需要将每个IP地址与ISP /运营商相关联,一种方法是拥有所有ISP /运营商及其各自保留IP的巨大数据库。 实际上,简单的WHOIS查找可以显示来源。

例如,针对随机IP的WHOIS查找: 109.168.97.31显示了:

descr:013 Netvision

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连接。


也许我应该在 GitHub 上发起这个项目。 - Daniyal Ahmed
维基百科上有一个(部分)移动网络运营商列表,它可能是一个好的起点:http://en.wikipedia.org/wiki/List_of_mobile_network_operators - Stephan
我们使用ip2location服务来进行IP地址的地理定位。 - Hossein Jazayeri

0
一个比较可行的解决方案是使用 geoip_isp_by_name php 函数获取 ISP 名称,然后通过一些 API 或者爬取技术来检查这个 ISP 提供哪些技术。

0

在PHP或任何其他服务器端语言中都不可能实现。您必须从客户端(浏览器)获取此类信息,目前没有标准的HTTP头可以让浏览器使用它来传递连接类型信息(HTTP头字段列表)。

浏览器可能知道连接类型,您可以使用客户端脚本(即JavaScript)或插件获取该信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接