mirror of https://github.com/dnomd343/echoIP
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
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
|
|
}
|
|
|