搜索
首页电脑教程电脑知识关于抖音IP属地的查询方法(抖音ip属地怎么显示出来)

关于抖音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删除
顶级打印机,扫描仪和复印机 -  Minitool顶级打印机,扫描仪和复印机 - MinitoolMay 12, 2025 am 12:52 AM

如果您想购买顶级打印机和扫描仪,此帖子列出了一些最佳打印机,扫描仪和复印机,包括一些顶级HP打印机和扫描仪。 PHP.CN软件不仅提供了有用的计算机软件,还提供了各种计算机TUT

如何运行Windows 11网络适配器故障排除器-Minitool如何运行Windows 11网络适配器故障排除器-MinitoolMay 12, 2025 am 12:51 AM

您可以在Windows 11中使用内置网络适配器疑难解答,以查找和解决无线和其他网络适配器的问题。这篇文章会教您如何通过详细说明找到和运行Windows 11网络适配器故障排除。 s

[已解决]战场2042黑屏问题(7个解决方案)-Minitool[已解决]战场2042黑屏问题(7个解决方案)-MinitoolMay 12, 2025 am 12:50 AM

战场2042黑屏然后崩溃是一个烦人的问题。如何修复它?本PHP.CN网站指南旨在解决此问题。仔细观察它,我们衷心希望我们的解决方案对您有效。

如何修复开发错误11557?这是10种方法! -  Minitool如何修复开发错误11557?这是10种方法! - MinitoolMay 12, 2025 am 12:49 AM

您是否曾经在《使命召唤:现代战争2还是Warzone 2)中遇到过Dev错误11557吗?如果是的话,您来了正确的位置。在这篇文章中,PHP.CN提供了一些潜在的解决方案来帮助您解决此错误。

如何在Android/iOS设备上取消Apple Music订阅? -  Minitool如何在Android/iOS设备上取消Apple Music订阅? - MinitoolMay 12, 2025 am 12:48 AM

如果您想取消Apple Music订阅,则有几种方法可以这样做。来自PHP.CN的这篇文章告诉您如何使用iPhone,iPad,Android设备,Mac或Apple TV取消订阅。

比较所有Microsoft 365计划并选择一个首选计划-Minitool比较所有Microsoft 365计划并选择一个首选计划-MinitoolMay 12, 2025 am 12:47 AM

Microsoft 365提供了几种订阅计划,供您选择。这篇文章介绍并比较了所有Microsoft 365计划。您可以根据自己的需求选择首选的Microsoft 365计划。要恢复删除或丢失的文件,例如Office Fil

VLC黑屏?修复' VLC不播放视频”的指南 -  MinitoolVLC黑屏?修复' VLC不播放视频”的指南 - MinitoolMay 12, 2025 am 12:46 AM

VLC Media Player是一个免费的开源,便携式,跨平台媒体播放器软件和流媒体服务器,可用于台式操作系统和移动平台。但是有些人发现“ VLC不播放视频”问题

Microsoft要为Windows 10/11,Mac,Android,iOS -Minitool下载下载Microsoft要为Windows 10/11,Mac,Android,iOS -Minitool下载下载May 12, 2025 am 12:45 AM

为了管理日常任务,您可以使用免费的任务管理应用程序-Microsoft要做。这篇文章教您如何下载Microsoft在Windows 10/11,Mac,iPhone/iPad或Android上进行。如果您正在寻找更多的计算机提示和解决方案,那么您

See all articles

热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

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

热门文章

热工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中