WebRTC获取IP地址问题,Uncaught TypeError: Cannot read property '1' of null
WebRTC获取IP地址问题,Uncaught TypeError: Cannot read property '1' of null
临时接了个任务,客户要求某个账号只能在某个ip或者mac上登录,其余的情况的登录都要报错,首先就要解决看看怎么获取ip
使用的获取IP的语句如下,类似的在网上很多,主要的获取的逻辑都是一样的
<script>
// 创建 RTCPeerConnection 对象
const peerConnection = new RTCPeerConnection();
// 添加一个空的数据通道
peerConnection.createDataChannel('dummy');
// 创建一个 ICE 候选对象
peerConnection.onicecandidate = (event) => {
if (event.candidate) {
// 提取 IP 地址信息
//const ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3})/;
const ipRegex = /([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/;
console.log("event.candidate.candidate :" + event.candidate.candidate);
//candidate:3088297775 1 udp 2113937151 4b52bd75-3d6f-4c7b-8bea-394c6d2a14d3.local 60294 typ host generation 0 ufrag mKXg network-cost 999
const ipAddress = ipRegex.exec(event.candidate.candidate)[1];
// 输出 IP 地址
console.log('IP 地址:', ipAddress);
// 关闭连接
peerConnection.close();
}
};
// 创建一个 SDP(Session Description Protocol)提议
peerConnection.createOffer().then((offer) => {
// 设置本地描述
return peerConnection.setLocalDescription(offer);
}).catch((error) => {
console.error('创建 Offer 失败:', error);
});
</script>
但是在edge和Chrome上执行的时候会报错,提示
Uncaught TypeError: Cannot read property '1' of null
因为说实话不是很熟悉前端,但是大概能猜到是null导致的
那么就去找是哪里null了
很快就发现,貌似那个正则并没有匹配到数据,所以要不是匹配的规则有问题,要不就是要匹配的内容有问题
很快发现,candidate的内容中并没有ip类型的数据,反而有一个.local
在网上查了一下,发现就是这部分的问题,原因是浏览器做了相应的设置,但是很难受,因为这种操作不适用我这种系统要给客户使用的情况,总不能每个人都要改设置才可以
只能另寻他路
PS:
可以使用这个网址进行查询
https://whois.pconline.com.cn/ipJson.jsp?callback=ipJson
和
https://api.ipify.org?format=jsonp&callback=getIP
但是我试了下,查出来的地址是准的,但是实际的ip有出入,建议自己多试试
参考:
https://blog.csdn.net/weixin_43915401/article/details/111830699
您能读到这儿,我呢是发自真心的感谢您,若要转载,还望请您带上链接