QQWry Go版本IP归属地查询库使用指南
【免费下载链接】qqwry QQWry golang version 项目地址: 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))
使用注意事项
- 线程安全: qqwry不是线程安全的,在并发环境下需要加锁保护
- 缓存机制: qqwry没有使用缓存,每次查询都会读取文件
- 文件路径: 确保qqwry.dat文件路径正确且可访问
- 数据更新: 定期更新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)
}
}
性能优化建议
- 文件预加载: 在服务启动时预加载数据库文件到内存
- 连接复用: 在长时间运行的服务中保持文件句柄打开
- 错误处理: 合理处理文件不存在或格式错误的情况
许可证信息
本项目基于MIT许可证开源,允许自由使用、修改和分发。
通过QQWry库,开发者可以轻松在Go项目中集成IP归属地查询功能,为网络安全分析、用户行为分析等场景提供有力支持。
【免费下载链接】qqwry QQWry golang version 项目地址: https://gitcode.com/gh_mirrors/qqwr/qqwry
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



