搜尋
首頁電腦教學電腦知識關於抖音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 =# 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”;##o.. static final String WL_PROXY_CLIENT_IP = 「WL-Proxy-Client-IP」; private static final String HTTP_CLIENT_IP = 「HTTP_CLIENT_IP」;## private static final 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才是真 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_gnUE.equalsIoreCase(ip) && !UNKNOWN_gnUE.equalsIoreCase(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} if (StringUtils.isBlank(ip) ||UNKNOWN_VALUE} )) {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(LOCALHOSTAdd : 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[] contentBuffstatstat; { 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(); try {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); } } } 回傳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

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。