關於抖音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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

已老實求放過梗是什麼意思? 「已老實求放過」作為一個網絡流行語,源自於一系列關於商品價格上調引發的幽默討論,這一表達現多用於自嘲或調侃情境中,意指個體面對特定情形(如壓力、調侃或玩笑)時,感覺自己無力反抗或辯駁,下面就跟著小編一起來看看這個梗的介紹吧。已老實求放過梗介紹來源:已老實求放過這個梗起源於“給你加個準時寶就老實了”,後來演變為“利群漲兩塊就老實了”和“冰紅茶漲一塊就老實了」。網友大呼“已老實求降價”,最後發展為“已老實求放過”且有表情包誕生。用處:用於在破防的時候或無可奈何,甚至是自我

因為他善梗是什麼意思?相信有不少的小夥伴都有看到有很多短視頻評論區裡有這麼一句評論吧,那這因為他善是什麼意思呢,那今天小編就為大家帶來了因為他善梗介紹,還不清楚的小夥伴快來一起看看吧。因為他善梗介紹來源:「因為他善」這個梗源自網絡,特別是短視頻平台如抖音上的一個熱梗,與知名相聲演員郭德綱的一個段子有關。在這個段子裡,郭德綱以幽默的方式列舉了幾種不做某事的理由,每一條理由的結尾都是“因為他善”,形成了一個詼諧的邏輯閉環,實際上並沒有直接的因果關係,而是無厘頭的搞笑表達。熱梗:例如,「會做的我不

本地微調 DeepSeek 類模型面臨著計算資源和專業知識不足的挑戰。為了應對這些挑戰,可以採用以下策略:模型量化:將模型參數轉換為低精度整數,減少內存佔用。使用更小的模型:選擇參數量較小的預訓練模型,便於本地微調。數據選擇和預處理:選擇高質量的數據並進行適當的預處理,避免數據質量不佳影響模型效果。分批訓練:對於大數據集,分批加載數據進行訓練,避免內存溢出。利用 GPU 加速:利用獨立顯卡加速訓練過程,縮短訓練時間。

對齊一下顆粒度梗是什麼意思? 「對齊一下顆粒度」它最初出現在電影《年會不能停!》中,由演員大鵬在一次採訪中提出,那麼下面就一起來看看具體發生了什麼,希望能給大家帶來幫助。對齊一下顆粒度梗介紹【對齊一下顆粒度】這個詞組並不是標準英語或專業術語,而是特定情境下的一種職場黑話。職場黑話的意思是兩方資訊同步一下,形成共同認知。電影中指的是要讓所有細節讓雙方都知道。

《網路交易合規經營自律公約》簽署:北京京東世紀貿易有限公司淘天有限公司上海尋夢資訊科技有限公司上海格物致品網路科技有限公司北京快手科技有限公司主要內容:一、落實平台責任建立信用評估機制產品品質抽查機制廣告發布管理機制加強網路直播及短視頻行銷活動管理短視頻內容管理對平台內競爭行為規範管理二、消費者權益保護恪守社會公德,誠信經營保護消費者個人資訊暢通消費者投訴管道三、嚴禁不正當競爭行為在法律框架內良性競爭防範利用規則牟利惡意行為防範濫用規則對平台內經營者造成不合理損失四、規範價格行為明碼標價禁止利

抖音母公司位元組跳動推出的AI助理「豆包」以其強大的生成能力受到關注。本指南提供簡要步驟幫助你輕鬆開啟「豆包」之旅。你可以透過網頁版(doubao.com)或安卓App登入“豆包”,首次使用需要使用你的抖音帳號。登入後,你可以嘗試文字創作、圖像生成和語音互動(僅限安卓App)等功能,盡情探索AI創作的樂趣

本文介紹了六款受歡迎的 AI 工具,包括抖音豆包、文心一格、騰訊智影、百度飛槳 EasyDL、百度 AI Studio 和訊飛星火認知大模型。這些工具涵蓋不同的功能,如文字創作、圖像生成、影片編輯和 AI 模型開發。選擇合適的 AI 工具需要考慮功能需求、技術水平和成本預算等因素。這些工具為需要 AI 輔助的個人和企業提供了方便且有效率的解決方案。

LaravelEloquent模型檢索:輕鬆獲取數據庫數據EloquentORM提供了簡潔易懂的方式來操作數據庫。本文將詳細介紹各種Eloquent模型檢索技巧,助您高效地從數據庫中獲取數據。 1.獲取所有記錄使用all()方法可以獲取數據庫表中的所有記錄:useApp\Models\Post;$posts=Post::all();這將返回一個集合(Collection)。您可以使用foreach循環或其他集合方法訪問數據:foreach($postsas$post){echo$post->
