获取用户当前的位置坐标

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