This commit is contained in:
yuguojian 2025-05-12 17:47:28 +08:00
commit 45545e6933
5 changed files with 137 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.idea

17
README.md Normal file
View File

@ -0,0 +1,17 @@
## window开发者执行
```bash
git config --global core.autocrlf true # 提交时转 CRLF 为 LF检出时转 LF 为 CRLF
```
## mac开发者执行
```bash
git config --global core.autocrlf input # 提交时转 CRLF 为 LF检出时不转换
```
## 格式化
```bash
gofumpt -l -w .
```
```bash
go install mvdan.cc/gofumpt@latest
```

5
go.mod Normal file
View File

@ -0,0 +1,5 @@
module git.ssgfgtfy.com/public/ssgf_utils
go 1.24.0
require github.com/pkg/errors v0.9.1

2
go.sum Normal file
View File

@ -0,0 +1,2 @@
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=

112
ip_client/client.go Normal file
View File

@ -0,0 +1,112 @@
package ip_client
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"net/url"
"time"
"github.com/pkg/errors"
)
type HuaChenIpInfo struct {
AppCode string
Host string
}
func NewHuaChenIpInfo(appCode string) *HuaChenIpInfo {
return &HuaChenIpInfo{
AppCode: appCode,
Host: "https://c2ba.api.huachen.cn",
}
}
func (h *HuaChenIpInfo) GetIpInfo(ip string) (res *ApiResult, err error) {
if ip == "" {
return nil, errors.New("请输入ip地址")
}
// 设置参数
params := url.Values{}
params.Add("ip", ip)
// 拼接URL
var fullURL string
fullURL, err = url.JoinPath(h.Host, "ip")
if err != nil {
return nil, errors.Wrapf(err, "获取ip:%s信息失败拼接路径错误", ip)
}
// 拼接参数
fullURL = fmt.Sprintf("%s?%s", fullURL, params.Encode())
// 创建HTTP客户端
client := &http.Client{}
// 创建请求
var req *http.Request
req, err = http.NewRequest("GET", fullURL, nil)
if err != nil {
return nil, errors.Wrapf(err, "获取ip:%s信息失败创建请求失败", ip)
}
// 设置请求头
req.Header.Add("Authorization", "APPCODE "+h.AppCode)
req.Header.Add("Content-Type", "application/json")
// 发送请求
client.Timeout = 5 * time.Second
var resp *http.Response
resp, err = client.Do(req)
if err != nil {
return nil, errors.Wrapf(err, "获取ip:%s信息失败发送请求失败", ip)
}
defer func(Body io.ReadCloser) {
err = Body.Close()
if err != nil {
log.Printf("获取ip:%s信息关闭响应体失败: %+v\n", ip, err)
}
}(resp.Body)
// 读取响应体
var body []byte
body, err = io.ReadAll(resp.Body)
if err != nil {
return nil, errors.Wrapf(err, "获取ip:%s信息失败读取响应体失败", ip)
}
// 解析JSON响应
var apiResult ApiResult
err = json.Unmarshal(body, &apiResult)
if err != nil {
return nil, errors.Wrapf(err, "获取ip:%s信息失败解析JSON响应失败%s", ip, string(body))
}
// 检查API返回状态
if apiResult.Ret != 200 {
return &apiResult, errors.New(fmt.Sprintf("获取ip:%s信息失败%+v", ip, apiResult))
}
return &apiResult, nil
}
type ApiResult struct {
Ret int `json:"ret"`
Msg string `json:"msg"`
Data IpInfo `json:"data"`
LogId string `json:"log_id"`
}
type IpInfo struct {
Ip string `json:"ip"`
LongIp string `json:"long_ip"`
Isp string `json:"isp"`
Area string `json:"area"`
RegionId string `json:"region_id"`
Region string `json:"region"`
CityId string `json:"city_id"`
City string `json:"city"`
District string `json:"district"`
DistrictId string `json:"district_id"`
CountryId string `json:"country_id"`
Country string `json:"country"`
Lat string `json:"lat"`
Lng string `json:"lng"`
}