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()
}
Go + 腾讯云云函数,获取IP和地理位置
于 2024-02-27 17:40:49 首次发布
本文介绍了一个使用Gin和Go语言编写的HTTP服务,它接收GET和POST请求,通过访问外部API获取并解析IP地址的省份和城市信息,返回JSON格式的数据。
摘要由CSDN通过智能技术生成