通过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)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/871648.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp-部分文件中文乱码

一、问题 在开发时遇到,部分页面的中文显示乱码,如图 搜索了一下解决方法,这里记录一下 二、问题原因: 页面的编码格式不是 utf-8 造成的 三、解决方法 打开出现乱码页面选择编译器左上角的文件 > 以指定编码重新打开 选择U…

[C++] C++11详解 (一)

标题:[C] C11详解 (一) 水墨不写bug 目录 前言 一、列表初始化 二、STL的初始化列表(initializer_list —— Cplusplus.com) 三、声明方式(auto、decltype、nullptr) 1.auto ​编辑 2.decltype 正文开始&#x…

腾讯无界微前端框架介绍

一、无界微前端框架概述 无界微前端框架是由腾讯团队推出的,旨在解决现有微前端方案中存在的问题,如适配成本高、样式隔离困难、运行性能不佳、页面白屏、子应用通信复杂、子应用保活机制缺乏等。 技术实现 无界微前端的核心技术是基于Web Component…

数据导入导出(EasyExcel)框架入门指南

写在前面 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 文章目录 EasyExcel 框架概述依赖APIExcel 实体类注解写 Excel概念介绍写 Excel 通用参数WriteWorkbookWriteSheetWriteTable 代码…

GD32双路CAN踩坑记录

GD32双路CAN踩坑记录 目录 GD32双路CAN踩坑记录1 问题描述2 原因分析3 解决办法4 CAN配置参考代码 1 问题描述 GD32的CAN1无法进入接收中断,收不到数据。 注:MCU使用的是GD32E50x,其他型号不确定是否一样,本文只以GD32E50x举例说…

Vue项目-三级联动的路由跳转与传参

三级联动组件的路由的跳转与传参 三级联动,用户可以点击的:一级分类、二级分类和三级分类 以商城项目为例,Home模块跳转到Search模块,以及会把用户选中的产品(产品名字、产品ID)在路由跳转的时候&#xff…

Q*算法深度猜猜:从Q-learning优化到智能决策

Q*算法深度猜猜:从Q-learning优化到智能决策 引言 在强化学习(Reinforcement Learning)中,Q-learning算法作为一种无模型的学习方法,被广泛应用于解决各种决策优化问题。然而,尽管Q-learning在许多场景下…

基于ssm+vue+uniapp的医院挂号预约系统小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

Matlab处理H5文件

1.读取h5文件 filenamexxx.h5; h5disp(filename) 2.h5文件保存为mat文件 读取 HDF5 文件中的数据 % 指定 HDF5 文件的路径 filename xxx.h5;% 读取 HDF5 文件中的各个数据集 A241_P h5read(filename, /A241_P); A241_W h5read(filename, /A241_W); A242_P h5read(filen…

Ps:首选项 - 性能

Ps菜单:编辑/首选项 Edit/Preferences 快捷键:Ctrl K Photoshop 首选项中的“性能” Performance选项卡允许用户通过调整内存使用、GPU 设置、高速缓存设置以及多线程处理等选项,来优化 Photoshop 的性能。这对于处理大文件、复杂图像或需要…

【NOI-题解】1137 - 纯粹素数1258 - 求一个三位数1140 - 亲密数对1149 - 回文数个数

文章目录 一、前言二、问题问题:1137 - 纯粹素数问题:1258 - 求一个三位数问题:1140 - 亲密数对问题:1149 - 回文数个数 三、感谢 一、前言 欢迎关注本专栏《C从零基础到信奥赛入门级(CSP-J)》 本章节主要…

二进制安装php

下载php二进制包: 官网地址:https://www.php.net/releases/ PHP: Releaseshttps://www.php.net/releases/在里边可以选择自己要下载的包进行下载; 下载完成后进行解压: tar xvzf php-7.3.12.tar.gz 解压后 进入目录进行预编…

学习yolo+Java+opencv简单案例(三)

主要内容:车牌检测识别(什么颜色的车牌,车牌号) 模型作用:车牌检测,车牌识别 文章的最后附上我的源码地址。 学习还可以参考我前两篇博客: 学习yoloJavaopencv简单案例(一&#xff0…

Cobalt Strike 4.8 用户指南-第二节-用户界面

2.1、概述 Cobalt Strike用户界面分为两部分。界面顶部显示会话或目标的可视化。界面底部显示与你交互的每个 Cobalt Strike 功能或会话的选项卡。可以单击这两个部分之间的区域并根据自己的喜好调整它们的大小。 # 2.2、工具栏 顶部的工具栏提供对常见 Cobalt Strike功能的快…

C/C++实现蓝屏2.0

🚀欢迎互三👉:程序猿方梓燚 💎💎 🚀关注博主,后期持续更新系列文章 🚀如果有错误感谢请大家批评指出,及时修改 🚀感谢大家点赞👍收藏⭐评论✍ 前…

LeetCode合并两个有序链表

题目描述: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2: 输入:l1 [], l2…

chromedriver下载地址大全(包括124.*后)以及替换exe后仍显示版本不匹配的问题

Chrome for Testing availability CNPM Binaries Mirror 若已经更新了系统环境变量里的chromdriver路径下的exe,仍显示版本不匹配: 则在cmd界面输入 chromedriver 会跳出version verison与刚刚下载好的exe不匹配,则再输入: w…

http连接未释放导致生产故障

凌晨4点运维老大收到报警(公司官网页面超时,上次故障因为运维修改nginx导致官网域名下某些接口不可用后,运维在2台nginx服务器上放了检测程序,检测官网页面),运维自己先看了看服务器相关配置,后…

小区物业维修管理系统/小区居民报修系统

摘要 小区物业维修是物业公司的核心,是必不可少的一个部分。在物业公司的整个服务行业中,业主担负着最重要的角色。为满足如今日益复杂的管理需求,各类小区物业维修管理系统也在不断改进。本课题所设计的小区物业维修管理系统,使用…

IPC进程间通信方式及网络通信

一、IPC进程间通信方式 1.共享内存(最高效的进程间通信方式) 其允许两个或多个进程共享一个给定的存储区,这一段存储区可以被两个或以上的进程映射至自己的地址空间中,一个进程写入共享内存的信息,可以被其他使用这个…