号码归属地及运营商查询工具

import com.google.i18n.phonenumbers.NumberParseException;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.Phonenumber;
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
import com.google.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** 电话号码工具类** @author Cron* @date 2020/12/21*/
public class PhoneUtil {private static final PhoneNumberUtil phoneNumberUtil = PhoneNumberUtil.getInstance();private static final PhoneNumberOfflineGeocoder geocoder = PhoneNumberOfflineGeocoder.getInstance();//********************************号码段更新时间:2020年1月10日更新 ******************************/*** 中国电信号码格式验证* 手机段: 133,149,153,173,177,180,181,189,199,193,191,190,1700,1701,1702,162,1410**/public static final String CHINA_TELECOM_PATTERN = "(^(?:133|149|153|162|1700|1701|1702|173|177|18[019]|19[0139])\\d{7,8}$)";/*** 中国联通号码格式验证* 手机段:130,131,132,145,146,155,156,166,175,176,185,186,196,1704,1707,1708,1709,171,167**/public static final String CHINA_UNICOM_PATTERN = "(^(?:13[0-2]|145|15[56]|176|167|1704|1707|1708|1709|171|18[56])\\d{7,8}$)";/*** 中国移动号码格式验证* 手机段:134,135,136,137,138,139,147,148,150,151,152,157,158,159,172,178,182,183,184,187,188,198,197,195,1703,1705,1706,165,1440**/public static final String CHINA_MOBILE_PATTERN = "(^134[0-8]\\d{7}$|^(?:13[5-9]|147|15[0-27-9]|178|1703|1705|1706|18[2-478])\\d{7,8}$)";/*** 根据国家代码和手机号 判断手机号是否有效** @param phoneNumber 手机号码* @param countryCode 国号(区号)* @return true / false*/public static boolean checkPhoneNumber(long phoneNumber, int countryCode) {PhoneNumber pn = new PhoneNumber();pn.setCountryCode(countryCode);pn.setNationalNumber(phoneNumber);return phoneNumberUtil.isValidNumber(pn);}private static final Pattern phoneReg = Pattern.compile("\\+(9[976]\\d|8[987530]\\d|6[987]\\d|5[90]\\d|42\\d|3[875]\\d|2[98654321]\\d|9[8543210]|8[6421]|6[6543210]|5[87654321]|4[987654310]|3[9643210]|2[70]|7|1)\\d{1,14}$");public static Map<String, Object> getPhoneNumberInfo(String phoneNumber) {// 正则校验Matcher matcher = phoneReg.matcher(phoneNumber);if (!matcher.find()) {throw BusinessException.create(MpsError.DATA_NOT_EXIST_ERROR, "信息查询失败");}Phonenumber.PhoneNumber referencePhonenumber;try {String language = "CN";referencePhonenumber = phoneNumberUtil.parse(phoneNumber, language);} catch (NumberParseException e) {throw BusinessException.create(MpsError.DATA_NOT_EXIST_ERROR, "信息查询失败");}String regionCodeForNumber = phoneNumberUtil.getRegionCodeForNumber(referencePhonenumber);if (regionCodeForNumber == null) {throw BusinessException.create(MpsError.DATA_NOT_EXIST_ERROR, "信息查询失败");}boolean checkSuccess = PhoneUtil.checkPhoneNumber(referencePhonenumber.getNationalNumber(), referencePhonenumber.getCountryCode());if (!checkSuccess) {throw BusinessException.create(MpsError.DATA_NOT_EXIST_ERROR, "信息查询失败");}String description = geocoder.getDescriptionForNumber(referencePhonenumber, Locale.CHINA);int countryCode = referencePhonenumber.getCountryCode();long nationalNumber = referencePhonenumber.getNationalNumber();Map<String, Object> result = new HashMap<>();// 区域编码 Locale : HK, US, CN ...result.put("regionCode", regionCodeForNumber);// 国号: 86, 1, 852 ... @link: https://blog.csdn.net/wzygis/article/details/45073327result.put("countryCode", countryCode);// 去掉+号 和 国号/区号 后的实际号码result.put("nationalNumber", nationalNumber);// 所在地区描述信息result.put("description", description);// 去掉+号后的号码 (用于阿里云发送短信)result.put("number", String.valueOf(countryCode) + nationalNumber);result.put("fullNumber", phoneNumber);//运营商setCarrierInfo(nationalNumber, result);return result;}/*** 查询电话属于哪个运营商** @param tel 手机号码* @return 0:不属于任何一个运营商,1:移动,2:联通,3:电信*/public static Integer isChinaMobilePhoneNum(String tel) {boolean b1 = tel != null && !tel.trim().equals("") && match(CHINA_MOBILE_PATTERN, tel);if (b1) {return 1;}b1 = tel != null && !tel.trim().equals("") && match(CHINA_UNICOM_PATTERN, tel);if (b1) {return 2;}b1 = tel != null && !tel.trim().equals("") && match(CHINA_TELECOM_PATTERN, tel);if (b1) {return 3;}return 0;}/*** 匹配函数** @param regex regex* @param tel   tel* @return boolean*/private static boolean match(String regex, String tel) {return Pattern.matches(regex, tel);}/*** 根据手机号 判断手机运营商** @param phoneNumber 手机号码*/private static void setCarrierInfo(long phoneNumber, Map<String, Object> result) {Integer num = isChinaMobilePhoneNum(phoneNumber + "");String carrier = "";switch (num) {case 1:carrier += "移动";break;case 2:carrier += "联通";break;case 3:carrier += "电信";break;default:carrier += "未知运营商";break;}result.put("carrier", carrier);}public static void main(String[] args) {Map<String, Object> phoneNumberInfo = PhoneUtil.getPhoneNumberInfo("+86"+tel);System.out.println(phoneNumberInfo.get("carrier"));}
}

号码归属地及运营商查询工具相关推荐

  1. 老板丢给我一堆电话号码,让我挨个进行归属地、运营商查询

      如果觉得文章写得好,如果你想要博客文章中的数据,请关注公众号:[数据分析与统计学之美],添加作者[个人微信],进群和作者交流! 目录   1.写作目的   2.判断电话号码是否合法    1)移动 ...

  2. 调用第三方API ,实现手机号码归属地及运营商查询

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 运行结果: 中国电信 西双版纳 西双版纳,中国电信 代码: import java.io.Buffe ...

  3. 手机号码归属地及运营商查询

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. import java.io.InputStreamReader; import java.net. ...

  4. 手机号归属地运营商查询-JAVA

    手机归属地运营商查询 简介 根据手机号确定手机号运营商即归属地, 支持包括虚拟运营商的中国大陆手机号查询. Github: https://github.com/EeeMt/phone-number- ...

  5. 最全的根据号码判断运营商的工具类

    最全的根据传入号码判断该号码属于哪个运营商的工具类 public class OperatorUtils {private static String CMCC = "移动";pr ...

  6. python通过手机号(批量)解析出归属地、运营商、邮编、区号

    python解读出手机号的归属地.运营商.邮编.区号,此处是存储在excle表格里,xlsx文件内不能有中文名称,包括表头 from phone import Phone import xlrd im ...

  7. 程序人生 - 通过运营商查询最近去过的城市(疫情防控神器)

    近日,三大运营商推出了个人轨迹证明的服务,可以发送短信查看你1个月内的行踪. 可根据这个信息来证明你近1个月内是否离开过所在地,但是此业务为公益服务,漫游信息仅供参考,不作为最终判定依据. 小编亲测中 ...

  8. Java 获取手机号码归属地以及运营商

    maven配置 <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore --><depe ...

  9. 如何用易语言制作微转运国际速递运单查询工具

    前几天有个喜欢海淘的朋友就问我,能不能帮他制作运单查询软件,我问她想干嘛?她就说她经常在海外网站买东西,用的一直是微转运国际速递.所以她每次查询运单都要一次打开浏览器又一次关闭浏览器,十分繁琐.就问问 ...

最新文章

  1. Android 串口通讯
  2. AWS ELB Sticky Session有问题?别忘了AWSELB cookie
  3. java中的多态与继承_【Java学习笔记之十六】浅谈Java中的继承与多态
  4. matlab气相分解反应动力学,第十二章 化学动力学.ppt
  5. POJ3349 哈希算法
  6. Only a type can be imported. xxxx resolves to a package
  7. Android 蓝牙开发(2)——低功耗蓝牙
  8. C++ static、const和static const类型成员变量声明及其初始化
  9. Ruby中对应PHP的hex2bin和bin2hex方法
  10. Linux基础知识以及常见面试问题
  11. deepinv2 添加打印机_Deepin系统上安装使用HP惠普打印机的方法
  12. 为什么都说阿里 P7 的晋升是道坎?
  13. java 注解 entity_详解Java中的注解
  14. 吊打全球的顶级毫米波数字阵列项目-MIDAS
  15. C++调用Matlab生成的DLL动态链接库进行混合编程(win10+VS2015+Matlab2016b)
  16. 194.Vue.js智能扫码点餐系统(二十八)【支付宝支付流程、Nodejs支付源码解析、 实现支付功能(支付宝支付)】2019.04.01
  17. 华润微CS88M312单片机带ADC 的8位低功耗MCU
  18. Kubernetes 开发【1】——webhook 实现 API Server 请求拦截和修改
  19. 数学归纳法的5种常用形式——证明题的利器
  20. java cookbook 3_CookBook/Java核心/3-Java反射.md at master · Byron4j/CookBook · GitHub

热门文章

  1. 计算机房电源引入方式,(完整版)通信机房电源计算公式.pdf
  2. 常见面试题之布隆过滤器的使用案例(海量数据)
  3. python 英语翻译 excel_Python调用百度翻译api批量翻译Excel这工作效率
  4. JS工具库moment —— 实现日历
  5. Java实现 洛谷 P1064 金明的预算方案
  6. Python27 No module named PIL解决方法
  7. IOS 视频直播常用集成
  8. 输入一个数字n,输出一个n层的特定三角形
  9. 工程师为什么不转销售
  10. Nginx优化与防盗链