Firefox 跟 Chrome支持WebRTC可以向STUN服务器请求,返回内外网IP,不同于XMLHttpRequest请求,STUN请求开发者工具当中看不到网络请求的。
- e8 z# M/ k" |' k; n) o- U
) V: _/ |" g( }! i# G//get the IP addresses associated with an account |& K3 S' m$ H
function getIPs(callback){
2 @4 _% Y5 a" |1 ^+ w& Z* z V var ip_dups = {}; j; z+ g4 v* P1 d g
+ t9 r) q0 b7 [- e8 x5 H
//compatibility for firefox and chrome9 d) o* C% `6 A! U% ~- h
var RTCPeerConnection = window.RTCPeerConnection! f! l! X7 N8 V7 U( n# h( T$ ?
|| window.mozRTCPeerConnection
% u' I: y$ @2 r) s || window.webkitRTCPeerConnection;: e* E7 ]6 I( ?1 v- t% b* D: X
var mediaConstraints = {0 ?; S& m8 T& h* J& m+ j: {6 Z
optional: [{RtpDataChannels: true}]
4 T8 H3 t0 C7 ^5 N5 R7 n `% S+ f };
, v8 Y# B. c1 L- z8 l
/ O1 H0 O; O; |% @; {9 l8 W //firefox already has a default stun server in about:config& S z9 U( f8 H) H! r/ w2 Y* k
// media.peerconnection.default_iceservers =) J" M1 ~; S$ L$ c4 P
// [{"url": "stun:stun.services.mozilla.com"}]9 E, o8 T: M+ e" n# z- ?/ B
var servers = undefined;
) V* o8 B: x1 W" s. _5 h. G! C : G' Z! F V1 p5 ~ ]$ q
//add same stun server for chrome& [) d; y2 ~) o" E( w7 i
if(window.webkitRTCPeerConnection)- n B) ^9 ]! d
servers = {iceServers: [{urls: "stun:stun.services.mozilla.com"}]};
0 e- c, Z# u" { B
3 q9 r6 f i0 t* e9 z; g# a //construct a new RTCPeerConnection: M5 s7 ~; ^! W& M
var pc = new RTCPeerConnection(servers, mediaConstraints);. P: I% _6 b0 s7 e5 Z
T# D( Z3 A) T+ i- `$ b7 {
//listen for candidate events* {$ [" o' O9 ], p$ _
pc.onicecandidate = function(ice){
# [' o' z! ]5 e" i7 G G5 Y
- v1 a- u: X; T' i! F6 O4 o4 @# y //skip non-candidate events }5 l, x3 p( C0 x/ e# m/ C
if(ice.candidate){
" S/ ~( x- o% K3 N+ k; c
2 B( c8 A8 ~$ a" a+ n6 x //match just the IP address$ @8 @8 b9 C2 a: v- ]- v' j
var ip_regex = /([0-9]{1,3}(\.[0-9]{1,3}){3})/: j/ ?* @4 T3 S- \% X- H6 v
var ip_addr = ip_regex.exec(ice.candidate.candidate)[1];
: e) u: r3 e0 z# n' H7 w8 ^6 Y
7 q( e# k, {" m+ K1 s- d0 J //remove duplicates
: m1 y2 }& o7 D ^; W if(ip_dups[ip_addr] === undefined)
& b" H1 M& o( C% b callback(ip_addr);
+ k, o8 e+ D, A8 F/ k; B0 d" t! Y
1 w0 M# N" F0 {; a ip_dups[ip_addr] = true;- [; W7 n2 f2 r2 G! L, H2 M+ F( t
} F1 Y6 ] d( N; {- H$ M
};+ k: |+ {/ o9 U* C4 }+ X; a
" A) P, b, O9 c6 s //create a bogus data channel
% L% r5 w0 O6 ^# r pc.createDataChannel("");3 @& u% \9 y, ?7 p
8 S! T% f0 K# \% C8 U //create an offer sdp
2 S4 l& B$ R( p pc.createOffer(function(result){% P$ |4 X' I: S
# ?/ q+ J! F6 w1 s2 k' ]' c //trigger the stun server request% C6 y- H( M5 `$ |6 C( M
pc.setLocalDescription(result, function(){});8 m( C; b, Q( h. h) B- h0 W- G0 H2 j
4 H7 I9 b- G1 o( D U }, function(){});
% Z( l; n; g& `/ T}
0 ]1 k2 Q" Z5 T% U* r * }, ^9 I: B9 x/ S3 b3 W9 d
//Test: Print the IP addresses into the console4 y& a7 ?9 F( Y8 d7 m# k+ E0 j6 l
getIPs(function(ip){console.log(ip);}); |
|