目录
1.背景
2.获取客户端ip接口
3.获取ip归属地
3.1 Ip2region 特性
3.2 整合Ip2region客户端进行查询
3.3 springboot整合示例
首页 电脑教程 电脑知识 关于抖音IP属地的查询方法(抖音ip属地怎么显示出来)

关于抖音IP属地的查询方法(抖音ip属地怎么显示出来)

Feb 15, 2024 pm 02:42 PM
抖音 内存占用

关于抖音IP属地的查询方法(抖音ip属地怎么显示出来)

1.背景

php小编小新为大家介绍关于抖音IP属地的查询方法。在使用抖音APP时,我们常常会想知道某个用户的IP地址所属地是哪里。通过查询IP属地,我们可以了解到用户的大致位置信息。那么,如何查询抖音IP属地呢?接下来,我们将为您详细解答。

接下来,就着重讲解一下Java后端怎么实现IP归属地的功能,其实只需要以下两大步骤:

2.获取客户端ip接口

做过web开发的人都明白,不管是移动端还是pc端,请求接口都会被封装成HttpServletRequest对象。这个对象包含了客户端请求的各种信息,比如请求地址、参数和提交的数据等等。

如果服务器直接把IP暴漏出去,那么request.getRemoteAddr()就能拿到客户端ip。

目前流行的架构中,大多数服务器都不直接暴露自己的IP地址,而是通过一层或多层反向代理来处理请求。常见的反向代理工具是nginx。通过引入代理,服务器和客户端之间会增加一层,因此使用request.getRemoteAddr()方法获取的IP地址将是代理服务器的IP地址,而不是客户端的IP地址。为了追踪原始客户端的IP地址,通常会在转发头中添加X-Forwarded-For等信息。这些信息可以用来确定请求的真实来源。

X-Forwarded-For是一个由Squid开发的字段,在通过HTTP代理或负载均衡服务器时才会添加。它的格式为X-Forwarded-For:client1,proxy1,proxy2。通常情况下,第一个IP地址是客户端的真实IP,后面的IP地址是经过的代理服务器的IP。根据上面的代码注释,可以直接截取第一个IP地址。 Proxy-Client-IP/WL-Proxy-Client-IP是经过Apache HTTP服务器请求时才会存在的头部。当使用Apache HTTP做代理时,通常会添加Proxy-Client-IP请求头,而WL-Proxy-Client-IP是WebLogic插件添加的头部。在这种情况下,也可以直接获取到这些头部信息。 HTTP_CLIENT_IP是一些代理服务器可能添加的请求头。 X-Real-IP通常是由Nginx使用的请求头。

日常开发中未明确规定用哪个头信息跟踪客户端,需逐一尝试,直到获取到为止。下为相应代码:

ini
登录后复制
登录后复制

复制代码

@Slf4jpublic class IpUtils { private static final String UNKNOWN_VALUE = “unknown”; private static final String LOCALHOST_V4 = “127.0.0.1”; private static final String LOCALHOST_V6 = “0:0:0:0:0:0:0:1”; private static final String X_FORWARDED_FOR = “X-Forwarded-For”; private static final String X_REAL_IP = “X-Real-IP”; private static final String PROXY_CLIENT_IP = “Proxy-Client-IP”; private static final String WL_PROXY_CLIENT_IP = “WL-Proxy-Client-IP”; private static final String HTTP_CLIENT_IP = “HTTP_CLIENT_IP”; private static final String IP_DATA_PATH = ”
/Users/shepherdmy/Desktop/ip2region.xdb”; private static byte[] contentBuff; /*** 获取客户端ip地址 * @param request * @return*/ public static String getRemoteHost(HttpServletRequest request) { String ip = request.getHeader(X_FORWARDED_FOR); if (StringUtils.isNotEmpty(ip) && !
UNKNOWN_VALUE.equalsIgnoreCase(ip)) { // 多次反向代理后会有多个ip值,第一个ip才是真实ip int index = ip.indexOf(“,”); if (index != -1) { return ip.substring(0, index); } else { return ip; } }ip = request.getHeader(X_REAL_IP); if (StringUtils.isNotEmpty(ip) && !
UNKNOWN_VALUE.equalsIgnoreCase(ip)) { return ip; } if (StringUtils.isBlank(ip) ||
UNKNOWN_VALUE.equalsIgnoreCase(ip)) {ip = request.getHeader(PROXY_CLIENT_IP); } if (StringUtils.isBlank(ip) ||
UNKNOWN_VALUE.equalsIgnoreCase(ip)) {ip = request.getHeader(WL_PROXY_CLIENT_IP); } if (StringUtils.isBlank(ip) ||
UNKNOWN_VALUE.equalsIgnoreCase(ip)) {ip = request.getRemoteAddr(); } if (StringUtils.isBlank(ip) ||
UNKNOWN_VALUE.equalsIgnoreCase(ip)) {ip = request.getHeader(HTTP_CLIENT_IP); } if (StringUtils.isBlank(ip) ||
UNKNOWN_VALUE.equalsIgnoreCase(ip)) {ip = request.getRemoteAddr(); } return ip.equals(LOCALHOST_V6) ? LOCALHOST_V4 : ip; } }

项目推荐:基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba企业级系统架构底层框架封装,解决业务开发时常见的非功能性需求,防止重复造轮子,方便业务快速开发和企业技术栈框架统一管理。引入组件化的思想实现高内聚低耦合并且高度可配置化,做到可插拔。严格控制包依赖和统一版本管理,做到最少化依赖。注重代码规范和注释,非常适合个人学习和企业使用

Github地址:github.com/plasticene/…

Gitee地址:gitee.com/plasticene3…

微信公众号:Shepherd进阶笔记

交流探讨群:Shepherd_126

3.获取ip归属地

通过上面我们就能获取到客户端用户的ip地址,接下来就可以通过ip解析获取归属地了。

如果我们在网上搜索资料教程,大部分都是说基于各大平台(eg:淘宝,新浪)提供的ip库进行查询,不过不难发现这些平台已经不怎么维护这个功能,现在处于“半死不活”的状态,根本不靠谱,当然有些平台提供可靠的获取ip属地接口,但是收费、收费、收费。

本着作为一个程序员的严谨:“能白嫖的就白嫖,避免出现要买的是你,不会用也是你的尴尬遭遇”。扯远了言归正传,为了寻求可靠有效的解决方案,只能去看看github有没有什么项目能满足需求,果然功夫不负有心人,发现一个宝藏级项目:ip2region,一个准确率 99.9% 的离线 IP 地址定位库,0.0x 毫秒级查询,ip2region.db 数据库只有数 MB的项目,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现,这里只能说:开源真香,开源万岁。

3.1 Ip2region 特性

标准化的数据格式

每个 ip 数据段的 region 信息都固定了格式:国家|区域|省份|城市|ISP,只有中国的数据绝大部分精确到了城市,其他国家部分数据只能定位到国家,其余选项全部是0。

数据去重和压缩

xdb 格式生成程序会自动去重和压缩部分数据,默认的全部 IP 数据,生成的 ip2region.xdb 数据库是 11MiB,随着数据的详细度增加数据库的大小也慢慢增大。

极速查询响应

即使是完全基于 xdb 文件的查询,单次查询响应时间在十微秒级别,可通过如下两种方式开启内存加速查询:

vIndex 索引缓存 :使用固定的 512KiB 的内存空间缓存 vector index 数据,减少一次 IO 磁盘操作,保持平均查询效率稳定在10-20微秒之间。xdb 整个文件缓存:将整个 xdb 文件全部加载到内存,内存占用等同于 xdb 文件大小,无磁盘 IO 操作,保持微秒级别的查询效率。

IP 数据管理框架

v2.0 格式的 xdb 支持亿级别的 IP 数据段行数,region 信息也可以完全自定义,例如:你可以在 region 中追加特定业务需求的数据,例如:GPS信息/国际统一地域信息编码/邮编等。也就是你完全可以使用 ip2region 来管理你自己的 IP 定位数据。

99.9% 准确率

数据聚合了一些知名 ip 到地名查询提供商的数据,这些是他们官方的的准确率,经测试着实比经典的纯真 IP 定位准确一些。

ip2region 的数据聚合自以下服务商的开放 API 或者数据(升级程序每秒请求次数 2 到 4 次):

01,>80%,淘宝IP地址库,ip.taobao.com/%5C02,≈10%,GeoIP,geoip.com/%5C03,≈2%,纯真 IP 库,www.cz88.net/%5C

备注:如果上述开放 API 或者数据都不给开放数据时 ip2region 将停止数据的更新服务。

3.2 整合Ip2region客户端进行查询

提供了众多主流编程语言的 xdb 数据生成和查询客户端实现,已经集成的客户端有:java、C#、php、c、python、nodejs、php扩展(php5 和 php7)、golang、rust、lua、lua_c,nginx。这里讲一下java的客户端。

首先我们需要引入依赖:

xml
登录后复制

复制代码

org.lionsoulip2region2.6.5

接下来我们需要先去下载数据文件ip2region.xdb到本地,然后基于数据文件进行查询,下面查询方法文件路径改为你本地路径即可,ip2region提供三种查询方式:

完全基于文件的查询

java
登录后复制
登录后复制
登录后复制

复制代码

import
org.lionsoul.ip2region.xdb.Searcher;import java.io.*;import
java.util.concurrent.TimeUnit;publicclassSearcherTest {publicstaticvoidmain(String[] args) {// 1、创建 searcher 对象StringdbPath=”ip2region.xdb file path”;Searchersearcher=null;try { searcher = Searcher.newWithFileOnly(dbPath); } catch (IOException e) { System.out.printf(“failed to create searcher with `%s`: %s\\n”, dbPath, e);return; }// 2、查询try {Stringip=”1.2.3.4″;longsTime= System.nanoTime();Stringregion= searcher.search(ip);longcost=
TimeUnit.NANOSECONDS.toMicros((long) (System.nanoTime() – sTime)); System.out.printf(“{region: %s, ioCount: %d, took: %d μs}\\n”, region, searcher.getIOCount(), cost); } catch (Exception e) { System.out.printf(“failed to search(%s): %s\\n”, ip, e); }// 3、关闭资源 searcher.close();// 备注:并发使用,每个线程需要创建一个独立的 searcher 对象单独使用。 }}

缓存 VectorIndex 索引

我们可以提前从 xdb 文件中加载出来 VectorIndex 数据,然后全局缓存,每次创建 Searcher 对象的时候使用全局的 VectorIndex 缓存可以减少一次固定的 IO 操作,从而加速查询,减少 IO 压力。

java
登录后复制
登录后复制
登录后复制

复制代码

import
org.lionsoul.ip2region.xdb.Searcher;import java.io.*;import
java.util.concurrent.TimeUnit;publicclassSearcherTest {publicstaticvoidmain(String[] args) {StringdbPath=”ip2region.xdb file path”;// 1、从 dbPath 中预先加载 VectorIndex 缓存,并且把这个得到的数据作为全局变量,后续反复使用。byte[] vIndex;try { vIndex =
Searcher.loadVectorIndexFromFile(dbPath); } catch (Exception e) { System.out.printf(“failed to load vector index from `%s`: %s\\n”, dbPath, e);return; }// 2、使用全局的 vIndex 创建带 VectorIndex 缓存的查询对象。 Searcher searcher;try { searcher =
Searcher.newWithVectorIndex(dbPath, vIndex); } catch (Exception e) { System.out.printf(“failed to create vectorIndex cached searcher with `%s`: %s\\n”, dbPath, e);return; }// 3、查询try {Stringip=”1.2.3.4″;longsTime= System.nanoTime();Stringregion= searcher.search(ip);longcost=
TimeUnit.NANOSECONDS.toMicros((long) (System.nanoTime() – sTime)); System.out.printf(“{region: %s, ioCount: %d, took: %d μs}\\n”, region, searcher.getIOCount(), cost); } catch (Exception e) { System.out.printf(“failed to search(%s): %s\\n”, ip, e); }// 4、关闭资源 searcher.close();// 备注:每个线程需要单独创建一个独立的 Searcher 对象,但是都共享全局的制度 vIndex 缓存。 }}

缓存整个 xdb 数据

我们也可以预先加载整个 ip2region.xdb 的数据到内存,然后基于这个数据创建查询对象来实现完全基于文件的查询,类似之前的 memory search。

java
登录后复制
登录后复制
登录后复制

复制代码

import
org.lionsoul.ip2region.xdb.Searcher;import java.io.*;import
java.util.concurrent.TimeUnit;publicclassSearcherTest {publicstaticvoidmain(String[] args) {StringdbPath=”ip2region.xdb file path”;// 1、从 dbPath 加载整个 xdb 到内存。byte[] cBuff;try { cBuff =
Searcher.loadContentFromFile(dbPath); } catch (Exception e) { System.out.printf(“failed to load content from `%s`: %s\\n”, dbPath, e);return; }// 2、使用上述的 cBuff 创建一个完全基于内存的查询对象。 Searcher searcher;try { searcher = Searcher.newWithBuffer(cBuff); } catch (Exception e) { System.out.printf(“failed to create content cached searcher: %s\\n”, e);return; }// 3、查询try {Stringip=”1.2.3.4″;longsTime= System.nanoTime();Stringregion= searcher.search(ip);longcost=
TimeUnit.NANOSECONDS.toMicros((long) (System.nanoTime() – sTime)); System.out.printf(“{region: %s, ioCount: %d, took: %d μs}\\n”, region, searcher.getIOCount(), cost); } catch (Exception e) { System.out.printf(“failed to search(%s): %s\\n”, ip, e); }// 4、关闭资源 – 该 searcher 对象可以安全用于并发,等整个服务关闭的时候再关闭 searcher// searcher.close();// 备注:并发使用,用整个 xdb 数据缓存创建的查询对象可以安全的用于并发,也就是你可以把这个 searcher 对象做成全局对象去跨线程访问。 }}

3.3 springboot整合示例

首先我们也需要像上面一样引入maven依赖。然后就可以基于上面的查询方式进行封装成工具类了,我这里选择了上面的第三种方式:缓存整个 xdb 数据

ini
登录后复制
登录后复制

复制代码

@Slf4jpublic class IpUtils { private static Final String IP_DATA_PATH = ”
/Users/shepherdmy/Desktop/ip2region.xdb”; private static byte[] contentBuff; static { try { // 从 dbPath 加载整个 xdb 到内存contentBuff =
Searcher.loadContentFromFile(IP_DATA_PATH); } catch (IOException e) { e.printStackTrace(); } } /*** 根据ip查询归属地,固定格式:中国|0|浙江省|杭州市|电信 * @param ip * @return*/ public static IpRegion getIpRegion(String ip) { Searcher searcher = null; IpRegion ipRegion = new IpRegion(); 尝试 {searcher = Searcher.newWithBuffer(contentBuff); Stringregion = searcher.search(ip); String[]info = StringUtils.split(region, “|”); ipRegion.setCountry(info[0]); ipRegion.setArea(info[1]); ipRegion.setProvince(info[2]); ipRegion.setCity(info[3] ]); ipRegion.setIsp(info[4]); } catch (Exception e) { log.error(“获取 ip 区域错误:”, e); } 最后 { if (searcher != null ) { try { searcher.close(); } catch (IOException e) { log.error(“关闭搜索器错误:”, e); } } } return ipRegion; }}

以上是关于抖音IP属地的查询方法(抖音ip属地怎么显示出来)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆树的耳语 - 如何解锁抓钩
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1665
14
CakePHP 教程
1424
52
Laravel 教程
1322
25
PHP教程
1270
29
C# 教程
1249
24
已老实求放过梗介绍 已老实求放过梗介绍 Jul 17, 2024 am 05:44 AM

已老实求放过梗是什么意思?“已老实求放过”作为一个网络流行语,源自于一系列关于商品价格上调引发的幽默讨论,这一表达现多用于自嘲或调侃情境中,意指个体面对特定情形(如压力、调侃或玩笑)时,感觉自己无力反抗或辩驳,下面就跟着小编一起来看看这个梗的介绍吧。已老实求放过梗介绍来源:已老实求放过这个梗起源于“给你加个准时宝就老实了”,后来演变为“利群涨两块就老实了”和“冰红茶涨一块就老实了”。网友大呼“已老实求降价”,最后发展为“已老实求放过”且有表情包诞生。用处:用于在破防的时候或者无可奈何,甚至是自我

因为他善梗介绍 因为他善梗介绍 Jul 16, 2024 pm 08:59 PM

因为他善梗是什么意思?相信有不少的小伙伴都有看到有很多短视频评论区里有这么一句评论吧,那这因为他善是什么意思呢,那今天小编就为大家带来了因为他善梗介绍,还不清楚的小伙伴快来一起看看吧。因为他善梗介绍来源:“因为他善”这个梗源自网络,特别是短视频平台如抖音上的一个热梗,与知名相声演员郭德纲的一个段子有关。在这个段子里,郭德纲以幽默的方式列举了几种不做某事的理由,每一条理由的结尾都是“因为他善”,形成了一个诙谐的逻辑闭环,实际上并没有直接的因果关系,而是一种无厘头的搞笑表达。热梗:例如,“会做的我不

deepseek怎么本地微调 deepseek怎么本地微调 Feb 19, 2025 pm 05:21 PM

本地微调 DeepSeek 类模型面临着计算资源和专业知识不足的挑战。为了应对这些挑战,可以采用以下策略:模型量化:将模型参数转换为低精度整数,减少内存占用。使用更小的模型:选择参数量较小的预训练模型,便于本地微调。数据选择和预处理:选择高质量的数据并进行适当的预处理,避免数据质量不佳影响模型效果。分批训练:对于大数据集,分批加载数据进行训练,避免内存溢出。利用 GPU 加速:利用独立显卡加速训练过程,缩短训练时间。

对齐一下颗粒度梗介绍 对齐一下颗粒度梗介绍 Jul 16, 2024 pm 12:36 PM

对齐一下颗粒度梗是什么意思?“对齐一下颗粒度”它最初出现在电影《年会不能停!》中,由演员大鹏在一次采访中提出,那么下面就一起来看看具体发生了什么,希望能给大家带来帮助。对齐一下颗粒度梗介绍【对齐一下颗粒度】这个词组并不是标准英语或者专业术语,而是特定情境下的一种职场黑话。职场黑话的意思是两方信息同步一下,形成共同认知。电影中指的是要让所有细节让双方都知道。

京东、淘宝、拼多多、抖音、快手共同签署《网络交易合规经营自律公约》 京东、淘宝、拼多多、抖音、快手共同签署《网络交易合规经营自律公约》 Aug 23, 2024 am 12:05 AM

《网络交易合规经营自律公约》签署方:北京京东世纪贸易有限公司淘天有限公司上海寻梦信息技术有限公司上海格物致品网络科技有限公司北京快手科技有限公司主要内容:一、落实平台责任建立信用评价机制产品质量抽查机制广告发布管理机制加强网络直播和短视频营销活动管理短视频内容管理对平台内竞争行为规范管理二、消费者权益保护恪守社会公德,诚信经营保护消费者个人信息畅通消费者投诉渠道三、严禁不正当竞争行为在法律框架内良性竞争防范利用规则牟利恶意行为防范滥用规则对平台内经营者造成不合理损失四、规范价格行为明码标价禁止利

抖音的豆包功能怎么开启 抖音的豆包功能怎么开启 Nov 28, 2024 pm 07:39 PM

抖音母公司字节跳动推出的AI助手“豆包”以其强大的生成能力受到关注。本指南提供简要步骤帮助你轻松开启“豆包”之旅。你可以通过网页版(doubao.com)或安卓App登录“豆包”,首次使用需要使用你的抖音账号。登录后,你可以尝试文本创作、图像生成和语音交互(仅限安卓App)等功能,尽情探索AI创作的乐趣

Bangla 部分模型检索中的 Laravel Eloquent ORM) Bangla 部分模型检索中的 Laravel Eloquent ORM) Apr 08, 2025 pm 02:06 PM

LaravelEloquent模型检索:轻松获取数据库数据EloquentORM提供了简洁易懂的方式来操作数据库。本文将详细介绍各种Eloquent模型检索技巧,助您高效地从数据库中获取数据。1.获取所有记录使用all()方法可以获取数据库表中的所有记录:useApp\Models\Post;$posts=Post::all();这将返回一个集合(Collection)。您可以使用foreach循环或其他集合方法访问数据:foreach($postsas$post){echo$post->

ai工具推荐 ai工具推荐 Nov 29, 2024 am 11:08 AM

本文介绍了六款流行的 AI 工具,包括抖音豆包、文心一格、腾讯智影、百度飞桨 EasyDL、百度 AI Studio 和讯飞星火认知大模型。这些工具涵盖不同的功能,如文本创作、图像生成、视频编辑和 AI 模型开发。选择合适的 AI 工具需要考虑功能需求、技术水平和成本预算等因素。这些工具为需要 AI 辅助的个人和企业提供了方便且高效的解决方案。

See all articles