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

相关推荐
学计算机的计算基14 分钟前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana219 分钟前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
万亿少女的梦16837 分钟前
基于Spring Boot、Java与MySQL的网络订餐系统设计与实现
java·spring boot·mysql·系统设计·网络订餐
咩咩啃树皮9 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚10 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白11 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司12 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地13 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415913 小时前
TCP超时重传机制是为了解决什么问题?
java
莫逸风15 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope