Java 手机号码归属地查询实现
在Java中实现手机号码归属地查询,通常有以下几种方法:
使用第三方API服务
使用淘宝API
淘宝提供了免费的手机号码归属地查询API:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class PhoneLocationQuery {
public static String queryLocation(String phoneNumber) {
try {
String url = "http://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=" + phoneNumber;
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("GET");
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "GBK"));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
// 解析返回的JSON数据
String result = response.toString();
String province = result.substring(result.indexOf("province:\"") + 10, result.indexOf("\"", result.indexOf("province:\"") + 10));
String carrier = result.substring(result.indexOf("carrier:\"") + 9, result.indexOf("\"", result.indexOf("carrier:\"") + 9));
return province + " " + carrier;
} catch (Exception e) {
e.printStackTrace();
return "查询失败";
}
}
public static void main(String[] args) {
String phoneNumber = "13812345678";
System.out.println(queryLocation(phoneNumber));
}
}
使用聚合数据API
需要先注册获取API key:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
public class JuhePhoneLocation {
private static final String API_KEY = "你的API密钥";
private static final String URL = "http://apis.juhe.cn/mobile/get";
public static String queryLocation(String phoneNumber) {
try {
String url = URL + "?phone=" + phoneNumber + "&key=" + API_KEY;
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("GET");
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
// 解析JSON响应
// 这里需要使用JSON解析库如Gson或Jackson
// 示例代码省略了JSON解析部分
return "解析后的结果";
} catch (Exception e) {
e.printStackTrace();
return "查询失败";
}
}
}
使用本地数据库
使用纯Java实现(内存查找)
import java.io.*;
import java.util.HashMap;
import java.util.Map;
public class LocalPhoneLocation {
private static Map<String, String> phoneMap = new HashMap<>();
static {
// 初始化时加载数据
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
LocalPhoneLocation.class.getResourceAsStream("/phone_location.txt"), "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
String[] parts = line.split(",");
if (parts.length >= 2) {
phoneMap.put(parts[0], parts[1]);
}
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static String queryLocation(String phoneNumber) {
// 取前7位进行匹配
String prefix = phoneNumber.substring(0, 7);
return phoneMap.getOrDefault(prefix, "未知");
}
public static void main(String[] args) {
System.out.println(queryLocation("13812345678"));
}
}
使用SQLite数据库
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class SQLitePhoneLocation {
private static final String DB_URL = "jdbc:sqlite:phone_location.db";
public static String queryLocation(String phoneNumber) {
String prefix = phoneNumber.substring(0, 7);
String sql = "SELECT province, carrier FROM phone_location WHERE prefix = ?";
try (Connection conn = DriverManager.getConnection(DB_URL);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, prefix);
ResultSet rs = pstmt.executeQuery();
if (rs.next()) {
return rs.getString("province") + " " + rs.getString("carrier");
}
} catch (SQLException e) {
e.printStackTrace();
}
return "未知";
}
}
使用现成的Java库
使用phone-number-lib
import com.github.stuxuhai.jpinyin.PhoneNumber;
public class PhoneNumberLibExample {
public static void main(String[] args) {
String phoneNumber = "13812345678";
String location = PhoneNumber.getLocation(phoneNumber);
System.out.println(location);
}
}
使用commons-lang3中的PhoneNumberUtil
import org.apache.commons.lang3.tuple.Pair;
import com.google.i18n.phonenumbers.PhoneNumberUtil;
import com.google.i18n.phonenumbers.Phonenumber.PhoneNumber;
public class CommonsLangExample {
public static void main(String[] args) {
PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
String phoneNumber = "+8613812345678";
try {
PhoneNumber number = phoneUtil.parse(phoneNumber, "CN");
String regionCode = phoneUtil.getRegionCodeForNumber(number);
System.out.println("地区代码: " + regionCode);
// 注意:这个库主要用于电话号码验证,不是专门用于归属地查询
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意事项
- API限制:使用第三方API时要注意调用频率限制和可能的变化
- 数据准确性:手机号段归属地数据会随时间变化,需要定期更新
- 性能考虑:本地查询比API查询更快,但需要维护数据
- 隐私问题:处理用户手机号码时要遵守相关隐私法规
方法各有优缺点,可以根据实际需求选择最适合的方案,对于简单的应用场景,本地查询方案可能更合适;对于需要频繁查询或不想维护数据的场景,API方案更方便。
