Firefox 跟 Chrome支持WebRTC可以向STUN服务器请求,返回内外网IP,不同于XMLHttpRequest请求,STUN请求开发者工具当中看不到网络请求的。
& q5 v" Y% C6 f+ I. Y8 o! @, B O4 }# \- _) @6 x, Y6 u& \9 {5 d
//get the IP addresses associated with an account) ?+ y# T) @- o8 O8 M) @
function getIPs(callback){
: k% ^- _; P) @1 A var ip_dups = {};
' Y$ U. x2 [5 G+ I+ {. u! h
7 I' {7 N$ B: F' [* D //compatibility for firefox and chrome6 e9 A1 E9 s- D m6 j( T: H
var RTCPeerConnection = window.RTCPeerConnection1 L& `9 p! x8 t F: A6 H ~& V
|| window.mozRTCPeerConnection
6 _% @ N7 Q' i# i8 o4 I4 A || window.webkitRTCPeerConnection;
5 u+ c, P5 x U+ e7 r! t2 l3 K var mediaConstraints = { b9 @( P6 D* |+ O/ d& c
optional: [{RtpDataChannels: true}]
9 I. J( v" S# L9 T };0 b( v; ~! Y8 Q7 ~. \( V0 Z3 E
* Y$ I6 [' }& x: Y; y7 h1 |" @ //firefox already has a default stun server in about:config
6 p% c; F+ H- E; Y7 E/ ` // media.peerconnection.default_iceservers =3 \ {1 v% s' w% b& q1 D5 I
// [{"url": "stun:stun.services.mozilla.com"}]
6 ~* X1 b! V7 Q0 q. w O var servers = undefined;
8 y) x& g9 u2 {5 a X
7 n. D2 z8 Q [5 z4 _1 c+ \ //add same stun server for chrome5 b0 ^' g) i/ f9 J; S
if(window.webkitRTCPeerConnection)( G! _) S. \) o7 C5 L
servers = {iceServers: [{urls: "stun:stun.services.mozilla.com"}]};, ?3 N; Z3 h9 ^' R- L7 _/ c
! }3 F% Z+ Z9 C1 n$ ~1 J7 x
//construct a new RTCPeerConnection
; O6 c6 k2 g a; s) D" z var pc = new RTCPeerConnection(servers, mediaConstraints);/ O; z* T, [. S1 {
% @. K% c% }9 H //listen for candidate events
% @( U# `: z- W) N pc.onicecandidate = function(ice){
! Y& R) O* e" w% |* L ' I) y" X6 Y+ H1 W' N, t% |
//skip non-candidate events5 v) t" p. P/ m5 _5 |4 S. m
if(ice.candidate){) M% g X; E7 e3 v4 N
3 O ^4 \. k: q9 c& p //match just the IP address
7 i1 T' W9 f3 x% u var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3})/
* L# Q0 i* l/ O. t) c var ip_addr = ip_regex.exec(ice.candidate.candidate)[1];3 g5 R: y5 J. E, l4 k1 x1 H
& k3 `% {" j5 N* E //remove duplicates4 R: u- V; W3 V# q% J2 T% c4 X3 t
if(ip_dups[ip_addr] === undefined)$ O! ^, `2 b# F
callback(ip_addr);
4 h6 l" f/ y# W+ C* X/ k6 e7 G: W2 w
9 ]% P6 h* G, A, w- C+ Z( i g ip_dups[ip_addr] = true;0 p% j5 P! [$ l# `8 v' w0 D V
}
& U& U6 Z; G8 o& F ^( f };6 o3 I2 P2 a. K. }; I( U8 u$ f
) y% [9 Y# v3 L0 ? //create a bogus data channel
0 |3 ^' S0 ^+ ` z pc.createDataChannel("");
0 X2 @" q8 X# a2 f; @
5 M& T# g+ |6 P2 L: B //create an offer sdp3 w: [$ Z2 s. u B7 A" d
pc.createOffer(function(result){6 ?4 ~; p/ w& G/ I
* \' ~) y/ g t4 O% C9 {1 O
//trigger the stun server request
' m: v) `; h6 b: |/ ` pc.setLocalDescription(result, function(){});
# M1 Q" ?. C1 a. X: b + P5 c. r* }2 B. `% r; r# J0 {
}, function(){});: @; K. H$ z" Y7 d) |$ f8 a/ g$ }! C
}4 O6 J# x6 `- ?- Q e# C3 A5 r9 U/ G
! B3 E7 @2 A1 k) a% n//Test: Print the IP addresses into the console& P8 y r4 E& y: g6 R! d
getIPs(function(ip){console.log(ip);}); |
|