ip2region_private/README_CN.md

212 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# IP2Region 补丁覆盖工具
一个轻量级的 Python 工具,用于应用 ip2region 数据库补丁,**无需修改**原始的 xdb 数据库文件。该工具创建一个 JSON 缓存,作为覆盖层,在查询主数据库之前检查补丁。
## 为什么需要这个工具?
ip2region 官方项目提供了直接修改 xdb 数据库文件的制作工具Java/Golang/C++)。但是,有时您可能希望:
- **无需重建**数据库即可应用补丁
- 将补丁与主数据库**分离**
- 在应用程序中将补丁用作**覆盖层**
- 在提交数据库更改之前**测试**补丁
此工具提供了一种非破坏性的补丁应用方法。
## 功能特性
- ✅ 从 `data/fix` 目录解析补丁文件
- ✅ 创建 JSON 缓存以支持快速二分查找
- ✅ UTF-8 编码支持Windows 系统自动回退)
- ✅ 命令行界面,支持自定义路径
- ✅ IP 查找测试功能
- ✅ 无需外部依赖(仅使用 Python 标准库)
## 安装
### 要求
- Python 3.7 或更高版本
- 无需外部依赖(仅使用标准库)
### 快速开始
1. **下载补丁文件**(从 ip2region 仓库):
```bash
# 创建补丁目录
mkdir patches
# 从以下地址下载补丁文件:
# https://github.com/lionsoul2014/ip2region/tree/master/data/fix
# 将它们保存为 .fix 文件到 patches/ 目录
```
2. **运行工具**
```bash
python patch_override.py
```
3. **在应用程序中使用缓存文件**
```python
from patch_override import load_patch_cache, find_patch_for_ip
cache = load_patch_cache(Path("patches_cache.json"))
result = find_patch_for_ip("39.144.0.1", cache)
if result:
print(f"省份: {result['province']}, 城市: {result['city']}")
```
## 使用方法
### 基本用法
```bash
# 使用默认路径patches/ 目录patches_cache.json 输出)
python patch_override.py
```
### 自定义路径
```bash
# 指定自定义目录
python patch_override.py --patches-dir ./data/fix --output ./cache.json
```
### 测试 IP 查找
```bash
# 使用特定 IP 地址进行测试
python patch_override.py --test-ip 39.144.0.1 --test-ip 39.144.10.5
```
### 命令行选项
```
--patches-dir DIR 包含 .fix 补丁文件的目录默认patches
--output FILE 输出 JSON 缓存文件路径默认patches_cache.json
--test-ip IP 用于验证补丁查找的测试 IP 地址(可重复指定)
```
## 补丁文件格式
补丁文件应为以下格式:
```
start_ip|end_ip|Country|Province|City|ISP
```
示例:
```
39.144.0.0|39.144.0.255|中国|山东省|菏泽市|移动
39.144.1.0|39.144.9.255|中国|0|0|移动
```
## 集成示例
以下是如何将此工具集成到您的 IP 地理位置服务中:
```python
from pathlib import Path
from patch_override import load_patch_cache, find_patch_for_ip
class IPGeolocationService:
def __init__(self):
self.patch_cache = load_patch_cache(Path("patches_cache.json"))
# 初始化您的主 ip2region 数据库...
def get_location(self, ip: str):
# 首先检查补丁(补丁优先)
patch_result = find_patch_for_ip(ip, self.patch_cache)
if patch_result:
return patch_result
# 回退到主数据库
return self._lookup_main_database(ip)
```
## 缓存文件格式
生成的缓存文件是一个 JSON 文件,结构如下:
```json
{
"patches": [
{
"start_ip": "39.144.0.0",
"end_ip": "39.144.0.255",
"start_int": 663748608,
"end_int": 663748863,
"country": "中国",
"province": "山东省",
"city": "菏泽市",
"isp": "移动",
"source": "github-issue-196.fix",
"line": 1
}
],
"total_patches": 237,
"last_updated": "2024-12-28T03:33:13.643784",
"patch_files": [
"github-issue-196.fix",
"github-issue-200.fix",
"github-issue-243.fix"
]
}
```
## 与制作工具对比
| 功能 | 制作工具 | 本工具 |
|------|---------|--------|
| 修改 xdb 文件 | ✅ 是 | ❌ 否 |
| 需要重建 | ✅ 是 | ❌ 否 |
| 非破坏性 | ❌ 否 | ✅ 是 |
| 覆盖层 | ❌ 否 | ✅ 是 |
| 易于更新 | ❌ 否 | ✅ 是 |
| Python 支持 | ❌ 否 | ✅ 是 |
## 更新补丁
当发布新补丁时:
1. 将新的 `.fix` 文件下载到您的 `patches/` 目录
2. 再次运行工具:`python patch_override.py`
3. 缓存将使用所有补丁重新生成
4. 重启您的应用程序以加载新缓存
## 编码支持
该工具支持多种编码:
- UTF-8主要
- GBK/GB2312Windows 回退)
- UTF-8 with BOM
中文字符在缓存文件中正确保留。
## 贡献
此工具旨在贡献给 ip2region 项目。如果您发现错误或有改进建议:
1. Fork ip2region 仓库
2. 将此工具添加到 `maker/python/``tools/python/`
3. 提交拉取请求
## 许可证
此工具遵循与 ip2region 项目相同的许可证Apache 2.0)。
## 参考资料
- [ip2region GitHub 仓库](https://github.com/lionsoul2014/ip2region)
- [补丁文件位置](https://github.com/lionsoul2014/ip2region/tree/master/data/fix)
- [制作工具文档](https://github.com/lionsoul2014/ip2region/tree/master/maker)
## 作者
社区贡献 - ip2region 补丁应用的 Python 实现。
## 致谢
基于 lionsoul2014 的 ip2region 项目的补丁格式和概念。