go-bot/workers/ip.go
2024-04-18 19:36:32 +08:00

137 lines
3.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package workers
import (
"bytes"
"fmt"
"io"
"net"
"net/http"
"strings"
"time"
"github.com/goccy/go-json"
)
type Ip struct {
*StdAns
}
func (a *Ip) GetMsg() string {
if len(a.Parms) < 2 {
return "您可以使用 /ip ip地址/网址 进行查找ip地址支持ipv4/ipv6"
}
// 去除换行符
raw_msg := strings.TrimRight(a.RawMsg, "\n")
fmt.Println("raw_msg:", raw_msg)
parms := strings.Fields(raw_msg)
var ip string
if net.ParseIP(parms[1]) != nil {
ip = parms[1]
} else {
url := "https://api.siterelic.com/ping"
data := map[string]string{
"url": parms[1],
}
json_data, _ := json.Marshal(data)
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(json_data))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("x-api-key", "d84eae04-0654-4173-bc6a-c457c4fc3f4d")
// 打印请求信息
// fmt.Println("请求方法:", req.Method)
// fmt.Println("请求URL:", req.URL.String())
// fmt.Println("请求头:")
// for key, values := range req.Header {
// for _, value := range values {
// fmt.Printf(" %s: %s\n", key, value)
// }
// }
// fmt.Println("请求体:", string(json_data))
client := &http.Client{
Timeout: 5 * time.Second, // 设置超时时间为5秒
}
resp, err := client.Do(req)
if err != nil {
fmt.Println("err:", err)
return "连接超时!"
} else {
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
println(string(body))
if err != nil {
fmt.Println("err:", err)
} else {
var resp_data map[string]interface{}
err := json.Unmarshal(body, &resp_data)
if err != nil {
return "DNS解析失败"
}
ip = resp_data["data"].(map[string]interface{})["ip"].(string)
// print("ip: ", ip)
}
}
}
url := "https://api.ip.sb/geoip/" + ip
fmt.Println("url: ", url)
req, err := http.NewRequest("GET", url, nil)
if err != nil {
fmt.Println("创建请求失败:", err)
}
req.Header.Set("User-Agent", "Mozilla/5.0")
resp, err := http.DefaultClient.Do(req)
if err != nil {
return "ip查询失败"
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return "ip查询失败"
}
// fmt.Println("body: ", string(body))
var data map[string]interface{}
err = json.Unmarshal(body, &data)
if err != nil {
fmt.Println("data: ", data)
return err.Error()
}
// 输出响应数据
fmt.Println("data: ", data)
if _, ok := data["code"].(float64); ok {
code := data["code"].(float64)
if code == 401 {
return "ip查询失败"
}
}
var msgs []string
if _, ok := data["organization"].(string); ok {
msgs = append(msgs, "组织:"+data["organization"].(string))
}
if _, ok := data["city"].(string); ok {
msgs = append(msgs, "城市:"+data["city"].(string))
}
if _, ok := data["isp"].(string); ok {
msgs = append(msgs, "ISP"+data["isp"].(string))
}
if _, ok := data["asn"].(string); ok {
msgs = append(msgs, "ASN"+data["asn"].(string))
}
if _, ok := data["asn_organization"].(string); ok {
msgs = append(msgs, "ASN组织"+data["asn_organization"].(string))
}
if _, ok := data["country"].(string); ok {
msgs = append(msgs, "国家:"+data["country"].(string))
}
msgs = append(msgs, "IP"+data["ip"].(string))
msg := strings.Join(msgs, "\n")
return msg
}