当前位置: 首页 > news >正文

通过ip获取地址

一、示例

import requestsdef GetPublicIP():rsp = requests.get(f'https://ipinfo.io/ip')return rsp.textprint(GetPublicIP())def GetIPLocation(ip):response = requests.get(f'https://ipinfo.io/{ip}/json')data = response.json()return dataip = '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 tokencallCounts 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()          // 获取 IPip := 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)
}

http://www.mrgr.cn/news/9143.html

相关文章:

  • pymysql 与 MySQL数据库交互
  • 资产架构端口应用CDNWAF站库分离负载均衡
  • 建筑楼宇电气安全与能效管理
  • 快团团团长如何高质量选品?如何做最懂顾客的团长!
  • [数据集][目标检测]锤子检测数据集VOC+YOLO格式1510张1类别
  • Compose(10)单元测试
  • python爬虫源码:selenium+browsermobproxy实现浏览器请求抓取
  • iOS profiles文件过期如何更新
  • AI编程工具有哪些?
  • 【功能自动化】使用Excel文档获取参数数据
  • iOS的UI控件是weak还是strong修饰
  • MSSQL 手工注入(第一关)
  • 通过Python绘制不同数据类型适合的可视化图表
  • 鸿蒙Harmony实战:常用命令交互工具—“hvigorw”
  • 前后端传输加密
  • 无人机技术的最新进展及未来趋势
  • 掌握CSS的@import:跨文件样式的艺术
  • 【unity小技巧】获取免费开源的人物模型,并为obj fbx人物模型绑定骨骼、动画——mixamo的使用介绍
  • 中仕公考怎么样?2025年国考现在准备来得及吗?
  • 【Rust光年纪】构建跨语言桥梁:深度解析Rust FFI绑定生成器及其应用