V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
KasuganoSoras
V2EX  ›  分享创造

分享一个自建的 IP 归属地查询库

  •  2
     
  •   KasuganoSoras · 2019-10-07 08:08:33 +08:00 · 5980 次点击
    这是一个创建于 792 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看到另一篇帖子说淘宝 IP 库挂了……我想了下还是分享一下自己的 IP 库吧。

    数据来源

    数据基于纯真 IP 库 2019-09-25 的数据,一般我会每个月去更新一次(官方是每周,但是我可能没有这么多时间每周都去更新一次),自己写了一个脚本把 txt 格式的数据导入到了数据库里,并区分了国家、地区和运营商。

    特性

    返回结果为 Json,区分国家、地区、运营商,支持返回明文、Unicode 编码结果。

    接口稳定性

    接口程序使用 PHP 开发,环境为 PHP 7.3.8,搭建在一台 4 核 i5-6500 小机器上,做了 Redis 缓存,首次查询后会把结果缓存在 Redis,下一次查询直接从缓存调取,速度会快很多。

    之前的测试结果:

    • 缓存命中情况下 7200QPS
    • 查询未缓存数据 5400QPS

    小项目或者自己测试之类的用这个应该是没问题的,我会长期提供服务(我自己的网站也在用)。大项目还是建议用大厂的 API 吧……我也不敢保证我的 SLA 能达到小数点后几个 9 什么的...

    请求方式

    返回结果

    正常返回结果

    {
        "status":200,
        "message":"OK",
        "addr":"14.215.177.38",
        "country":"中国",
        "area":"广东省广州市",
        "provider":"北京百度网讯科技有限公司电信节点"
    }
    

    无效的 IP 地址

    {
        "status":500,
        "message":"Invalid IP Address"
    }
    

    因为纯真 IP 库格式的问题,我没有办法细分到省和市……所以统一用 area 来表示了。

    接口没有限制单 IP QPS,但是还是希望各位合理使用,上面还运行着公益内网穿透 owo

    如果发现有查询结果错误的话欢迎在帖子里留言或者邮箱联系我修正:YWtrYXJpaW5zQGdtYWlsLmNvbQ==

    第 1 条附言  ·  2019-10-07 12:49:18 +08:00

    考虑到纯真数据库可能不够全的问题,我增加了一个 ip2region 的数据库查询选项,在查询参数里加上 &db2 即可使用 ip2region 的数据库。

    示例:https://ip.mcr.moe/?ip=223.5.5.5&db2

    但是在我实际测试中发现 ip2region 在查询部分冷门 IP 地址时的准确度不如纯真 IP 库,因此建议还是将纯真 IP 库作为主要选择,ip2region 可以作为参考使用。

    另外还增加了 Json 美化效果,可以更直观的看到返回结果。当然如果你不喜欢或者有特殊原因不能使用这种美化过的 Json 的话,也可以加个参数 &compress 将 json 变回原来压缩过的效果。

    示例:https://ip.mcr.moe/?ip=223.5.5.5&compress

    32 条回复    2021-08-19 10:24:39 +08:00
    opengps
        1
    opengps  
       2019-10-07 08:45:23 +08:00 via Android
    ip 库的总有效数据量多少?
    KasuganoSoras
        2
    KasuganoSoras  
    OP
       2019-10-07 08:56:43 +08:00
    @opengps #1 看了一下,是 526742 条
    frozenway
        3
    frozenway  
       2019-10-07 09:12:41 +08:00
    纯真的准确率太低了,以前用的时候经常被运营怼
    lk1ngaa7
        4
    lk1ngaa7  
       2019-10-07 09:32:36 +08:00
    ipip.net 的免费 ip 库和纯真的区别是啥呢?
    lovestudykid
        5
    lovestudykid  
       2019-10-07 09:43:58 +08:00   ❤️ 1
    gitee.com/lionsoul/ip2region
    这个号称 99.9%,连各种语言的查询客户端都提供了...
    opengps
        6
    opengps  
       2019-10-07 10:02:31 +08:00
    @KasuganoSoras 跟我之前了解的相似,52 万条,跟 ipv4 的 43 亿条占比太小,建议对接下百度地图高德地图,做替补查询
    caijunyi
        7
    caijunyi  
       2019-10-07 11:13:23 +08:00
    已经在使用了。挺好的!
    bagel
        8
    bagel  
       2019-10-07 11:24:11 +08:00
    @opengps 没明白,你说的这几家地图也提供 IP 查询服务吗?
    starsriver
        9
    starsriver  
       2019-10-07 11:37:35 +08:00 via Android
    纯真也在用。备用吧。

    淘宝还是很稳的,这两天可能是因为特殊时间
    ysicing
        10
    ysicing  
       2019-10-07 11:47:04 +08:00 via Android
    ip.sb 也不错哈哈
    opengps
        11
    opengps  
       2019-10-07 11:47:26 +08:00
    @bagel 刚刚总结了一下,但愿不被站长理解成 aff 继续降权: https://www.opengps.cn/Blog/View.aspx?id=476&f=v
    nicoljiang
        12
    nicoljiang  
       2019-10-07 12:35:07 +08:00
    @opengps 这 50 多万条是 IP 段。。。大的段可能包含上百万个 IP
    KasuganoSoras
        13
    KasuganoSoras  
    OP
       2019-10-07 12:52:10 +08:00
    @starsriver #9 淘宝主要是 QPS 限制的太低了,只能作为人工搜索使用。目前增加了一个新的选择 ip2region,后续我会考虑接入更多的 IP 库,继续完善它。

    @nicoljiang #12 是的,其中还包含了很多类似于 192.168.0.0 / 255.0.0.0 这些保留地址,实际上纯真 IP 库还是很全的,日常查询完全足够了。
    KallyDev
        14
    KallyDev  
       2019-10-07 13:11:26 +08:00 via iPhone
    编码似乎有些问题,环境是 iOS Chrome

    {
    "status": 200,
    "message": "OK",
    "addr": "1.1.1.1",
    "country": "缇庡浗",
    "area": "缇庡浗",
    "provider": "APNIC&CloudFlare 鍏叡 DNS 鏈嶅姟鍣�"
    }
    KasuganoSoras
        15
    KasuganoSoras  
    OP
       2019-10-07 13:18:42 +08:00
    @KallyDev #14 服务器端是 UTF-8 无 BOM,如果出现编码问题可以试下在 URL 里加上 &unicode 参数
    Soar360
        16
    Soar360  
       2019-10-07 13:20:08 +08:00
    纯真的数据库直接集成到程序里也很容易吧?
    KasuganoSoras
        17
    KasuganoSoras  
    OP
       2019-10-07 13:26:34 +08:00
    @Soar360 #16 是的,但是纯真的数据库体积有点大( 32MB ),集成到程序里有点累赘。另外我把国家和地区单独存在一个字段里面,方便一些特殊场合使用,比如需要屏蔽国外访问的网站,可以直接判断:
    if(json.country !== "中国") {
    return 403;
    }
    Tang
        18
    Tang  
       2019-10-07 15:13:23 +08:00 via Android
    @KasuganoSoras 原始压缩后的 dat 文件应该没这么大吧
    xiangyuecn
        19
    xiangyuecn  
       2019-10-07 16:04:38 +08:00
    仅仅返回文字这种不太好用,还要自己解析省市然后反解出城市区划代码,有没有像淘宝 ip 库那样可以直接返回城市区划代码的?
    KasuganoSoras
        20
    KasuganoSoras  
    OP
       2019-10-07 22:59:03 +08:00
    @xiangyuecn #19 过段时间增加这个功能,到时候可能要重新导一份数据库
    Varobjs
        21
    Varobjs  
       2019-10-08 20:52:29 +08:00 via Android
    ipip.net 也可以吧
    Vogan
        22
    Vogan  
       2019-10-09 07:40:21 +08:00 via iPhone
    我来说的点,免费的淘宝能返回运营商,其他免费的都没有运营商
    KasuganoSoras
        23
    KasuganoSoras  
    OP
       2019-10-09 07:55:30 +08:00
    @Vogan #22 有的,我的 API 返回字段有一个 provider 就是运营商,默认的话是纯真的 IP 库,会带有一些机房名字和其他信息,如果需要比较统一的(电信、移动、联通)可以加上 &db2 参数使用备用数据库。
    alamak76
        24
    alamak76  
       2019-10-09 10:07:33 +08:00
    可以考虑 IP2Location LITE 的免费 IP 库。
    ganymedenil590
        25
    ganymedenil590  
       2019-10-09 10:40:42 +08:00
    目前应该只有 ipip.net 是最准确的 国内大厂的归属地查询的库也基本都是 ipip.net
    wudi77
        26
    wudi77  
       247 天前
    @KasuganoSoras 您好,网站证书昨天到期啦,目前无法使用。
    KasuganoSoras
        27
    KasuganoSoras  
    OP
       247 天前
    @wudi77 #26 谢谢,已经看到了,正在更新
    wudi77
        28
    wudi77  
       157 天前
    您好,网站证书今天又到期啦,目前无法使用。
    wudi77
        29
    wudi77  
       157 天前
    @KasuganoSoras 您好,网站证书今天又到期啦,目前无法使用。
    KasuganoSoras
        30
    KasuganoSoras  
    OP
       157 天前
    @wudi77 谢谢提醒,证书已经更新,换了个一年的
    wudi77
        31
    wudi77  
       110 天前
    @KasuganoSoras 您好,URL 无法访问了,请检查。
    KasuganoSoras
        32
    KasuganoSoras  
    OP
       110 天前
    @wudi77 #31 谢谢提醒,域名过期了,刚刚续费完。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4148 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:30 · PVG 10:30 · LAX 18:30 · JFK 21:30
    ♥ Do have faith in what you're doing.