显示客户端IP的详细信息
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

189 lines
4.5 KiB

const iso3166 = require('./iso3166').init()
const china_keyword = Object.keys(iso3166['中国'])
const countryfix_list = require('./countryfix').init()
const areafix_list = require('./areafix').init()
const isp_list = require('./isp')
const owner_list = require('./owner').init()
const specialfix = require('./special')
const preformat = require('./preformat').init()
/**
* 进行市级粒度匹配
*/
const city_match = (result, country, area, citys) => {
if (citys.length) {
for (const city of citys) {
if (area.includes(city)) {
result.city_name = city
return result
}
}
} else {
const regions = iso3166[country]
for (let [region, value] of Object.entries(regions)) {
for (let city of value) {
if (area.includes(city)) {
result.region_name = region
result.city_name = city
return result
}
}
}
}
}
module.exports = (country, area) => {
const result = {
country,
area,
country_name: '',
region_name: '',
city_name: '',
owner_domain: '',
isp_domain: ''
}
/**
* 数据库预匹配
*/
if (preformat.has(`${country}|${area}`)) {
const info = preformat.get(`${country}|${area}`)
result.country_name = info.country_name
result.region_name = info.region_name
result.city_name = info.city_name
result.owner_domain = info.owner_domain
result.isp_domain = info.isp_domain
return result
}
/**
* 去除数据中存在的空格字符,避免干扰判断
*
* { country: '马来西亚', area: ' CZ88.NET' } ->
* { country: '马来西亚', area: 'CZ88.NET' } ->
*/
country = country.trim()
area = area.trim()
/**
* 根据关键词修正中国地区标注
*
* { country: '内蒙古通辽市开鲁县', area: '联通' } ->
* { country: '中国', area: '内蒙古通辽市开鲁县 联通' }
*/
if (!iso3166[country]) {
for (const keyword of china_keyword) {
if (country.includes(keyword)) {
area = country + ' ' + area
country = '中国'
break
}
}
}
/**
* 修正国家字段命名不规范的数据
*
* { country: '华中科技大学韵苑公寓15栋', area: '623' } ->
* { country: '中国', area: '湖北省武汉市 华中科技大学韵苑公寓15栋 623' }
*/
if (countryfix_list[country]) {
let info = countryfix_list[country]
country = info[0]
if (info.length === 2) area = info[1] + ' ' + area
}
/**
* 处理高校教育网教育网
*
* { country: '中国', area: '湖北省宜昌市 三峡大学电子阅览室' } ->
* { country: '中国', area: '湖北省宜昌市 三峡大学电子阅览室(教育网)' } ->
*/
if (country === '中国' && area.includes('大学') && !area.includes('网吧')) {
area += '(教育网)'
}
/**
* 修正区域字段存在混淆的数据
*
* { country: '江苏省宿迁市沭阳县', area: '上海南路(农机校对面)凌云网吧' } ->
* { country: '江苏省宿迁市沭阳县', area: '凌云网吧' }
*/
if (areafix_list[area]) {
area = areafix_list[area]
}
/**
* 进行国家粒度匹配
*/
if (iso3166[country]) {
result.country_name = country
result.region_name = country
}
/**
* 进行省级粒度匹配
*/
let citys = []
if (iso3166[country]) {
const regions = iso3166[country]
for (const [region, value] of Object.entries(regions)) {
if (region !== country && area.includes(region)) {
result.region_name = region
citys = value
break
}
}
}
/**
* 进行市级粒度匹配,深度匹配
*/
if (iso3166[country]) {
city_match(result, country, area, citys)
}
/**
* 进行特殊修正
*/
specialfix(result)
/**
* 进行运营商匹配
*/
const isps = isp_list[`${result.country_name}-${result.region_name}`]
|| isp_list[result.country_name]
|| []
for (const isp of isps) {
if (area.includes(isp)) {
result.isp_domain = isp
break
}
}
/**
* 进行服务持有方匹配
*/
let owners = owner_list[`${result.country_name}-${result.region_name}`]
|| owner_list[result.country_name]
|| []
owners = {...owners, ...owner_list['*']}
for (const [owner, value] of Object.entries(owners)) {
if (area.toLowerCase().includes(owner)) {
result.owner_domain = value
break
}
}
/**
* 数据兜底
*/
if (result.country_name === '') {
result.country_name = country
result.region_name = area
}
return result
}