背景
最近有涉及要顯示ip屬地,但我想白嫖,結果就是白嫖的api接口太慢了,要延遲3到4秒左右,很影響體驗,而且不一定穩定。
結果突然看到了這個【ip2region】開源項目,離線識別ip屬地,精度自己測試了好多個國家和地區的ip,效果還可以,有98%的成功率。
源地址如下,有各種語言的版本:
ip2region原作者開源項目地址https://github.com/lionsoul2014/ip2region
?
實現
這里因為我的后端用的是node,就用node的代碼做示例
第一步 ,引入依賴
npm install ip2region --save
第二步,下載離線包
?
?下載完成后,進行解壓,然后把文件放到自己的項目目錄下,如下:
第三步,封裝工具類
以下代碼可直接復制使用,只需要看一下離線包的地址是否需要更改即可。
內置兩個函數:
getIpAddress:官方默認的獲取ip屬地方法格式
setIpAddress:我自己做的屬地格式優化處理
// 導入包
const Searcher = require('../ip2region-master/binding/nodejs/index')
// 指定ip2region數據文件路徑
const dbPath = '../ip2region-master/data/ip2region.xdb'/*** 獲取ip對應真實地址* @param ip ip地址* @returns {Promise<string>}*/
async function getIpAddress (ip) {try {// 同步讀取vectorIndexconst vectorIndex = Searcher.loadVectorIndexFromFile(dbPath)// 創建searcher對象const searcher = Searcher.newWithVectorIndex(dbPath, vectorIndex)// 查詢 await 或 promise均可,例子:data: {region: '中國|0|江蘇省|蘇州市|電信', ioCount: 2, took: 0.402874}let data = await searcher.search(ip)// ip屬地格式預處理data = setIpAddress(data.region)// 返回結果return JSON.stringify({code: 200,data: data})} catch (e) {// 返回錯誤return JSON.stringify({code: 500,data: e})}
}/*** ip屬地格式預處理* @param address ip屬地原格式* @returns {{country: string, province: string, city: string, type: string}}*/
function setIpAddress (address) {// 返回體let adrList = {country: '',province: '',city: '',type: ''}// 根據|分割成數組,然后依次賦值let list = address.split('|')adrList.country = list[0] !== '0' ? list[0] : ''adrList.province = list[2] !== '0' ? list[2] : ''adrList.city = list[3] !== '0' ? list[3] : ''adrList.type = list[4] !== '0' ? list[4] : ''// 返回結果,示例:{ country: '中國', province: '江蘇省', city: '徐州市', type: '移動' }return adrList
}// 測試
let ip = '223.107.4.177'getIpAddress(ip).then(res => {let data = JSON.parse(res)console.log(data)})
?測試效果
可以看到結果很快,只用了十幾ms,非常舒服,白嫖成功,在這里感謝原開源項目的作者!