手机号码归属地的实现

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

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

  • 可以使用国内的手机号码归属地数据库,如:
    • 百度号码归属地开放API
    • 阿里云号码归属地API
    • 腾讯号码归属地API
  • 你可以在本地存储一个 CSV 或 SQLite 数据库,定期更新,查询时直接匹配。

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 文件,实现本地查询

你可能感兴趣的:(服务器,运维)