WAP获取访客手机号码

  • 发表于
  • PHP

抓取网站访客手机号

我们先了解一下常规移动网络的连接方式

  1. WIFI,手机wifi上网其实电信、联通、移动的移动运营平台没啥事,因为他走的路由器其实是走的传统的有线上网。所以wifi上网默认走的有线,不扣流量,也无法获得号码了
  2. 常规三网访问方式
    1. 中国移动APN:CMWAP(2G) CMNET(3G)
    2. 中国电信APN:CTWAP(2G) CTNET(3G)
  3. 只有移动网络有效(电信手机、移动、联通),其他方式访问无效

手机访问网站流程,以联通为例,其他都一样

3GNET的访问方式是,网络直连,及把你的手机当做一台PC一样,给你一个独立的通道接入互联网,联通只提供线路,不做服务器中转让你直达ChinaNet然后再中转到目标网站

3GWAP的访问方式是,压缩访问,方式是手机先发出一个访问的请求,由联通的WAP服务器中转站接收到你的请求后,由WAP服务器派出指定请求去访问你的网站,然后获取到数据后,经由WAP中转服务器进行数据压缩后回传到你的手机上。

经过以上分析大家应该都清楚,通过程序抓取WAP网站访客的手机号是完全可以显现的。但并非100%能获取到。

PHP WAP获取访客手机号码

function getPhoneNumber()
{
if (isset($_SERVER['HTTP_X_NETWORK_INFO '])) {
$str1 = $_SERVER['HTTP_X_NETWORK_INFO '];
$getstr1 = preg_replace('/(.*,)(11[d])(,.*)/i ', '2 ', $str1);
Return $getstr1;
} elseif (isset($_SERVER['HTTP_X_UP_CALLING_LINE_ID '])) {
$getstr2 = $_SERVER['HTTP_X_UP_CALLING_LINE_ID '];
Return $getstr2;
} elseif (isset($_SERVER['HTTP_X_UP_SUBNO '])) {
$str3 = $_SERVER['HTTP_X_UP_SUBNO '];
$getstr3 = preg_replace('/(.*)(11[d])(.*)/i ', '2 ', $str3);
Return $getstr3;
} elseif (isset($_SERVER['DEVICEID '])) {
Return $_SERVER['DEVICEID '];
} else {
Return false;
}
}

JAVA

// 如果通信运营商给送的话,一般在Http请求头的x-up-calling-line-id项里  
String mobile = request.getHeader("x-up-calling-line-id");   // GPRS  
if (mobile == null) {  
    mobile = request.getHeader("x-up-subno");   // CDMA  
}  
if (mobile == null) {  
    mobile = request.getHeader("x-network-info");  
}  
if (mobile == null) {  
    mobile = request.getHeader("deviceid");  
}  
if (mobile == null) {  
    // 有些wap门户站点跳转过来,手机号码由参数mobile传递过来  
    mobile = request.getParameter("mobile");  
}  
if (mobile != null) {  
    // 某些情况下,手机号码前面会加上中国国际区号86,需要去掉  
    if (mobile.length() == 13 && mobile.startsWith("86")) {  
        mobile = mobile.substring(2);  
    }  
    // TODO: 现在,程序可以认为用户身份(手机号码)已经确认,免登录(手机上输入账号密码不太容易)  
} else {  
    // TODO: 无法取得手机号码的情况  
} 

取手机号码常用参数

String   Mobile_GPRS   =   request.getHeader("X-up-calling-line-id");  
String   Mobile_CDMA   =   request.getHeader("x-up-subno");  
String   Mobile_INFO     =   request.getHeader("x-network-info");  
String   Mobile_DEVI     =   request.getHeader("deviceid");  

既然原理和DEMO都有好,其它语言自行扩展就行。