mirror of
https://github.com/nxtrace/NTrace-core.git
synced 2025-08-12 06:26:39 +00:00
92 lines
1.7 KiB
Go
92 lines
1.7 KiB
Go
package ipgeo
|
||
|
||
import (
|
||
"encoding/json"
|
||
"github.com/xgadget-lab/nexttrace/util"
|
||
"io"
|
||
"log"
|
||
"net/http"
|
||
"strings"
|
||
"time"
|
||
)
|
||
|
||
func Chunzhen(ip string, timeout time.Duration, _ string, _ bool) (*IPGeoData, error) {
|
||
url := util.GetenvDefault("NEXTTRACE_CHUNZHENURL", "http://127.0.0.1:2060") + "?ip=" + ip
|
||
client := &http.Client{
|
||
// 2 秒超时
|
||
Timeout: timeout,
|
||
}
|
||
req, _ := http.NewRequest("GET", url, nil)
|
||
content, err := client.Do(req)
|
||
if err != nil {
|
||
log.Println("纯真 请求超时(2s),请切换其他API使用")
|
||
return &IPGeoData{}, err
|
||
}
|
||
body, _ := io.ReadAll(content.Body)
|
||
|
||
var data map[string]interface{}
|
||
err = json.Unmarshal(body, &data)
|
||
if err != nil {
|
||
return &IPGeoData{}, err
|
||
}
|
||
city := data[ip].(map[string]interface{})["area"].(string)
|
||
region := data[ip].(map[string]interface{})["country"].(string)
|
||
var asn string
|
||
if data[ip].(map[string]interface{})["asn"] != nil {
|
||
asn = data[ip].(map[string]interface{})["asn"].(string)
|
||
}
|
||
// 判断是否前两个字为香港或台湾
|
||
var country string
|
||
provinces := []string{
|
||
"北京",
|
||
"天津",
|
||
"河北",
|
||
"山西",
|
||
"内蒙古",
|
||
"辽宁",
|
||
"吉林",
|
||
"黑龙江",
|
||
"上海",
|
||
"江苏",
|
||
"浙江",
|
||
"安徽",
|
||
"福建",
|
||
"江西",
|
||
"山东",
|
||
"河南",
|
||
"湖北",
|
||
"湖南",
|
||
"广东",
|
||
"广西",
|
||
"海南",
|
||
"重庆",
|
||
"四川",
|
||
"贵州",
|
||
"云南",
|
||
"西藏",
|
||
"陕西",
|
||
"甘肃",
|
||
"青海",
|
||
"宁夏",
|
||
"新疆",
|
||
"台湾",
|
||
"香港",
|
||
"澳门",
|
||
}
|
||
for _, province := range provinces {
|
||
if strings.Contains(region, province) {
|
||
country = "中国"
|
||
city = region + city
|
||
break
|
||
}
|
||
}
|
||
if country == "" {
|
||
country = region
|
||
}
|
||
return &IPGeoData{
|
||
Asnumber: asn,
|
||
Country: country,
|
||
City: city,
|
||
}, nil
|
||
}
|