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

相关推荐
爱笑的眼睛1144 分钟前
超越剪枝与量化:下一代AI模型压缩工具的技术演进与实践
java·人工智能·python·ai
阿里云云原生1 小时前
Android App 崩溃排查指南:阿里云 RUM 如何让你快速从告警到定位根因?
android·java
历程里程碑1 小时前
C++ 9 stack_queue:数据结构的核心奥秘
java·开发语言·数据结构·c++·windows·笔记·算法
醇氧1 小时前
【Windows】从守护到终结:解析一个 Java 服务的优雅停止脚本
java·开发语言·windows
努力发光的程序员1 小时前
互联网大厂Java求职面试实录
java·jvm·线程池·多线程·hashmap·juc·arraylist
小鹿学程序1 小时前
FileZilla连接到虚拟机
java·服务器·开发语言
Haooog1 小时前
Docker面试题(不定时更新)
java·docker·面试
feathered-feathered1 小时前
Redis基础知识+RDB+AOF(面试)
java·数据库·redis·分布式·后端·中间件·面试
毕设源码-赖学姐1 小时前
【开题答辩全过程】以 高校排课系统的优化设计与实现为例,包含答辩的问题和答案
java·eclipse
q_19132846952 小时前
基于SpringBoot2+Vue2的行业知识答题考试系统
java·vue.js·spring boot·mysql·毕业设计·计算机毕业设计·演示文稿