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

相关推荐
随风,奔跑17 小时前
Spring Cloud Alibaba(六)-链路追踪SkyWalking
java·后端·spring·skywalking
wuminyu17 小时前
专家视角看Lambda表达式的原理解析
java·linux·c语言·jvm·c++
wangbing112517 小时前
Java处理csv文件总是丢数据
java·开发语言·python
云烟成雨TD17 小时前
Spring AI 1.x 系列【30】向量数据库:核心 API 和入门案例
java·人工智能·spring
许彰午17 小时前
CacheSQL:一个面向政务系统的内存缓存数据库中间件
java·数据库·缓存·中间件·面试·开源软件·政务
YaBingSec17 小时前
玄机网络安全靶场:Apache HTTPD 解析漏洞(CVE-2017-15715)WP
java·笔记·安全·web安全·php·apache
书源丶17 小时前
三十二、Java集合(一)——Collection与List全家桶
java·windows·list
AI人工智能+电脑小能手17 小时前
【大白话说Java面试题】【Java基础篇】第21题:HashMap和Hashtable的区别是什么
java·开发语言·面试·哈希算法·散列表·hash table
慕容卡卡17 小时前
Claude 使用神器(web页面)--CloudCLI UI
java·开发语言·前端·人工智能·ui·spring cloud
Sylvia-girl17 小时前
C++内存如何管理?
java·jvm·c++