于一些需要,我們需要獲取本地IP地址,可以采用多種方式來得到我們想要的。
方法一:使用命令行
方法二:使用 PowerShell
方法一:使用終端
方法二:使用命令行工具(例如ip命令)
以上操作和Windows類似,不詳細(xì)附圖
方法一:使用網(wǎng)站
這方法會(huì)比較簡(jiǎn)單粗暴,直接得到想要的,而不用去操作一些繁瑣的步驟。
方法二:使用API:
import requests
response=requests.get('https://api.ipify.org?format=json')
ip_data=response.json()
external_ip=ip_data['ip']
print("External IP Address:", external_ip)
這些方法可以幫助您輕松地獲取本地IP地址和外網(wǎng)IP地址,以供您在文章中使用。請(qǐng)注意,在某些情況下,您的外網(wǎng)IP地址可能會(huì)動(dòng)態(tài)變化,特別是在使用基于動(dòng)態(tài)IP的互聯(lián)網(wǎng)服務(wù)提供商時(shí)。
教程結(jié)束,感謝支持,更多學(xué)習(xí)請(qǐng)關(guān)注!
地存儲(chǔ)
1 本地存儲(chǔ)簡(jiǎn)介
在客戶端存儲(chǔ)數(shù)據(jù)
HTML5 提供了兩種在客戶端存儲(chǔ)數(shù)據(jù)的新方法:
localStorage - 沒有時(shí)間限制的數(shù)據(jù)存儲(chǔ)
sessionStorage - 針對(duì)一個(gè) session 的數(shù)據(jù)存儲(chǔ)
之前, 這些都是由 cookie 完成的。但是 cookie 不適合大量數(shù)據(jù)的存儲(chǔ), 因?yàn)樗鼈冇擅總€(gè)對(duì)服務(wù)器的請(qǐng)求來傳遞, 這使得 cookie 速度很慢而且效率也不高。
HTML5 使用 JavaScript 來存儲(chǔ)和訪問數(shù)據(jù)。
2 語法
localStorage 方法存儲(chǔ)的數(shù)據(jù)沒有時(shí)間限制。第二天、第二周或下一年之后, 數(shù)據(jù)依然可用。
localStorage 和sessionStorage分別是本地存儲(chǔ)和會(huì)話存儲(chǔ), 統(tǒng)稱本地存儲(chǔ)。
存儲(chǔ)數(shù)據(jù):localStorage.setItem('key','value');
讀取數(shù)據(jù):localStorage.getItem('key')
刪除指定數(shù)據(jù):localStorage.removeItem('key');
清空所有數(shù)據(jù):localStorage.clear()
<!DOCTYPE html>
<html lang="zh">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>Document</title>
</head>
<body>
<!--
本地存儲(chǔ)存在自己電腦上了 他不能和服務(wù)器交互
一種:本地存儲(chǔ)(永久存儲(chǔ)不會(huì)過期)localStorage
一種:臨時(shí)會(huì)話(頁面關(guān)閉數(shù)據(jù)就沒了)sessionStorage
統(tǒng)稱本地存儲(chǔ)
二者的方法一毛一樣 咱們只以一個(gè)舉例子
cookie->可以喝服務(wù)器交互 是可以設(shè)置過期時(shí)間的
-->
<script type="text/javascript">
console.log(localStorage)
console.log(sessionStorage)
//寫入東西(隨便寫,你存儲(chǔ)的值)
//localStorage.setItem(key(小卡片),value(你存的包))
localStorage.setItem("key001","梁永燦");
localStorage.setItem("key002","迪麗熱巴");
localStorage.setItem("key003","楊穎");
localStorage.setItem("key004","大黃");
localStorage.setItem("key004","小黃");
//讀取
console.log(localStorage.getItem("key001"))
//console.log(localStorage)
//刪除
localStorage.removeItem("key001");
//全部刪除
localStorage.clear()
</script>
</body>
</html>
本地存儲(chǔ)數(shù)據(jù)庫會(huì)自動(dòng)的為每一個(gè)網(wǎng)站(IP地址)建立一個(gè)獨(dú)立的表格, 在同一個(gè)網(wǎng)站(IP地址)下數(shù)據(jù)是可以共享的, 但是不能跨域。
不能跨瀏覽器存儲(chǔ), 每個(gè)瀏覽器都有自己的小數(shù)據(jù)庫, Chrome存儲(chǔ)的, 火狐看不見。
localStorage是簡(jiǎn)單的數(shù)據(jù)庫, 沒有查詢功能, 不能用sql操作, 只能簡(jiǎn)單的存儲(chǔ)、讀取k-v對(duì)。
sessionStorage 瀏覽器窗口一旦關(guān)閉, 數(shù)據(jù)就丟失了
localStorage存儲(chǔ)的數(shù)據(jù), 永遠(yuǎn)不丟失, 關(guān)機(jī), 重啟都不會(huì)導(dǎo)致數(shù)據(jù)丟失, 除非清除了瀏覽器記錄
注意: 判斷l(xiāng)ocalStorage和sessionStorage是否有數(shù)據(jù)使用if直接判斷
if(localStorage.getItem("key001")){
}
不能使用
我們經(jīng)常會(huì)有需求,希望能獲取的到當(dāng)前用戶的IP地址,而IP又分為公網(wǎng)ip(也稱外網(wǎng))和私網(wǎng)IP(也稱內(nèi)網(wǎng)IP),IP地址是IP協(xié)議提供的一種統(tǒng)一的地址格式,每臺(tái)設(shè)備都設(shè)定了一個(gè)唯一的IP地址”,從而確保了用戶在連網(wǎng)的計(jì)算機(jī)上操作時(shí),能夠快速地從互聯(lián)網(wǎng)中找到自己所需的對(duì)象。
1,外網(wǎng)IP是全球唯一的IP地址,僅分配給某一臺(tái)網(wǎng)絡(luò)設(shè)備。內(nèi)網(wǎng)IP是由路由器分配給每一臺(tái)設(shè)備內(nèi)部使用的IP地址;
2,外網(wǎng)IP任何一臺(tái)設(shè)備都可以ping通。內(nèi)網(wǎng)IP只有在同一環(huán)境的內(nèi)部設(shè)備才能ping通;
3,外網(wǎng)用戶無法直接訪問到內(nèi)網(wǎng)用戶,內(nèi)網(wǎng)用戶可以訪問外網(wǎng)用戶,因?yàn)閮?nèi)網(wǎng)的所有用戶都是通過同一個(gè)外網(wǎng)IP進(jìn)行上網(wǎng)的;
這里我們可以借助現(xiàn)成的接口,搜狐提供的一個(gè)JS接口獲取IP地址,我們只需在入口index.html中直接引入該接口即可輕松獲取到當(dāng)前用戶的外網(wǎng)ip,Vue中在public中的index.html中引入接口,然后再需要獲取的地方通過returnCitySN['cip']即可拿到IP地址,然后將IP存到localstorage或者Vuex中,這樣隨時(shí)可以調(diào)用了。
//引入JS <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script> //在組件中獲取,可以選擇在首頁載入前獲取該參數(shù) var Ip=returnCitySN['cip'] localStorage.setItem('Ip', Ip)
獲取內(nèi)網(wǎng)IP相對(duì)來說會(huì)復(fù)雜些,畢竟沒有現(xiàn)成的接口可以調(diào)用,這里我們用到了WebRTC(網(wǎng)頁即時(shí)通信),在WebRTC規(guī)范中,RTCPeerConnection可以用于視頻流/音頻流、以及數(shù)據(jù)的傳輸。這里們通過RTCPeerConnection 對(duì)象建立一個(gè)連接通道,下面3個(gè)或?qū)ο笫轻槍?duì)不同瀏覽器來創(chuàng)建的。
var RTCPeerConnection=window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection;
當(dāng)RTCPeerConnection對(duì)象存在時(shí),我們就可以實(shí)例化該對(duì)象并創(chuàng)建一個(gè)可以發(fā)送任意數(shù)據(jù)的數(shù)據(jù)通道,此時(shí)我們的RTCPeerConnection對(duì)象中數(shù)據(jù)基本都是null。
var RTCPeerConnection=window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection; if (RTCPeerConnection) (()=>{ var rtc=new RTCPeerConnection() rtc.createDataChannel(''); //創(chuàng)建一個(gè)可以發(fā)送任意數(shù)據(jù)的數(shù)據(jù)通道 })()
SDP 是一種會(huì)話描述格式 ,由許多文本行組成,文本行的格式為<類型>=<值>,<類型>是一個(gè)字母,<值>是結(jié)構(gòu)化的文本串。SDP中包含了很多媒體信息,包括了媒體類型(video)、傳輸協(xié)議(RTP/UDP/IP)、媒體格式(H.264 video)、多播或單播地址和端口、本端的帶寬信息、本端的加密信息等。
我們從要做的就是從SDP中拿到傳輸協(xié)議中的信息,創(chuàng)建一條sdp數(shù)據(jù)并將數(shù)據(jù)存入LocalDescription對(duì)象中。這樣我們?cè)贚ocalDescription中就得到了所有的SDP數(shù)據(jù),從下圖中我們可以看到有IP地址在里面,接下來就可以從sdq中提取ip地址了。
rtc.createOffer( offerDesc=> { //創(chuàng)建并存儲(chǔ)一條sdp數(shù)據(jù) rtc.setLocalDescription(offerDesc) }, e=> { console.warn(e)})
onicecandidate屬性在RTCPeerConnection實(shí)例上發(fā)生icecandidate事件時(shí)要調(diào)用的函數(shù),當(dāng)我們向服務(wù)器發(fā)送消息時(shí)觸發(fā)并獲取到SDP中的candidate屬性,而candidate中正好有我們想要的IP地址,你可以直接獲取var ip_addr=evt.candidate.address。當(dāng)然你也可以從candidate屬性中獲取,不過這里就會(huì)復(fù)雜點(diǎn),用個(gè)正則來提取吧(顯然方法一簡(jiǎn)單)。
rtc.onicecandidate=(evt)=> { //監(jiān)聽candidate事件 if (evt.candidate) { //方法一: var ip_addr=evt.candidate.address //方法二: let ip_rule=/([0-9]{1,3}(\.[0-9]{1,3}){3}|[a-f0-9]{1,4}(:[a-f0-9]{1,4}){7})/. var ip_addr=ip_rule.exec(evt.candidate.candidate)[1] console.log("ip_addr==",ip_addr) }}
最后整理下代碼,封裝成一個(gè)方法需要的時(shí)候直接調(diào)用即可,通過localStorage來存儲(chǔ)獲取到的ip_addr(或者Vuex存儲(chǔ)),然后我們只需要通過localStorage.getItem('ip_addr'))就可以獲取到我們的內(nèi)網(wǎng)IP地址了。
getUserIP(){ var RTCPeerConnection=window.RTCPeerConnection || window.webkitRTCPeerConnection || window.mozRTCPeerConnection; if (RTCPeerConnection) (()=>{ var rtc=new RTCPeerConnection() rtc.createDataChannel(''); //創(chuàng)建一個(gè)可以發(fā)送任意數(shù)據(jù)的數(shù)據(jù)通道 rtc.createOffer( offerDesc=> { //創(chuàng)建并存儲(chǔ)一個(gè)sdp數(shù)據(jù) rtc.setLocalDescription(offerDesc) }, e=> { console.log(e)}) rtc.onicecandidate=(evt)=> { //監(jiān)聽candidate事件 if (evt.candidate) { var ip_addr=evt.candidate.address localStorage.setItem('ip_addr',ip_addr) }} })() else{console.log("目前僅測(cè)試了chrome瀏覽器OK")} }
歡迎關(guān)注本人的公眾號(hào):編程手札,文章也會(huì)在公眾號(hào)更新
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。