QQWry Go版本IP归属地查询库使用指南

QQWry Go版本IP归属地查询库使用指南

【免费下载链接】qqwry QQWry golang version 【免费下载链接】qqwry 项目地址: https://gitcode.com/gh_mirrors/qqwr/qqwry

项目概述

QQWry是一个基于Go语言实现的纯真IP库查询工具,能够快速准确地查询IP地址的归属地信息。该项目是纯真IP库的Go语言移植版本,提供了简洁易用的API接口。

项目结构

.
├── qqwry.go        # 主要功能模块,包含QQwry结构体和查询方法
├── qqwry_test.go   # 单元测试文件
├── README.md        # 项目说明文档
└── LICENSE          # 开源许可证文件

环境要求

  • Go 1.11+
  • mahonia编码转换库

安装依赖

首先需要安装mahonia库来处理GBK编码的地址信息:

go get github.com/yinheli/mahonia

使用方法

基础查询

在Go项目中使用QQWry进行IP查询非常简单:

package main

import (
    "github.com/yinheli/qqwry"
    "log"
)

func main() {
    // 创建QQwry实例,指定数据库文件路径
    q := qqwry.NewQQwry("qqwry.dat")
    
    // 查询IP地址
    q.Find("180.89.94.90")
    
    log.Printf("IP:%v, 国家:%v, 城市:%v", q.Ip, q.Country, q.City)
    // 输出结果示例:
    // IP:180.89.94.90, 国家:北京市, 城市:长城宽带
}

数据库文件获取

QQWry需要纯真IP数据库文件(qqwry.dat)才能正常工作。你可以从官方数据源获取最新的数据库文件:

# 下载最新版本的纯真IP库
# 下载地址:http://update.cz88.net/soft/qqwry.rar

下载后解压得到qqwry.dat文件,将其放置在你的项目目录中。

查询结果解析

QQWry的查询结果包含三个字段:

  • Ip: 查询的IP地址
  • Country: 国家/地区信息
  • City: 城市/运营商信息

核心功能详解

IP索引搜索

QQWry使用二分查找算法在IP索引中快速定位目标IP:

func (this *QQwry) searchIndex(ip uint32) uint32 {
    // 读取文件头部信息获取索引范围
    header := make([]byte, 8)
    this.file.Seek(0, 0)
    this.file.Read(header)
    
    start := binary.LittleEndian.Uint32(header[:4])
    end := binary.LittleEndian.Uint32(header[4:])
    
    // 二分查找过程
    for {
        mid := this.getMiddleOffset(start, end)
        // ... 查找逻辑
    }
}

编码转换

由于纯真IP库使用GBK编码存储地址信息,QQWry使用mahonia库进行编码转换:

enc := mahonia.NewDecoder("gbk")
this.Country = enc.ConvertString(string(country))
this.City = enc.ConvertString(string(area))

使用注意事项

  1. 线程安全: qqwry不是线程安全的,在并发环境下需要加锁保护
  2. 缓存机制: qqwry没有使用缓存,每次查询都会读取文件
  3. 文件路径: 确保qqwry.dat文件路径正确且可访问
  4. 数据更新: 定期更新qqwry.dat文件以保证查询准确性

实际应用场景

Web服务集成

将QQWry集成到Web服务中,提供IP查询API:

package main

import (
    "encoding/json"
    "github.com/yinheli/qqwry"
    "net/http"
)

var q *qqwry.QQwry

func init() {
    q = qqwry.NewQQwry("qqwry.dat")
}

func queryIPHandler(w http.ResponseWriter, r *http.Request) {
    ip := r.URL.Query().Get("ip")
    if ip == "" {
        http.Error(w, "IP参数缺失", http.StatusBadRequest)
        return
    }
    
    q.Find(ip)
    
    response := map[string]string{
        "ip":      q.Ip,
        "country": q.Country,
        "city":    q.City,
    }
    
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(response)
}

批量查询处理

虽然QQWry本身不直接支持批量查询,但可以通过循环实现:

func batchQuery(ips []string) {
    for _, ip := range ips {
        q.Find(ip)
        log.Printf("%s -> %s %s", ip, q.Country, q.City)
    }
}

性能优化建议

  1. 文件预加载: 在服务启动时预加载数据库文件到内存
  2. 连接复用: 在长时间运行的服务中保持文件句柄打开
  3. 错误处理: 合理处理文件不存在或格式错误的情况

许可证信息

本项目基于MIT许可证开源,允许自由使用、修改和分发。

通过QQWry库,开发者可以轻松在Go项目中集成IP归属地查询功能,为网络安全分析、用户行为分析等场景提供有力支持。

【免费下载链接】qqwry QQWry golang version 【免费下载链接】qqwry 项目地址: https://gitcode.com/gh_mirrors/qqwr/qqwry

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值