iploc

package module
v0.0.0-...-408a665 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 6, 2023 License: BSD-3-Clause Imports: 12 Imported by: 0

README

iploc

Build Status

使用纯真IP库 qqwry.dat,高性能,线程安全,并对国内数据格式化到省、市、县

需要 go 1.9 或更高

附带的 qqwry.datUTF-8 编码 2018-05-15版本

不再提供 qqwry.dat, 新增命令行工具 iploc-fetch, 可在线获取官方最新版本的 qqwry.dat

安装

go get -u github.com/kayon/iploc/...
无法安装 golang.org/x/text 包,没有梯子使用下面方法
$ mkdir -P $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone https://github.com/golang/text.git

获取&更新 qqwry.dat

1. 下载 qqwry.dat
方法一:使用命令行工具 iploc-fetch

由于服务器限制国外IP,只能使用国内网络。

下载到当前目录,保存为 qqwry.gbk.dat

$ iploc-fetch qqwry.gbk.dat
方法二:手动下载

纯真官网下载并安装,复制安装目录中的 qqwry.dat

2. 转换为 UTF-8

使用命令行工具 iploc-conv 将刚刚下载的 qqwry.gbk.dat 转换为 UTF-8 保存为 qqwry.dat

iploc-conv -s qqwry.gbk.dat -d qqwry.dat

Benchmarks

// 缓存索引
BenchmarkFind-8            	 2000000	       735 ns/op               136万/秒
// 无索引
BenchmarkFindUnIndexed-8   	   20000	     78221 ns/op               1.2万/秒
// 缓存索引,并发
BenchmarkFindParallel-8    	10000000	       205 ns/op               487万/秒

使用

func main() {
	loc, err := iploc.Open("qqwry.dat")
	if err != nil {
		panic(err)
	}
	detail := loc.Find("8.8.8") // 补全为8.8.0.8, 参考 ping 工具
	fmt.Printf("IP:%s; 网段:%s - %s; %s\n", detail.IP, detail.Start, detail.End, detail)
	
	detail2 := loc.Find("8.8.3.1")
	fmt.Printf("%t %t\n", detail.In(detail2.IP.String()), detail.String() == detail2.String())

	// output
	// IP:8.8.0.8; 网段: 8.7.245.0 - 8.8.3.255; 美国 科罗拉多州布隆菲尔德市Level 3通信股份有限公司
	// true true
	
	detail = loc.Find("1.24.41.0")
	fmt.Println(detail.String())
	fmt.Println(detail.Country, detail.Province, detail.City, detail.County)
	
	// output
	// 内蒙古锡林郭勒盟苏尼特右旗 联通
	// 中国 内蒙古 锡林郭勒盟 苏尼特右旗
	
}	
快捷方法
Find(qqwrySrc, ip string) (*Detail, error)

iploc.Find 使用 OpenWithoutIndexes

初始化
Open(qqwrySrc string) (*Locator, error)

iploc.Open 缓存并索引,生成索引需要耗时500毫秒左右,但会带来更高的查询性能

OpenWithoutIndexes(qqwrySrc string) (*Locator, error)

iploc.OpenWithoutIndexes 只读取文件头做简单检查,无索引

查询
(*Locator).Find(ip string) *Detail

如果IP不合法,返回 nil

命令行工具

iploc-conv

将原版 qqwry.datGBK 转换为 UTF-8

$ iploc-conv -s src.gbk.dat -d dst.utf8.dat

新生成的DAT文件保留原数据结构,由于编码原因,文件会增大一点

修正原 qqwry.dat 中几处错误的重定向 (qqwry.dat 2018-05-10),并将 "CZ88.NET" 替换为 "N/A"

iploc-fetch

从纯真官网下载最新 qqwry.dat

由于服务器限制国外IP,只能使用国内网络。

$ iploc-fetch qqwry.gbk.dat

下载后别忘了使用 iploc-conv 转换为 UTF-8

iploc-gen

创建静态版本的 iploc 集成到你的项目中

iploc-gen 会在当前目录创建 iploc-binary.go 文件,拷贝到你的项目中,通过变量名 IPLoc 直接可以使用

$ iploc-gen path/qqwry.dat

--pkg 指定 package name, 默认 main

-n 使用 OpenWithoutIndexes 初始化,无索引

静态编译 iploc 和 qqwry.dat 并集成到你的项目中

编译后的二进制没有 qqwry.dat 依赖,不需要再带着 qqwry.dat 一起打包了

示例

到项目目录 $GOPATH/src/myproject/

$ mkdir myloc && cd myloc
$ iploc-gen path/qqwry.dat --pkg myloc

$GOPATH/src/myproject/main.go

package main
	
import (
	"fmt"
	
	"myproject/myloc"
)
	
func main() {
	fmt.Println(myloc.IPLoc.Find("8.8.8.8"))
}

Documentation

Index

Constants

View Source
const (
	IPLen = 4
)
View Source
const Version = "1.0"

Variables

This section is empty.

Functions

This section is empty.

Types

type Detail

type Detail struct {
	IP    IP
	Start IP
	End   IP
	Location
}

func Find

func Find(qqwrySrc, rawIP string) (*Detail, error)

Find shorthand for iploc.Open.Find not be preload file and without indexed

func (Detail) Bytes

func (detail Detail) Bytes() []byte

func (Detail) In

func (detail Detail) In(rawIP string) bool

func (Detail) InIP

func (detail Detail) InIP(ip IP) bool

func (Detail) InUint

func (detail Detail) InUint(uintIP uint32) bool

func (Detail) String

func (detail Detail) String() string

type IP

type IP [IPLen]byte

func ParseBytesIP

func ParseBytesIP(b []byte) (ip IP)

func ParseIP

func ParseIP(s string) (ip IP, err error)

func ParseUintIP

func ParseUintIP(u uint32) (ip IP)

func (IP) Bytes

func (ip IP) Bytes() []byte

func (IP) Compare

func (ip IP) Compare(a IP) int

Compare like bytes.Compare The result will be 0 if == a, -1 if < a, and +1 if > a.

func (IP) ReverseBytes

func (ip IP) ReverseBytes() []byte

func (IP) String

func (ip IP) String() string

func (IP) Uint

func (ip IP) Uint() uint32

type Location

type Location struct {
	Country  string
	Region   string
	Province string
	City     string
	County   string
	// contains filtered or unexported fields
}

func (Location) Bytes

func (location Location) Bytes() []byte

func (Location) String

func (location Location) String() string

type LocationRaw

type LocationRaw struct {
	Text [2][]byte
	Pos  [2]uint32
	Mode [2]byte
}

type Locator

type Locator struct {
	// contains filtered or unexported fields
}

func Load

func Load(b []byte) (loc *Locator, err error)

func LoadWithoutIndexes

func LoadWithoutIndexes(b []byte) (loc *Locator, err error)

func Open

func Open(qqwrySrc string) (loc *Locator, err error)

Open 生成索引,查询速度快

func OpenWithoutIndexes

func OpenWithoutIndexes(qqwrySrc string) (loc *Locator, err error)

OpenWithoutIndexes 无索引,不预载文件,打开速度快,但查询速度慢

func (*Locator) Close

func (loc *Locator) Close() error

Close close the file descriptor, if there is no preload

func (*Locator) Count

func (loc *Locator) Count() int

func (*Locator) Find

func (loc *Locator) Find(rawIP string) *Detail

func (*Locator) FindIP

func (loc *Locator) FindIP(ip IP) *Detail

func (*Locator) FindUint

func (loc *Locator) FindUint(uintIP uint32) *Detail

func (*Locator) Range

func (loc *Locator) Range(iterator rangeIterator)

type Parser

type Parser struct {
	// contains filtered or unexported fields
}

func NewParser

func NewParser(qqwrySrc string, preload bool) (*Parser, error)

func NewParserRes

func NewParserRes(res resReadCloser, size uint32) (*Parser, error)

func (*Parser) Close

func (p *Parser) Close() error

func (*Parser) Count

func (p *Parser) Count() uint32

func (*Parser) IndexRange

func (p *Parser) IndexRange(iterator indexIterator)

(*Parser) IndexRange calls the iterator for every index within the range (i, start, end, Pos) until iterator returns false.

func (*Parser) ReadByte

func (p *Parser) ReadByte(pos int64) byte

(*Parser) ReadByte 读取1字节,用来识别重定向模式

func (*Parser) ReadBytes

func (p *Parser) ReadBytes(pos, n int64) (b []byte)

(*Parser) ReadBytes 读取n字节并翻转

func (*Parser) ReadLocationRaw

func (p *Parser) ReadLocationRaw(offset int64) (raw LocationRaw)

ReadLocationRaw 用于导出或索引

func (*Parser) ReadPosition

func (p *Parser) ReadPosition(offset int64) int64

(*Parser) ReadPosition 读取3字节的偏移位置

func (*Parser) ReadRegion

func (p *Parser) ReadRegion(offset int64) (s []byte)

(*Parser) ReadRegion 读取地区数据,处理可能的重定向

func (*Parser) ReadRegionString

func (p *Parser) ReadRegionString(offset int64) string

func (*Parser) ReadString

func (p *Parser) ReadString(offset int64) (string, int)

func (*Parser) ReadText

func (p *Parser) ReadText(offset int64) ([]byte, int)

(*Parser) ReadText 读取国家地区数据,以0x00结尾

func (*Parser) Reader

func (p *Parser) Reader() io.Reader

func (*Parser) Size

func (p *Parser) Size() uint32

Directories

Path Synopsis
cmd

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL