私はどのようにフロントエンドのユーザーのIPを取得して、そしてIPによって地理的な位置付けを取得します

5298 ワード

皆さん、こんにちは.私はアイスティーです.まず物語を話しましょう.物語の経緯はこうです.
ある日、製品の同級生は突然、注文したユーザーの地理的な位置分布を手に入れたいと思って、ユーザー群の分布を統計して、さらに後期の地域別の正確な普及活動のために準備したいと思っていました.
  • me:これは簡単ですね.注文するとき、地理的な位置を要求して、ユーザーの位置を取得すればいいですね.そうすれば正確です.
  • 制品兄さん:この案は考えなければなりません.もしユーザーの位置付け情报を要求したら、まず、ユーザーの反感を引き起こすかもしれません.结局、私たちのこの制品は、最初から最後まで位置付けを使ったことがありません.突然パチパチと弾き窓が来ました.ユーザーはきっと1つは、最初から最後まで位置付け机能がないと言っています.位置付け権限が毛用で、2つはプライバシー意识が强いので、直接拒否しました.これでは直接情報が得られず、プリセットの効果は得られません.次に、私たちはユーザーを邪魔することを少なくすることができて、ユーザーを邪魔することを少なくして、ある言叶があって、こっそり村に入って、銃を撃つのは要りません.つまり、ユーザーがスムーズにプロセス全体を使用し、ユーザーが快適に使用できるようにするのは、ずっと私たちの原則です......
  • 制品兄:IPの位置付けがあると闻きましたが、これはとても爽やかで、ユーザーを邪魔しません.IPというものは、ユーザーが私たちのサービスにアクセスすれば、绝対にこれを手に入れることができます.私たちは彼のものを持って反调します.そうすれば、私たちの省市情报はこのように手に入ります.そして、このような成功率が高く、ユーザーが位置付けを拒否してデータの统计が不完全になる心配はありません.
  • バックエンドの学生:IPというものは确かにできますが、私たちのサービスはすべて負荷の均衡/逆エージェントサービスの后ろにあります.バックエンドが直接手に入れたIPもフロントエンドサーバーのIPで、ユーザーが私たちのフロントエンドサーバーのIPに直行するのではありません.だから、これは困ります.
  • バックエンドの学生:当初、私たちのプロジェクトがまだ前後に分離されていなかったとき、確かにIPを直接手に入れることができたと思います......
  • 他のフロントエンドの学生:ええ、私の側もいくつか知っています.私は前にフロントエンドがIPを取得する方法を見ました.
  • //  RTCPeerConnection  
    let conn = new RTCPeerConnection({
            iceServers: []
        }) 
    let noop = function(){}
    conn.onicecandidate = function(ice){
        if (ice.candidate){
            //      ip
            let ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/
            let ip_addr = ip_regex.exec(ice.candidate.candidate)[1];
            console.log(ip_addr)
            conn.onicecandidate = noop
        }
    }
    //           (channel)
    conn.createDataChannel('dog')
    //    SDP    
    conn.createOffer(conn.setLocalDescription.bind(conn),noop)
    
      :Illgo
      :https://www.zhihu.com/question/20675353/answer/335325619
      :  
            。             ,          。
    

    その後、 WebRTC IP などのキーワードで似たような文章をいくつか探しました.これは比較的全面的です.
    アクセス者イントラネットIPの取得
    似たような文章に基づいて、自分で実験したところ、2つの問題がありました.
  • 私たちは微信局の業務を持っていて、微信環境の下でIPを取得できません.この方法はChromeとFirefoxの下で使いやすいです.
  • はユーザのイントラネットIPを取得し,取得したIPで反査し,ローカルエリアネットワークアドレスであると結論した.

  • これまた毛糸の調べをして、そこで......この案はあきらめられた・・・
  • me:Googleでいくつかのシナリオを探しました.ほとんどのシナリオはフロントエンドを通じてインタフェースを呼び出し、インタフェースは地理的位置などの情報を返します.バックエンドの学生と一致して、ユーザーが要求すれば、サーバーは直接ユーザーのネット出口のIP情報を手に入れることができて、それからインタフェースを調整して調べることができます.バックエンドインタフェースがIPを受け取れない問題については、微信支払い側に似たような解決策があります.

  • 備考:ユーザーIPガイドを取得する
  • me:私たちのサーバーはエージェントの後ろに相当します.運維を探して配置すればいいはずです.
  • バックエンドの学生:これは考えられます.後で私の側と運維に連絡して、彼らの側に配置させて、ユーザーが代理サーバーに取得したIPを私の側に伝えてください.そうすればいいです.

  • そこで問題が解決して、大功を成し遂げました~
    冗談ですが、もしそうなら、この文章は出ません.
    実際の状況はこうです.
  • バックエンドの学生:構成に行けば、私たちのサーバーにはプロジェクトが配置されているだけでなく、構成の変更に大きな影響を与える可能性があります.
  • バックエンドの学生:次に、フロントエンドのこちらに1つあります.Net局は構成されています.この局は前と後の端が離れていないときに使用されています.今は静的ファイルを配置するために使用されていますが、ダイナミックコードの能力があります.この局で取得するのは簡単です.今も構成する必要はありません.

  • とにかく、この任務は、フロントエンドに落ちた.
    では、手元のリソースを整理してみましょう.IPを直接取得できるステーションと、IPに基づいて所在地域を調べることができるインタフェースです.
    なぜ既製のサービスを使わないのかと私に聞いた.主に信頼性の原因で、もしあなたが使っている外部サービスであれば、もしサービスが切れたら、1つはサービス業者が修復するまで待つしかなく、時効が長いかもしれません.もしサービス業者が道を走ったら、サービスを切り替えるのに苦労しなければなりません.二つ目は鍋を振ることができることです.
    次に、サービス側の実装を示します.この部分は主に2つの部分を含んでいます.
  • IP
  • を取得する.
  • IPが属する領域
  • をチェックする.
    まず、一般的なプロセッサ(.ashx)を新規作成します.次はコードリストです.
            /// 
            ///      IP  
            /// 
            /// 
            /// 
            public static string GetAddress(HttpRequest request)
            {
                //         
                string remoteAddr = request.ServerVariables["HTTP_X_FORWARDED_FOR"];
                if (string.IsNullOrEmpty(remoteAddr))
                {
                    //       ,                  IP
                    remoteAddr = request.ServerVariables["REMOTE_ADDR"];
                }
    
                if (!string.IsNullOrEmpty(remoteAddr)
                    && remoteAddr.IndexOf(",") != -1
                    && remoteAddr.Trim().Length > 6)
                    remoteAddr = remoteAddr.Split(',')[0].Trim();
    
                if (remoteAddr.Length > 15)
                    remoteAddr = GetIP4Address();
    
                return remoteAddr;
            }
            
            
            
            public static string GetIP4Address()
            {
                string IP4Address = String.Empty;
    
                foreach (IPAddress IPA in Dns.GetHostAddresses(HttpContext.Current.Request.UserHostAddress))
                {
                    if (IPA.AddressFamily.ToString() == "InterNetwork")
                    {
                        IP4Address = IPA.ToString();
                        break;
                    }
                }
    
                if (!string.IsNullOrEmpty(IP4Address))
                {
                    return IP4Address;
                }
    
                foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))
                {
                    if (IPA.AddressFamily.ToString() == "InterNetwork")
                    {
                        IP4Address = IPA.ToString();
                        break;
                    }
                }
    
                return IP4Address;
            }
            

    そして,フロントエンド呼び出しで露出したインタフェースを呼び出すと,必要な地理情報が得られる.フロントエンドリクエストの方法は一般的で、簡単なAjaxリクエストで、ここではプレゼンテーションをしません.
    その後、注文時に取得した省市情報を注文インタフェースに転送することで、フロントエンドユーザーのIPを取得し、IPに基づいて地理的な位置を取得する必要があります.
    では、本文はこれで終わります.一部のコードは後で追加します