文章目录
-
- 通过手机号获取相关信息
-
- [1. Spring Boot通过手机号获取归属地](#1. Spring Boot通过手机号获取归属地)
- [2. 通过手机号获取归属地(基于CSV文件)](#2. 通过手机号获取归属地(基于CSV文件))
- 完整代码如下
通过手机号获取相关信息
就是通过你输入的手机号或者手机号前7位前缀来获取相关信息,如下:

实现方式如下:
情况一:通过谷歌工具实现
情况二:直接从CSV文件中查询
1. Spring Boot通过手机号获取归属地
情况一:使用谷歌依赖
目的:通过手机号获取归属地,基于谷歌提供的软件库(libphonenumber)
xml
<!-- 主要用于校验手机号的正确性 -->
<dependency>
<groupId>com.googlecode.libphonenumber</groupId>
<artifactId>libphonenumber</artifactId>
<version>8.13.26</version>
</dependency>
<!-- 主要用于获取手机号的供应商 -->
<dependency>
<groupId>com.googlecode.libphonenumber</groupId>
<artifactId>carrier</artifactId>
<version>1.210</version>
</dependency>
<!-- 主要用于获取手机号的归属地 -->
<dependency>
<groupId>com.googlecode.libphonenumber</groupId>
<artifactId>geocoder</artifactId>
<version>2.220</version>
</dependency>
主要实现过程
1、手机号工具类:
java
import com.alibaba.fastjson.JSONObject;
import com.google.i18n.phonenumbers.PhoneNumberToCarrierMapper;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.Phonenumber;
import com.google.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder;
import java.util.Locale;
/**
* 基于google的libphonenumber将手机号转成地区及供应商信息
*/
public class PhoneInfoUtil {
// 手机号基本工具类
private static final PhoneNumberUtil PHONE_NUMBER_UTIL = PhoneNumberUtil.getInstance();
// 运营商
private static final PhoneNumberToCarrierMapper CARRIER_MAPPER = PhoneNumberToCarrierMapper.getInstance();
// 离线功能,手机号归属地查询
private static final PhoneNumberOfflineGeocoder GEO_CODER = PhoneNumberOfflineGeocoder.getInstance();
/**
* 1.验证当前手机号是否有效
*
* @param phone 手机号
* @return 校验结果
*/
public static boolean isPhoneNumber(String phone) {
// 需要对字符串phone进行包装
return PHONE_NUMBER_UTIL.isValidNumber(getPhoneNumber(phone));
}
/**
* 2.获取手机号运营商
*
* @param phone 手机号
* @return 运营商
*/
public static String getPhoneCarrier(String phone) {
return isPhoneNumber(phone) ? CARRIER_MAPPER.getNameForNumber(getPhoneNumber(phone), Locale.CHINA) : "";
}
/**
* 3.获取手机号归属地
*
* @param phone 手机号
* @return 归属地
*/
public static String getPhoneRegion(String phone) {
return isPhoneNumber(phone) ? GEO_CODER.getDescriptionForNumber(getPhoneNumber(phone), Locale.CHINESE) : "";
}
/**
* 生成PhoneNumber:将String包装成PhoneNumber
*
* @param phone 手机号
* @return PhoneNumber
*/
public static Phonenumber.PhoneNumber getPhoneNumber(String phone) {
Phonenumber.PhoneNumber phoneNumber = new Phonenumber.PhoneNumber();
// 设置电话号码的国家代码为86(中国)
phoneNumber.setCountryCode(86);
// 将输入的电话号码字符串解析为长整型,
// 设置电话号码的国内号码部分:不包含国家代码、通常是去掉国家代码后的纯数字部分
phoneNumber.setNationalNumber(Long.parseLong(phone));
return phoneNumber;
}
/**
* 获取手机号的归属信息:运营商,归属地
*
* @param phone 手机号
* @return 归属信息(Map形式)
*/
public static JSONObject getPhoneInfo(String phone) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("phone", phone);
jsonObject.put("carrier", getPhoneCarrier(phone));
jsonObject.put("region", getPhoneRegion(phone));
return jsonObject;
}
}
2、测试:

2. 通过手机号获取归属地(基于CSV文件)
情况二:基于CSV文件
目的:结果还是跟上面一样,拿到手机号的相关信息。只不过这里是通过CSV文件 + Redis 实现的
思路:手机号是有规律可循的,比如前3位可知道运营商,前7位可知道归属地,于是将这些信息整理为 CSV 文件,然后可以将这些信息存储到 redis 或者数据库中,这样就不需要依赖了:

完整代码如下
Gitee链接地址:完整代码实现