mirror of
				https://github.com/TeaOSLab/EdgeAPI.git
				synced 2025-11-04 16:00:24 +08:00 
			
		
		
		
	
		
			
	
	
		
			57 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			57 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package iplibrary
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"fmt"
							 | 
						||
| 
								 | 
							
									"github.com/TeaOSLab/EdgeAPI/internal/errors"
							 | 
						||
| 
								 | 
							
									"github.com/iwind/TeaGo/logs"
							 | 
						||
| 
								 | 
							
									"github.com/lionsoul2014/ip2region/binding/golang/ip2region"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type IP2RegionLibrary struct {
							 | 
						||
| 
								 | 
							
									db *ip2region.Ip2Region
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (this *IP2RegionLibrary) Load(dbPath string) error {
							 | 
						||
| 
								 | 
							
									db, err := ip2region.New(dbPath)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									this.db = db
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (this *IP2RegionLibrary) Lookup(ip string) (*Result, error) {
							 | 
						||
| 
								 | 
							
									if this.db == nil {
							 | 
						||
| 
								 | 
							
										return nil, errors.New("library has not been loaded")
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									defer func() {
							 | 
						||
| 
								 | 
							
										// 防止panic发生
							 | 
						||
| 
								 | 
							
										err := recover()
							 | 
						||
| 
								 | 
							
										if err != nil {
							 | 
						||
| 
								 | 
							
											logs.Println("[IP2RegionLibrary]panic: " + fmt.Sprintf("%#v", err))
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									info, err := this.db.MemorySearch(ip)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return &Result{
							 | 
						||
| 
								 | 
							
										CityId:   info.CityId,
							 | 
						||
| 
								 | 
							
										Country:  info.Country,
							 | 
						||
| 
								 | 
							
										Region:   info.Region,
							 | 
						||
| 
								 | 
							
										Province: info.Province,
							 | 
						||
| 
								 | 
							
										City:     info.City,
							 | 
						||
| 
								 | 
							
										ISP:      info.ISP,
							 | 
						||
| 
								 | 
							
									}, nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (this *IP2RegionLibrary) Close() {
							 | 
						||
| 
								 | 
							
									if this.db != nil {
							 | 
						||
| 
								 | 
							
										this.db.Close()
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |