Spring Boot通过手机号获取归属地

文章目录

通过手机号获取相关信息

就是通过你输入的手机号或者手机号前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链接地址:完整代码实现

相关推荐
小小编程路11 小时前
C++ 多线程与并发
java·jvm·c++
AI视觉网奇11 小时前
linux 检索库 判断库是否支持
java·linux·服务器
她的男孩12 小时前
从零搭一个企业后台,为什么我把能力拆成 Starter 和 Plugin
java·后端·架构
RainCity12 小时前
Java Swing 自定义组件库分享(七)
java·笔记·后端
Sam_Deep_Thinking12 小时前
连锁门店的外卖订单平台对接
java·微服务·架构·系统架构
_遥远的救世主_12 小时前
从一次结果集密集型查询 OOM 看 Java 服务的稳定性架构治理
java·后端
一楼的猫12 小时前
从工具链视角对比:番茄作家助手 vs 第三方写作辅助方案
java·服务器·开发语言·前端·学习·chatgpt·ai写作
likerhood13 小时前
Java static 关键字从浅入深
java·开发语言
_院长大人_13 小时前
Java Excel导出:如何实现自定义表头与字段顺序的完全控制
java·开发语言·后端·excel
磊 子13 小时前
1.4CPU缓存一致性
java·spring cloud·缓存·系统