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
; 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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









外国人女性の顔文字は何ですか?最近、外国人女性の顔文字パッケージがインターネット上で非常に人気になっています。ビデオを見ているときに多くの友人がこれに遭遇すると思います。興味があれば、編集者がいくつかの対応する顔文字パッケージを紹介します。外国人女性の表現パックの完全なコレクション

このサイトは6月27日、JianyingはByteDanceの子会社であるFaceMeng Technologyによって開発されたビデオ編集ソフトウェアであり、Douyinプラットフォームに依存しており、基本的にプラットフォームのユーザー向けに短いビデオコンテンツを作成すると報告しました。 Windows、MacOS、その他のオペレーティング システム。 Jianyingは会員システムのアップグレードを正式に発表し、インテリジェント翻訳、インテリジェントハイライト、インテリジェントパッケージング、デジタルヒューマン合成などのさまざまなAIブラックテクノロジーを含む新しいSVIPを開始しました。価格的には、クリッピングSVIPの月額料金は79元、年会費は599元(当サイト注:月額49.9元に相当)、継続月額サブスクリプションは月額59元、継続年間サブスクリプションは、年間499元(月額41.6元に相当)です。さらに、カット担当者は、ユーザーエクスペリエンスを向上させるために、オリジナルのVIPに登録している人は、

正直になって手放すとはどういう意味ですか?インターネットの流行語として、「私は正直で、手放してほしいと懇願しています」は、商品価格の上昇に関する一連のユーモラスな議論から生まれましたが、現在では主に、個人が特定の状況に直面していることを意味する、自虐的または嘲笑的な状況で使用されています。 (プレッシャー、からかいや冗談など)、抵抗したり議論したりできないと感じている場合は、編集者をフォローしてこのミームの紹介を見てみましょう。 「Already Begging to Let It Go」ミームの導入元: 「Already Begging to Let It Go」は「時間厳守の宝物を追加すると正直になる」に由来し、後に「If Liqun go up by」に進化しました。 「2元、正直に言ってください」と「アイス紅茶は1元上がります、正直に言ってください」。ネチズンは「正直に値下げを要求した」と叫び、最終的には「正直に手放してもらいました」に発展し、絵文字パッケージが誕生した。用途:防御を破るときや、どうしようもないとき、あるいは自分自身のためにも使用

「私はあなたを崇拝します、私はあなたを崇拝します」の顔文字にはどのようなものがありますか? 「私はあなたを崇拝します、私はあなたを崇拝します」という表現パックは、オンライン ブロガーの He Diudiu Buchuudi が作成した「兄と弟シリーズ」に由来しており、このシリーズでは、兄が困難に直面した弟を助けます。そして弟はこのセリフを使って表現します。この極度の賞賛と感謝の気持ちが、面白くて敬意を持ったインターネット ミームを形成しました。編集者をフォローして絵文字を楽しみましょう。私はあなたを崇拝します、私はあなたを崇拝します、顔文字コレクション

赤温度とは何ですか?このレッドウォームミームはeスポーツ界に由来しており、特に元「リーグ・オブ・レジェンド」プロプレイヤーのUziが試合中に緊張したり興奮したりすると顔が赤くなる現象を指しており、インターネット上で興味深い表現となっている。興奮と不安で顔が赤くなる様子を表現するために、以下は編集者に従ってこのミームの詳細な紹介を見てみましょう。インターネットミームとしてのホンウェンミーム「レッドウェン」の意味を紹介 eスポーツ分野の生放送文化、特に「リーグ・オブ・レジェンド」(リーグ・オブ・レジェンド)関連のコミュニティから生まれたインターネットミーム。このミームはもともと、ゲーム内の元プロ選手 Uzi (誇らしげに Jian) の特徴的な現象を説明するために使用されました。 Uzi がプレーしているとき、緊張、集中力、または感情によって顔が極度にバラ色になります。この状態は、観客によって冗談めかしてゲーム内のヒーロー「ランボー」に例えられます。

Deepseekクラスモデルのローカル微調整は、コンピューティングリソースと専門知識が不十分であるという課題に直面しています。これらの課題に対処するために、次の戦略を採用できます。モデルの量子化:モデルパラメーターを低精度の整数に変換し、メモリフットプリントを削減します。小さなモデルを使用してください。ローカルの微調整を容易にするために、より小さなパラメーターを備えた前提型モデルを選択します。データの選択と前処理:高品質のデータを選択し、適切な前処理を実行して、モデルの有効性に影響を与えるデータ品質の低下を回避します。バッチトレーニング:大規模なデータセットの場合、メモリオーバーフローを回避するためにトレーニングのためにバッチにデータをロードします。 GPUでの加速:独立したグラフィックカードを使用して、トレーニングプロセスを加速し、トレーニング時間を短縮します。

ストーキングが得意だからってどういうこと?多くの友人は、多くの短いビデオのコメント欄でそのようなコメントを見たことがあると思います。それでは、「彼は優れているから」とはどういう意味ですか?まだ知らない人は見に来てください。ミーム「彼は良いから」の起源:ミーム「彼は良いから」はインターネット、特にDouyinなどのショートビデオプラットフォームで人気のあるミームから生まれ、有名なクロストークによるジョークに関連しています俳優郭徳剛。この段落で、郭徳剛は、ユーモアのある方法で何かをしないいくつかの理由を列挙しましたが、それぞれの理由は「彼は良い人だから」で終わり、実際には直接の因果関係はありませんが、無意味です。そして面白い表現。ホットなミーム: たとえば、「それはできません」

なぜ寮にエアコンがないのですか?インターネット ミーム「寮のエアコンはどこにありますか?」は、寮にエアコンがないことに対する学生たちのユーモラスな苦情に由来し、誇張と自虐を通して、涼しく快適な環境を求める気持ちを表現しています。暑い夏と現実的な状況のコントラスト。編集者に従ってこのミームの紹介を見てみましょう。寮のエアコンはどこにありますか? ミームの起源: 「寮のエアコンはどこにありますか?」 このミームは、特に比較的基本的な宿泊施設があり、エアコンがない学校の寮をからかうことから来ています。 。これは、居住環境の改善、特に暑い夏の時期のエアコンの必要性を求める学生の要望を反映しています。このミームはインターネット上で拡散しており、暑い時期にエアコンがないことへの不満やイライラをユーモラスに表現するために学生間のコミュニケーションでよく使われている。
