feat(ipdb): resolveASN 优先级改回 maxmind_asn 打头,lemondb_asn 补位\n\nwhois 段的 AS 以 GeoLite2-ASN 为基准(各家共认),maxmind 未命中时\n依次落 lemondb(GeoLite2 底子 + APNIC CN 精修)→ dbip → ip2location。\nCHANGELOG 同步。

This commit is contained in:
nomdn committed 2026-11-01 21:56:46 +08:00
1 parent 81936ea7f7
commit 818517ba1f
2 files changed
+6 -6

No files matched your search

+2 -2
View File
@@ -9,7 +9,7 @@
### ✨ 新功能
- **接入 LemonDB 作为定位与 ASN 源**:`/v1/location` 与 `/v1/asn` 全链路新增 `lemondb` / `lemondb_asn` 输出。LemonDB(nomdn/LemonDB 月度构建)为全球打底 + 中国省市县高精度层:中国段含省/市/区县 + 运营商 + 网络类型 + GB/T 2260 区划码,v6 部分段可到区县;坐标全库统一 WGS-84,`coord_system` 字段透传
- **ASN 解析优先级重排**:`resolveASN` 改为 lemondb_asn → maxmind_asn → dbip_asn → ip2location_asn(中国段组织名更细),whois 段与 ws 同步
- **ASN 解析优先级重排**:`resolveASN` 改为 maxmind_asn → lemondb_asn → dbip_asn → ip2location_asn(补齐未命中兜底),whois 段与 ws 同步
- **LemonDB 自动下载**:`PullDatabase` 新增 `LEMON-LOCATION.mmdb` / `LEMON-ASN.mmdb` 任务,走 ghproxy 镜像链;启动即拉 + 每日 ETag 条件请求,节点中断后恢复可在一天内追平
- **归属地地图**:location 页新增地图(高德瓦片直连 + Leaflet + 免 key),多源打点直观对比各库定位差异与离散度;坐标按源静态标记或 `coord_system` 动态判断(LemonDB),经 `wgs84ToGcj02` 统一转 GCJ-02 与底图对齐
- **地图数据源补充**:DB-IP City、GeoCN(含区划政府驻地坐标打点)
@@ -26,7 +26,7 @@
### ⚠️ 行为变化
- `/v1/location` 输出新增 `lemondb` 键(全源之首);`/v1/asn` 与 ws 的 asn 分支新增 `lemondb_asn`
- ASN whois 段的解析库优先级变化(见上),中国 IP 的组织名可能由 GeoLite2 值变为 LemonDB 值
- ASN whois 段的解析库优先级变化(见上),maxmind 未命中的 IP 现在会依次落到 lemondb / dbip
- ipdb 目录新增约 70MB 的 LemonDB 两库磁盘占用(首次启动后台自动拉取,不阻塞服务)
## [v4.2.0] - 2026-10-25
+4 -4
View File
@@ -738,13 +738,13 @@ func normalizeASN(s string) string {
return "AS" + s
}
// resolveASN 从 SearchIP 结果中按优先级提取可用 ASN(lemondb → maxmind → dbip → ip2location),返回 "ASxxxx"。
// resolveASN 从 SearchIP 结果中按优先级提取可用 ASN(maxmind → lemondb → dbip → ip2location),返回 "ASxxxx"。
//
// 之所以要兜底:此前 whois 段只认 maxmind_asn,某个 IP 一旦未命中该库,整段 ASN WHOIS 就凭空消失,
// 哪怕 dbip_asn / ip2location_asn 明明有数据。lemondb_asn 打头:GeoLite2 底子 + APNIC CN 精修,
// 覆盖面与 maxmind 相同、CN 组织名更准。
// 哪怕 dbip_asn / ip2location_asn 明明有数据。maxmind_asn 打头(GeoLite2-ASN 是各家共认的基准),
// lemondb_asn 跟在后面做未命中补位(GeoLite2 底子 + APNIC CN 精修)。
func resolveASN(result map[string]interface{}) string {
for _, key := range []string{"lemondb_asn", "maxmind_asn", "dbip_asn"} {
for _, key := range []string{"maxmind_asn", "lemondb_asn", "dbip_asn"} {
if r, ok := result[key].(*ipdb.MMDBASNResult); ok {
if asn := normalizeASN(r.ASN); asn != "" {
return asn