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链接地址:完整代码实现

相关推荐
charlie11451419132 分钟前
从 0 开始:在 WSL + VSCode 上利用 Maven 构建 Java Spring Boot 工程
java·笔记·vscode·后端·学习·maven·springboot
tuokuac34 分钟前
Maven中的属性占位符的用法
java·maven
芒克芒克38 分钟前
Maven 项目管理从入门到进阶:基础与高级实战全解析
java·maven
k***3882 小时前
SpringBoot Test详解
spring boot·后端·log4j
z***89713 小时前
SpringBoot Maven 项目 pom 中的 plugin 插件用法整理
spring boot·后端·maven
憧憬blog3 小时前
【Kiro开发集训营】拒绝“屎山”堆积:在 Kiro 中重构“需求-代码”的血缘关系
java·开发语言·kiro
e***74954 小时前
Spring Security 官网文档学习
java·学习·spring
n***i954 小时前
Java NIO文件操作
java·开发语言·nio
笃行客从不躺平5 小时前
接口幂等性(Idempotency)
java
Hero | 柒6 小时前
JAVA反射机制
java·spring·反射