省份与运营商定向
来源:互联网 发布:阿里云cdn配置https 编辑:程序博客网 时间:2024/05/17 01:37
我接触的互联网产品,基本都需要定向推广以及营销,何谓定向, 对某类群体用户推广以及定向--->省份和运营商,算是大范围的一个定向推广吧。
就目前知道的有2类方式: ip 和imsi
ip定向,根据ip来获取省份,但是ip具有不规律性以及变动较大的原因,如果要求高,需要完善的ip库,获取方法如下,相信这样额
public final static String getIpAddress(HttpServletRequest request) throws Exception {
// 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
String ip = request.getHeader("X-Forwarded-For");
if (logger.isInfoEnabled()) {
logger.info("getIpAddress(HttpServletRequest) - X-Forwarded-For - String ip=" + ip);
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
if (logger.isInfoEnabled()) {
logger.info("getIpAddress(HttpServletRequest) - Proxy-Client-IP - String ip=" + ip);
}
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
if (logger.isInfoEnabled()) {
logger.info("getIpAddress(HttpServletRequest) - WL-Proxy-Client-IP - String ip=" + ip);
}
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
if (logger.isInfoEnabled()) {
logger.info("getIpAddress(HttpServletRequest) - HTTP_CLIENT_IP - String ip=" + ip);
}
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
if (logger.isInfoEnabled()) {
logger.info("getIpAddress(HttpServletRequest) - HTTP_X_FORWARDED_FOR - String ip=" + ip);
}
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
if (logger.isInfoEnabled()) {
logger.info("getIpAddress(HttpServletRequest) - getRemoteAddr - String ip=" + ip);
}
}
} else if (ip.length() > 15) {
String[] ips = ip.split(",");
for (int index = 0; index < ips.length; index++) {
String strIp = (String) ips[index];
if (!("unknown".equalsIgnoreCase(strIp))) {
ip = strIp;
break;
}
}
}
return ip;
}
第二部,拿到ip咋办呢.
看到这图就这道麻烦聊,将上图的范围全部转换long,那么他在long的范围
目前处理办法如下,将ip转换成long
转换成ip之后就根据sql去定位,只要在这个范围是吧,后面因为查询频繁,将结果缓存到redis里了, 或者把整个转换的结果放到redis里,根据redis提供的范围函数去匹配来减轻db的压力
2:imsi
public static String getMobileByIMSI(String imsi) {
String moblie = "";
int index = 0;
if (imsi != null && !"".equals(imsi) && imsi.length() > 10) {
String mnc = imsi.substring(0, 5);
String msin = imsi.substring(5, imsi.length());
int nMNC = Integer.parseInt(mnc);
switch (nMNC) {
// 移动
case 46000:
index = Integer.parseInt(msin.substring(3, 4)); // 13S号码段
if (index >= 5 && index <= 9) {
moblie = "13";
moblie += index;
moblie += "0";
moblie += msin.substring(0, 3);
} else {
moblie = "13";
moblie += index+5;
moblie += msin.substring(4, 5);
moblie += msin.substring(0, 3);
}
break;
//移动
case 46002:
index = Integer.parseInt(msin.substring(0, 1));
switch (index) {
case 0:
if (Integer.parseInt(msin.substring(1, 2)) <= 8) {
moblie = "134" + msin.substring(1, 5);
}
break;
case 1:
case 2:
case 8:
case 9:
moblie = "15"+index + msin.substring(1, 5);
break;
case 3:
moblie = "150" + msin.substring(1, 5);
break;
case 5:
moblie = "183" + msin.substring(1, 5);
break;
case 6:
moblie = "182" + msin.substring(1, 5);
break;
case 7:
moblie = "187" + msin.substring(1, 5);
break;
}
break;
//移动
case 46007:
index = Integer.parseInt(msin.substring(0, 1));
switch (index) {
case 7:
moblie = "157" + msin.substring(1, 5);
break;
case 8:
moblie = "188" + msin.substring(1, 5);
break;
case 9:
moblie = "147" + msin.substring(1, 5);
break;
}
break;
// 联通
case 46001:
index = Integer.parseInt(msin.substring(4, 5));
switch (index) {
// 13段
case 0:
case 1:
moblie += "130";
moblie += msin.substring(3, 4);
moblie += msin.substring(0, 3);
break;
case 9:
moblie += "131";
moblie += msin.substring(3, 4);
moblie += msin.substring(0, 3);
break;
case 2:
moblie += "132";
moblie += msin.substring(3, 4);
moblie += msin.substring(0, 3);
break;
// 15段
case 3:
moblie += "156";
moblie += msin.substring(3, 4);
moblie += msin.substring(0, 3);
break;
case 4:
moblie += "155";
moblie += msin.substring(3, 4);
moblie += msin.substring(0, 3);
break;
// 18段
case 6:
moblie += "186";
moblie += msin.substring(3, 4);
moblie += msin.substring(0, 3);
break;
case 5:
moblie += "185";
moblie += msin.substring(3, 4);
moblie += msin.substring(0, 3);
break;
}
break;
// 电信
case 46003:
if (msin.substring(0, 1).equals("0")) {
index = Integer.parseInt(msin.substring(1, 2));
switch (index) {
case 9:
if ("00" == msin.substring(2, 4)) {
moblie += "13301";
moblie += msin.substring(4, 6);
} else if ("53" == msin.substring(2, 4) || "54" == msin.substring(2, 4)) {
moblie += "133";
moblie += Integer.parseInt(msin.substring(2, 6)) + 4500;
} else {
moblie += "133";
moblie += msin.substring(2, 6);
}
break;
case 3:
moblie += "133";
moblie += Integer.parseInt(msin.substring(2, 6)) + 5000;
break;
}
} else {
moblie += "153";
moblie += msin.substring(1, 3);
moblie += msin.substring(4, 6);
}
break;
default:
break;
}
}
return moblie;
根据imsi获取mobile标识,然后去imsi卡库匹配
运营山判断:
public static String getNetType(String imsi) {
String netType = "";
if (imsi != null && !"".equals(imsi) && imsi.length() > 10) {
String mnc = imsi.substring(0, 5);
int nMNC = Integer.parseInt(mnc);
switch (nMNC) {
// 移动
case 46000:
netType = "2";
break;
//移动
case 46002:
netType = "2";
break;
//移动
case 46007:
netType = "2";
break;
// 联通
case 46001:
netType = "3";
break;
// 电信
case 46003:
netType = "4";
break;
default:
break;
}
}
return netType;
}
我们做的 ,只是让结果跟家靠近吧,代码没咋整理...
- 省份与运营商定向
- 获取手机号码所属省份、城市、运营商Api接口
- 获取客户端外网IP,省份,城市,运营商
- 大数据与运营商
- SP与运营商的关系
- 运营商SGSN与GGSN作用
- 运营商渗透测试与挑战
- 运营商渗透测试与挑战
- 运营商与云计算大坑
- 省份与城市集连的脚本
- 中国省份与城市数据库插入
- 运营商
- 运营商
- 虚拟运营商:互联网企业与基础电信运营商的博弈
- 水煮运营商与虚拟运营商未来的争斗
- 中国省份与城市 app常用省份和城市(2015-4-16日 更新)
- 中国电信运营商重组与3G标准
- 手机制式与运营商的关系
- Servlet_01:eclipse 创建 Web 项目
- 基于vs2005+wince6.0系统的触摸屏 tcp/ip联调总结
- 实现Home键效果
- Mysql配置Mysql-proxy读写分离
- salt常见用法
- 省份与运营商定向
- ES6(ECMAScript 6 ) const命令
- Python学习 读书笔记(1)
- Ubuntu16.04连上wifi不能上网解决
- 《高质量C++编程指南》摘录3
- PHP安全编程之文件包含的代码注入攻击
- 单例模式的七种写法
- ListView的分批加载简单操作
- post和get的区别