通过ip获取地址

一、示例

import requests

def GetPublicIP():
    rsp = requests.get(f'https://ipinfo.io/ip')
    return rsp.text

print(GetPublicIP())

def GetIPLocation(ip):
    response = requests.get(f'https://ipinfo.io/{ip}/json')
    data = response.json()
    return data

ip = '8.8.8.8'  # 这是Google的公共DNS IP
print(GetIPLocation(ip))

二、用户端调用

如果在用户端调用,如客户端,app等,可以直接使用 ipinfo.io 的接口。因为 ipinfo.io 提供了免费套餐,一个帐户可以有 50,000次每个月。

就算不注册帐户,也有一定次数的免费额度。
It’s also possible to use the API without authentication in a more limited capacity.

# With Basic Auth
$ curl -u 048a85f6a2a791: ipinfo.io

# With Bearer token
$ curl -H "Authorization: Bearer 048a85f6a2a791" ipinfo.io

# With token query parameter
$ curl ipinfo.io?token=048a85f6a2a791

三、服务端调用

可以注册一批帐户池,来扩大免费套餐的限制

// 管理 API 令牌的轮询及统计
type TokenManager struct {
	tokens     []string       // 50,000 requests per-month for each token
	callCounts map[string]int // 统计次数
	index      int            // token 数组的索引
	mu         sync.Mutex
}

func NewTokenManager(tokens []string) *TokenManager {
	callCounts := make(map[string]int)

	for _, token := range tokens {
		callCounts[token] = 0
	}

	return &TokenManager{
		tokens:     tokens,
		index:      0,
		callCounts: callCounts,
	}
}

// 轮询获取下一个令牌并更新调用次数
func (tm *TokenManager) GetNextToken() string {
	tm.mu.Lock()
	defer tm.mu.Unlock()
	token := tm.tokens[tm.index]
	tm.callCounts[token]++
	tm.index = (tm.index + 1) % len(tm.tokens)
	return token
}

// GetCallCounts 返回每个令牌的调用次数
func (tm *TokenManager) GetCallCounts() map[string]int {
	tm.mu.Lock()
	defer tm.mu.Unlock()
	counts := make(map[string]int)
	for token, count := range tm.callCounts {
		counts[token] = count
	}
	return counts
}

var gTokenMgr = NewTokenManager([]string{
	"......8978....",
	"......7e70....",
	"......7745....",
	"......f6a2....",
})

func GetIpLocation(ctx iris.Context) {
	defer func() {
		if r := recover(); r != nil {
			util.GLog().Error(r)
		}
	}()

	remoteIP := ctx.RemoteAddr()          // 获取 IP
	ip := strings.Split(remoteIP, ":")[0] // 去掉端口号
	url := "https://ipinfo.io/" + ip + "/json?token=" + gTokenMgr.GetNextToken()

	rsp, err := http.Get(url)
	if err != nil {
		msg := "Error fetching IP info"
		util.GLog().Error(ip, msg)
		ctx.StatusCode(http.StatusInternalServerError)
		ctx.Text(msg)
		return
	}
	defer rsp.Body.Close()

	body, err := io.ReadAll(rsp.Body)
	if err != nil {
		msg := "Error reading response body"
		util.GLog().Error(ip, msg)
		ctx.StatusCode(http.StatusInternalServerError)
		ctx.Text(msg)
		return
	}

	util.GLog().Info(string(body))
	ctx.Text(string(body))
}

func Dump(ctx iris.Context) {
	callCounts := gTokenMgr.GetCallCounts()
	ctx.JSON(callCounts)
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的纺织品企业财务管理系统,源码+数据库+毕业论文+视频演示 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对纺织品企业财务信息管理的提升,也为了对纺织品企业财务信息进行更好的维护,纺织品企业财务管理系统的出现就变得水到渠成不可缺少。通过对纺织品企业财务管理系统的开发,不仅仅可以学以致用,让学到的知识变成成果出现,也强化了知识记忆,扩大了知识储备,是提升自我的一种很好的方法。通过具体的开发,对整个软件开发的过程熟练掌握,不论是前期的设计,还是后续的编码测试,都有了很深刻的认知。 纺织品企业财务管理系统通过MySQL数据库与Spring Boot框架进行开发,纺织品企业财务管理系统能够实现对财务人员,员工,收费信息,支出信息,薪资信息,留言信息,报销信息等信息的管理。 通过纺织品企业财务管理系统对相关信息的处理,让信息处理变的更加的系统,更加的规范,这是一个必然的结果。已经处理好的信息,不管是用来查找,还是分析,在效率上都会成倍的提高,让计算机变得更加符合生产需要,变成人们不可缺少的一种信息处理工具,实现了绿色办公,节省社会资源,为环境保护也做了力所能及的贡献。 关键字:纺织品企业财务管理系统,薪资信息,报销信息;SpringBoot
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值