获取用户当前的位置坐标
2026年1月12日 · 274 字 · 2 分钟
封装一个Eino工具通过高德api获取当前位置
获取用户当前的位置坐标
这里通过高德的api获取用户的坐标来封装一个Eino工具
封装http的Get请求
func HttpGet(url string) ([]byte, error) {
response, err := http.Get(url)
if err != nil {
return nil, fmt.Errorf("http get failed: %w", err)
}
if response.StatusCode != 200 {
return nil, fmt.Errorf("http get failed: %s", response.Status)
}
defer response.Body.Close()
body, err := io.ReadAll(response.Body)
if err != nil {
return nil, fmt.Errorf("read body failed: %w", err)
}
return body, nil
}
获取ip
func GetOutBoundIP() (string, error) {
data, err := HttpGet("https://httpbin.org/ip")
if err != nil {
return "", fmt.Errorf("get out ip failed: %w", err)
}
mp := make(map[string]string, 1)
err = sonic.Unmarshal(data, &mp)
return mp["origin"], nil
}
调用高德api
关于接口内容可以看高德接口文档
var (
GAODE_KEY = "xxxx"
)
type LocationResponse struct {
Status string `json:"status"`
Province string `json:"province"`
City string `json:"city"`
Adcode string `json:"adcode"`
}
func GetMyLocation() *LocationResponse {
ip, _ := GetOutBoundIP()
url := fmt.Sprintf("https://restapi.amap.com/v3/ip?key=%s&ip=%s", GAODE_KEY, ip)
data, err := HttpGet(url)
if err != nil {
return nil
}
var location LocationResponse
err = sonic.Unmarshal(data, &location)
if err != nil {
return nil
}
if location.Status != "1" {
return nil
}
return &location
}
封装为工具函数
由于封装为工具函数的原函数有格式要求,所以用了一个匿名函数
func CreateLocationTool() tool.InvokableTool {
locationTool, err := utils.InferTool("location_tool", "获取当前位置", func(ctx context.Context, request struct{}) (string, error) {
location := GetMyLocation()
if location == nil {
return "", fmt.Errorf("get my location failed")
}
return fmt.Sprintf("当前位置: 省:%s 市:%s 城市编码:%s", location.Province, location.City, location.Adcode), nil
})
if err != nil {
log.Fatal(fmt.Errorf("failed to infer tool: %w", err))
}
return locationTool
}
调用函数
func UseLocationTool() {
ctx := context.Background()
//创建工具
locationTool := CreateLocationTool()
//调用工具
response, err := locationTool.InvokableRun(ctx, "{}")
if err != nil {
log.Fatal(fmt.Errorf("failed to invoke tool: %w", err))
}
fmt.Println(response)
}
func main() {
UseLocationTool()
}
调用结果
当前位置: 省:内蒙古自治区 市:呼和浩特市 城市编码:150000