手机号码归属地的实现

手机号码归属地查询一般可以通过以下几种方式实现:

1. 使用公开的号码归属地数据库

2. 调用第三方API

许多服务商提供号码归属地查询 API,例如:

  • https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=手机号
  • https://api.vvhan.com/api/phone?tel=手机号
  • https://mobsec-dianhua.baidu.com/dianhua_api/open/location?tel=手机号

示例代码(Python 调用 API)

import requests

def get_phone_location(phone_number):
    url = f"https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel={phone_number}"
    response = requests.get(url)
    response.encoding = 'gbk'  # 该接口返回的是 GBK 编码
    return response.text

phone_number = "13800138000"
print(get_phone_location(phone_number))

3. 基于正则和号段匹配

  • 手机号码前三位(如 138)代表号段,前七位(如 1380013)用于进一步归属地区分。
  • 你可以使用已知的号段数据进行匹配。

示例代码(本地匹配号段库)

import json

# 假设有一个JSON数据库
phone_data = {
    "1380013": {"province": "北京", "city": "北京", "isp": "中国移动"},
    "1590000": {"province": "广东", "city": "广州", "isp": "中国联通"}
}

def lookup_phone(phone_number):
    prefix = phone_number[:7]  # 取前7位
    return phone_data.get(prefix, "未知")

print(lookup_phone("13800138000"))

4. 使用Python的 phonenumbers 库(适用于国际号码)

import phonenumbers
from phonenumbers import geocoder

phone_number = phonenumbers.parse("+8613800138000", "CN")
location = geocoder.description_for_number(phone_number, "zh")
print(location)  # 输出:北京

如果你需要更准确的数据,建议使用第三方API或定期更新本地数据库。

不联网的情况下,要查手机号码归属地,需要依赖已知的号码段数据,因为手机号码的前三位决定了运营商,前七位可以进一步确定归属地。你可以使用本地数据库或静态规则进行查询。


1. 号码分配规律

  • 手机号码的 前三位(如 138)代表 运营商
  • 前七位(如 1380013)可以确定到具体的省市。

国内三大运营商号段(部分)

运营商号段(前三位)
中国移动134, 135, 136, 137, 138, 139, 147, 150, 151, 152, 157, 158, 159, 165, 1703, 1705, 178, 182, 183, 184, 187, 188
中国联通130, 131, 132, 145, 155, 156, 166, 1704, 175, 176, 185, 186
中国电信133, 149, 153, 173, 177, 180, 181, 189, 191, 199

2. 本地存储号码段

可以使用 SQLite、JSON 或 CSV 存储号码段信息,并在本地查询。

示例数据(JSON 格式)

{
    "1380013": {"province": "北京", "city": "北京", "isp": "中国移动"},
    "1590000": {"province": "广东", "city": "广州", "isp": "中国联通"},
    "1801234": {"province": "上海", "city": "上海", "isp": "中国电信"}
}

3. 纯 Python 实现(本地查询归属地)

import json

# 本地号码段数据库(可存储为 JSON 文件)
phone_data = {
    "1380013": {"province": "北京", "city": "北京", "isp": "中国移动"},
    "1590000": {"province": "广东", "city": "广州", "isp": "中国联通"},
    "1801234": {"province": "上海", "city": "上海", "isp": "中国电信"}
}

def lookup_phone(phone_number):
    """查询手机号码归属地"""
    prefix = phone_number[:7]  # 获取前7位
    return phone_data.get(prefix, {"province": "未知", "city": "未知", "isp": "未知"})

# 测试
phone_number = "13800138000"
result = lookup_phone(phone_number)
print(f"号码: {phone_number} 归属地: {result['province']} {result['city']} 运营商: {result['isp']}")

输出示例:

号码: 13800138000 归属地: 北京 北京 运营商: 中国移动

4. 使用 SQLite 存储并查询

如果号码库较大,建议使用 SQLite,它既是本地存储,又支持高效查询。

(1) 创建 SQLite 数据库

import sqlite3

# 连接数据库
conn = sqlite3.connect("phone_location.db")
cursor = conn.cursor()

# 创建表
cursor.execute("""
CREATE TABLE IF NOT EXISTS phone_data (
    prefix TEXT PRIMARY KEY,
    province TEXT,
    city TEXT,
    isp TEXT
)
""")

# 插入数据(示例)
data = [
    ("1380013", "北京", "北京", "中国移动"),
    ("1590000", "广东", "广州", "中国联通"),
    ("1801234", "上海", "上海", "中国电信")
]
cursor.executemany("INSERT OR REPLACE INTO phone_data VALUES (?, ?, ?, ?)", data)
conn.commit()
conn.close()

(2) 查询号码归属地

import sqlite3

def lookup_phone(phone_number):
    """查询 SQLite 号码库"""
    prefix = phone_number[:7]  # 取前7位
    conn = sqlite3.connect("phone_location.db")
    cursor = conn.cursor()
    cursor.execute("SELECT province, city, isp FROM phone_data WHERE prefix = ?", (prefix,))
    result = cursor.fetchone()
    conn.close()
    
    if result:
        return {"province": result[0], "city": result[1], "isp": result[2]}
    else:
        return {"province": "未知", "city": "未知", "isp": "未知"}

# 测试查询
phone_number = "13800138000"
result = lookup_phone(phone_number)
print(f"号码: {phone_number} 归属地: {result['province']} {result['city']} 运营商: {result['isp']}")

总结

  1. 匹配规律: 通过 前三位 确定运营商,前七位 确定省市。
  2. 本地存储数据: 号码归属地数据可以存成 JSON、CSV 或 SQLite 并查询。
  3. SQLite 查询效率高,适用于大数据量存储。
  4. 完全离线,无需联网,速度快。

如果你需要完整的号码归属地数据库,可以定期从网上下载最新的数据,导入 SQLite 或 JSON 文件,实现本地查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值