js提取指定网站内容(日本秋名山飙车的时候有没有见过这些域名,你知道吗?)
优采云 发布时间: 2022-04-10 05:25js提取指定网站内容(日本秋名山飙车的时候有没有见过这些域名,你知道吗?)
背景
最近的项目中,需要获取url的主域名。例如,它需要获取。看起来很简单。aichi.jp 等,这些都无法通过这种简单的取最后两位数的方法得到,似乎只能枚举。
公共后缀列表
这个问题想必早就遇到过,所以各界有识之士为大家准备了一份完整的清单,全都是那些精彩的域名,还有一些jp域名也让我长了不少见识,我不知道各位老司机们在秋明山赛车的时候有没有看到这些域名:
秋田.jp
群馬.jp
香川.jp
高知.jp
鳥取.jp
鹿児島.jp
// jp geographic type names
// http://jprs.jp/doc/rule/saisoku-1.html
*.kawasaki.jp
*.kitakyushu.jp
*.kobe.jp
*.nagoya.jp
*.sapporo.jp
*.sendai.jp
*.yokohama.jp
!city.kawasaki.jp
!city.kitakyushu.jp
!city.kobe.jp
!city.nagoya.jp
!city.sapporo.jp
!city.sendai.jp
!city.yokohama.jp
// 4th level registration
aisai.aichi.jp
感兴趣的朋友可以看看这个github项目:.
以下是各种主要域的列表:
其实浏览器也内置了类似的东西,用于域名判断、cookie存储等事情。
请问问题
问题好像解决了,有现成的脚本可以搞定,但是仔细看,脚本有近200K,而我自己的脚本只有10K。既然浏览器内置了pls,那么浏览器会暴露内置接口吗?毛呢布?可惜我没搜,而且浏览器这么多,就算chrome暴露了,IE肯定不暴露等等。刚才好像我们说浏览器是用来做域名判断和cookie存储的,所以可以我们用这个方法?间接调用内置的 pls 怎么样?
最终解决方案
目前我想到了两种间接调整的方式,document.doamin和document.cookie。经过测试,你会发现如果尝试设置当前域名为或者设置cookie,浏览器不会生效,document.domain第二次设置,firefox会报错,好像没有非常适合,可能或多或少会影响业务。cookie很容易设置和清除,上面的代码:
function getMainHost() {
let key = `mh_${Math.random()}`;
let keyR = new RegExp( `(^|;)\\s*${key}=12345` );
let expiredTime = new Date( 0 );
let domain = document.domain;
let domainList = domain.split( '.' );
let urlItems = [];
// 主域名一定会有两部分组成
urlItems.unshift( domainList.pop() );
// 慢慢从后往前测试
while( domainList.length ) {
urlItems.unshift( domainList.pop() );
let mainHost = urlItems.join( '.' );
let cookie = `${key}=${12345};domain=.${mainHost}`;
document.cookie = cookie;
//如果cookie存在,则说明域名合法
if ( keyR.test( document.cookie ) ) {
document.cookie = `${cookie};expires=${expiredTime}`;
return mainHost;
}
}
}
在pls中拉了差不多几十个域名,跑单元测试,没有问题。