抓取网站访客手机号
我们先了解一下常规移动网络的连接方式
WIFI,手机wifi上网其实电信、联通、移动的移动运营平台没啥事,因为他走的路由器其实是走的传统的有线上网。所以wifi上网默认走的有线,不扣流量,也无法获得号码了
常规三网访问方式中国移动APN:CMWAP(2G) CMNET(3G)
中国电信APN:CTWAP(2G) CTNET(3G)
只有移动网络有效(电信手机、移动、联通),其他方式访问无效
手机访问网站流程,以联通为例,其他都一样
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;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
functiongetPhoneNumber()
{
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{
Returnfalse;
}
}
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: 无法取得手机号码的情况
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 如果通信运营商给送的话,一般在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");
1
2
3
4
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都有好,其它语言自行扩展就行。