Go + 腾讯云云函数,获取IP和地理位置

本文介绍了一个使用Gin和Go语言编写的HTTP服务,它接收GET和POST请求,通过访问外部API获取并解析IP地址的省份和城市信息,返回JSON格式的数据。
摘要由CSDN通过智能技术生成
package main

import (
	"bytes"
	"github.com/gin-gonic/gin"
	"golang.org/x/text/encoding/simplifiedchinese"
	"golang.org/x/text/transform"
	"io/ioutil"
	"log"
	"net/http"
	"regexp"
	"time"
)

type Return struct {
	YourInputIP string `json:"yourInputIP"`
	Province    string `json:"province"`
	City        string `json:"city"`
}

func Decode(s []byte) ([]byte, error) {
	I := bytes.NewReader(s)
	O := transform.NewReader(I, simplifiedchinese.GBK.NewDecoder())
	d, e := ioutil.ReadAll(O)
	if e != nil {
		return nil, e
	}
	return d, nil
}
func Run(ctx *gin.Context) {
	IP := ctx.Param("ip")
	if IP == "" {
		IP = ctx.ClientIP()
		if IP == "::1" {
			IP = "127.0.0.1"
		}
	}
	// URL param
	resp, err := http.Get("http://ip.ws.126.net/ipquery?ip=" + IP)
	if err != nil {
		log.Println(err)
		ctx.PureJSON(http.StatusInternalServerError, nil)
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		log.Println(err)
		ctx.PureJSON(http.StatusInternalServerError, nil)
	}
	body, err = Decode(body)
	if err != nil {
		log.Println(err)
		ctx.PureJSON(http.StatusInternalServerError, nil)
	}
	var result []string
	regexpValue := []string{`province\:\"(.*)\"`, `city\:\"(.*)\",\s`}
	for _, v := range regexpValue {
		//解释正则表达式
		reg := regexp.MustCompile(v)
		if reg == nil {
			log.Println(err)
			ctx.PureJSON(http.StatusInternalServerError, nil)
		}
		//提取关键信息
		regResult := reg.FindAllStringSubmatch(string(body), -1)
		result = append(result, regResult[0][1])
	}
	var resultValue *Return
	resultValue = &Return{
		YourInputIP: IP,
		Province:    result[0],
		City:        result[1],
	}
	ctx.PureJSON(http.StatusOK, resultValue)
}
func main() {
	router := gin.Default()
	service := &http.Server{
		Addr:           ":9000",
		Handler:        router,
		ReadTimeout:    10 * time.Second,
		WriteTimeout:   10 * time.Second,
		MaxHeaderBytes: 1 << 20,
	}
	router.GET("/", Run)
	router.POST("/", Run)
	router.GET("/:ip", Run)
	router.POST("/:ip", Run)
	service.ListenAndServe()
}
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Deng_Xian_Shemg

捐助1元钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值