検索
ホームページコンピューターのチュートリアルコンピュータ知識DouyinのIP位置を問い合わせる方法(DouyinのIP位置を表示する方法)

DouyinのIP位置を問い合わせる方法(DouyinのIP位置を表示する方法)

1. 背景

php エディタ Xiaoxin は、Douyin IP 領域に関するクエリ方法を紹介します。 Douyin APP を使用するとき、特定のユーザーの IP アドレスがどこに属しているかを知りたいことがよくあります。 IP の位置をクエリすることで、ユーザーのおおよその位置情報を知ることができます。では、Douyin の IP 位置を確認するにはどうすればよいでしょうか?次に、具体的な回答をさせていただきます。

次に、Java バックエンドが IP アトリビューション機能を実装する方法に焦点を当てましょう。実際に必要なのは、次の 2 つの手順だけです:

2. クライアント IP インターフェイスの取得

## Web 開発を行ったことがある人なら、モバイル端末であっても PC 端末であっても、リクエスト インターフェイスは HttpServletRequest オブジェクトにカプセル化されることを知っています。このオブジェクトには、リクエスト アドレス、パラメータ、送信されたデータなど、クライアントによって要求されたさまざまな情報が含まれます。

サーバーが IP を直接公開する場合、request.getRemoteAddr() はクライアント IP を取得できます。

現在一般的なアーキテクチャでは、ほとんどのサーバーは IP アドレスを直接公開せず、1 つ以上のリバース プロキシ層を通じてリクエストを処理します。一般的なリバース プロキシ ツールは 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 で通常使用されるリクエスト ヘッダーです。

日常の開発では、クライアントを追跡するためにどのヘッダ情報を使用するかが明確に指定されていないため、取得するまで 1 つずつ試す必要があります。対応するコードは次のとおりです。

ini

コピー コード

@Slf4jpublic class IpUtils { private static Final String UNKNOWN_VALUE = “unknown”

; private static Final String LOCALHOST_V4 = “ 127.0. 0.1”; プライベート静的最終文字列 LOCALHOST_V6 = “0:0:0:0:0:0:0:1”; プライベート静的最終文字列 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”; プライベート静的最終文字列 WL_PROXY_CLIENT_IP = “WL-Proxy-Client-IP”; プライベート静的最終文字列 HTTP_CLIENT_IP = “HTTP_CLIENT_IP”; プライベート静的最終文字列 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 値が存在します。 1 つの 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(); try {searcher = Searcher. newWithBuffer(contentBuff); Stringregion = searcher.search(ip); String[]info = StringUtils.split(region, “|”); ipRegion .set Country(info[0]); ipRegion.setArea(info[1]); ipRegion.setProvince(info[2]); ipRegion.setCity (info[3]); ipRegion.setIsp(info[4]); } catch (Exception e) { log.error(“get IP リージョン エラー: “, e) ; }finally { if (searcher != null) { try { searcher.close(); } catch (IOException e) { log.error(“close searcher error:”, e); } } } ipRegion; }}

を返す

以上がDouyinのIP位置を問い合わせる方法(DouyinのIP位置を表示する方法)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は晶发科技で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Valorant Connection Error Windows 10/11のトップ5ソリューション-MinitoolValorant Connection Error Windows 10/11のトップ5ソリューション-MinitoolMay 13, 2025 am 12:54 AM

Valorantはゲーム時に接続エラーに遭遇しましたか?それがPCで起こったらどうしますか?落ち着いて。すべての問題に修正があります。 Valorantも例外ではありません。 PHP.CN Webサイトのこの記事では、満足のいくソリューションを見つけなければならないと思います。

PUAを削除する方法:Window 10/11のWin32/FlashHelper?PUAを削除する方法:Window 10/11のWin32/FlashHelper?May 13, 2025 am 12:53 AM

PUA:Win32/FlashHelperがPCにあるというメッセージが表示された場合はどうすればよいですか?あなたはそれが何であるか知っていますか?これは潜在的に望ましくないソフトウェアであり、データとシステムを脅かす可能性があります。コンピューターがそれに感染したら、このガイドに従ってください

ウェブサイトの閲覧中にいくつかの一般的なクロム接続エラーを修正-Minitoolウェブサイトの閲覧中にいくつかの一般的なクロム接続エラーを修正-MinitoolMay 13, 2025 am 12:51 AM

この投稿では、PHP.CNソフトウェアには、Webページを閲覧するときに遭遇する可能性のある一般的なChrome接続エラーをリストし、これらの問題を解決するための簡単な方法を紹介します。遭遇するエラーを見つけて、対応するソリューションをHに使用できます

インターネット上のクッキーとは何ですか?クッキーは悪いですか? - ミニトールインターネット上のクッキーとは何ですか?クッキーは悪いですか? - ミニトールMay 13, 2025 am 12:50 AM

Cookieは、Webページを閲覧するときにほぼ毎日遭遇するため、Cookieが新しいように聞こえない場合があります。しかし、あなたは正確にクッキーが何であるか知っていますか? PHP.CN Webサイトのこのガイドでは、それらに関する詳細情報を示します。

iPhoneからHPプリンターへの写真/ドキュメントを3つの方法で印刷する方法-MinitooliPhoneからHPプリンターへの写真/ドキュメントを3つの方法で印刷する方法-MinitoolMay 13, 2025 am 12:49 AM

iPhoneから写真を印刷したい場合は、どうすればよいですか?この投稿で3つの方法に従う限り、操作は難しくありません。 PHP.CNでは、iPhoneからHPプリンターへの印刷方法に関する詳細なガイドを紹介します。それでは、それらを見に行きましょう。

Xboxのダウンロードをより速くする方法:ヒントと方法-MinitoolXboxのダウンロードをより速くする方法:ヒントと方法-MinitoolMay 13, 2025 am 12:48 AM

Xboxは、多種多様なゲームを提供しているため、人々の間で非常に人気があります。ユーザーは好きなゲームをダウンロードしてから、直接プレイし始めることができます。ただし、Xboxに関連する一般的な問題の1つは、ダウンロード速度が遅いことです。ユーザーはひれを望んでいます

Windows 11の開発者モードをオンにすることはできませんか? 4つの方法で修正してください! - ミニトールWindows 11の開発者モードをオンにすることはできませんか? 4つの方法で修正してください! - ミニトールMay 13, 2025 am 12:47 AM

開発者の場合、設定の開発者モードがいくつかのテストを行うことができます。ただし、Windows 11で開発者モードをオンにできない場合は、どうすればよいですか?簡単に考えてみると、この投稿からphp.cn solによって書かれたいくつかの効果的な方法を見つけることができます

Windows10 KB5011543は検索ハイライト機能でリリースされます-MinitoolWindows10 KB5011543は検索ハイライト機能でリリースされます-MinitoolMay 13, 2025 am 12:46 AM

Microsoftは、Windows 10の新しい累積アップデートをリリースしましたが、Windows 10 KB5011543です。この更新には、検索ハイライトや修正などの新しい機能が含まれています。このphp.cn投稿を読んで、関連情報を取得できます。その上、あなたはcaです

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。