0%

最近因为注册Spotify了解到了whoer这个网站,发现其可以检测到DNS服务器地址,觉得很好奇,所以查资料,这里梳理下实现原理。

https://static.1991421.cn/2022/2022-08-07-164940.jpeg

  1. whoer网站发起了一个CSS请求https://sdvtq1659862.ed.whrq.net/css/null.css?_=1659862263203

    这个域名是随机生成的子域名,文件名也可以看出是不存在的文件

  2. 因为该DNS本地肯定没有缓存,因此会一层层向上找,最终会指向whrq.net DNS服务器,根据查询请求,DNS服务器记录下了sdvtq1659862及来源DNS IP地址

  3. whrq将该信息同步给了站点服务,之后用户端会发起携带sdvtq1659862参数的请求,服务端即返回了DNS相关信息

    https://static.1991421.cn/2022/2022-08-07-165455.jpeg

综上,whoer是利用了DNS解析查询过程拿到了DNS服务器地址信息,因为DNS解析过程中上下文只有域名,因此动态域名解决了状态信息,利用子域名来区分各个用户。

综上即明白了whoer是如何做到的,延伸下其它字段是如何获得的,操作系统/浏览器版本,这些可以根据请求头UA字段拿到,而提供商则是可以根据IP地址去查。

done,原理即如此。

相关网站

最近在做WebShell下热键,整体方案这里总结下

方案

  1. 终端会话热键

    • 这里需要利用xterm.attachCustomKeyEventHandler回调函数解决
    • 使用注意,回调函数返回true即阻止默认行为,停止冒泡
  2. 页面热键

    • 推荐mousetrap包,该包对于跨平台环境增加了mod参数方便设定支持。mod键在苹果平台下即⌘,非苹果即Ctrl,这样可以一套热键配置,方便维护
    • 使用注意,回调函数返回false即阻止默认行为,停止冒泡

浏览器层面部分热键冲突

热键具体除了考虑表意化,还需要考虑网页所依托的浏览器下部分热键冲突。需要了解,浏览器部分热键无法通过JS脚本中阻止冒泡/缺省行为,但部分热键可以。

实际在Mac- Chrome下尝试后有以下结果。

可拦截热键

  • ⌘ F
  • ⌘ L
  • ⌘ P
  • ⌘ ,
  • ⌘ S
  • ESC

不可拦截热键

  • ⌘ N-创建新window
  • ⌘ T-创建新Tab
  • ⌘ W-关闭Tab

团队内部调研后决定,尽可能还是尊重用户在App下的一些热键习惯,部分不支持的,增加修饰键进行支持。

比如如果终端支持多tab,可以是⌘ ⇧ T

延伸

苹果平台判断

1
2
3

/Mac|iPod|iPhone|iPad/.test(navigator.platform)

Spotify算是出名的听歌软件,之前没用过,最近想找个好点的听歌App,决定切换到Spotify。这里记录下。

https://static.1991421.cn/2022/2022-07-30-224316.jpeg

说明

使用Spotify有一定门槛儿的,这里说明下。

  1. 受限国内网络环境,不走代理是无法正常使用的,推荐使用Surge/小火箭或者第三方VPN服务解决网络问题

  2. 听歌免费,但功能受限,想体验完整功能需要付费,个人对于优质服务且价格合理的不排斥,因此这点可以接受

    https://static.1991421.cn/2022/2022-07-30-224200.jpeg
  3. iOS上国区未上架,需有外区Apple ID解决app下载问题

接受并解决以上几点的,可以开始搞起。

注册

Spotify注册时会检测网络,走网络代理可能会提示错误信息你的帐号并未创建。你的设备似乎已连接至代理或VPN服务。请关闭此类服务,然后再试一次。直接原因是很多代理IP被打了标记,识别出是云厂商或爬虫之类的,因此就会被认定是代理。

https://static.1991421.cn/2022/2022-08-07-131456.jpeg

这里我走澳门朋友家里的VMess服务进行注册,推荐先使用https://whoer.net/检测下本地网络,确保IP显示地区为目标地区,ISP也正常不是某个云厂商之类的就行。DNS这里不要求,自测显示中国还是美国之类的都行

https://static.1991421.cn/2022/2022-07-30-225150.jpeg

不同地区代理的网络下,在对应国家的网页下进行账户注册,注意URL,比如

https://www.spotify.com/tw/signup

https://www.spotify.com/hk-zh/signup

https://www.spotify.com/us/signup

注册成功后就可以免费使用Spotify服务了。

使用

使用上有几个地方注意下

  1. Profile中可以进行地区修改设置,但前提是还没开启Premium会员订阅,这里我选择修改到菲律宾。
    • 只能切换到当前代理网络所在区域,比如走美国代理,就可以切换到美区,走菲律宾代理,就可以切换到非律宾区
    • 推荐LightNode vps,有提供菲律宾等节点服务器
  2. iOS版Spotify可以单独进行语言设定与系统语言设定无关
  3. 新注册账号,会免费提供十几天受限的会员服务,之后恢复到免费状态,有广告

会员

为了体验完整服务,推荐走家庭会员,其中以菲律宾区价格最低。当前我就选择的菲律宾区拼车(21CNY/季)。

有几点注意

  1. 加入家庭会员需要提供同区账户邮箱,不需要密码。邀请链接点击时网络环境当前不限,可以不是会员所在区,比如菲律宾家庭会员邀请链接可以在任意网络环境下点击加入。

  2. 邀请链接点击加入后提示输入会员所在区填写的家庭地址,这个由车主提供即可

  3. 如果不愿意跟他们拼车也可以考虑自己单买会员即可,下图可以看到非区最便宜

  4. 自己搞会员支付上有一定门槛儿,比如香港区支付必须使用香港支付手段,PayPal的话需要是PayPal香港账户,国内Visa卡不行。当前我还没解决支付,实在不行找拼车即可。

  5. iOS版不支持App内支付,推荐通过网页版订阅购买

https://static.1991421.cn/2022/2022-08-07-150914.jpeg

价格信息来自https://sspai.com/post/55367

缺点

Spotify整体使用上很棒,目前发现有个缺点是中文歌词不支持简体中文

其他音乐服务

  1. 网易云音乐,之前个人非常喜欢的,但是社交属性现在重了,且版权硬伤,所以放弃了
  2. QQ音乐,社交属性重,即使是会员还搞广告真不能忍,流氓,且听歌就听歌,默认还显示MV,直播之类的,很服气这产品经理,不再考虑
  3. Apple Music,搜歌太痛苦,比如中文名歌星不一定能搜到,必须得换成英文名,但不是每个名字都知道的,,当然还有别的硬伤,比如歌词不全,因此放弃
  4. YouTube Music,搜歌/歌词也是一堆硬伤,放弃

不得不说21世纪了,找个能用的听歌软件依然很难,目前看Spotify算是相对最优解了。

写在最后

流行必有原因,身边很多人使用该服务,这次体验后觉得确实不错,因此决定继续体验下去,

在利用xterm.js实现终端搜索高亮时需要能够识别终端当前是否在vi编辑器模式,调查后发现xterm.buffer.active.type可以用来实现。

查看对应类型定义发现值只有两种normal和alternate。不明白为什么叫alternate,所以进一步调查,原来这个概念来源于terminal下的alternate screen。这里整体介绍下。

https://static.1991421.cn/2022/2022-07-28-224538.jpeg

alternate screen-备用屏幕

  1. 该中文翻译采用苹果的中文翻译,xshell叫终端替换屏幕
  2. alternate screen是临时性交互输入内容的屏幕,最终还要返回。比如VI模式下,屏幕显示区域与正常模式一样,当激活备用屏幕时,原屏幕内容被保存,当退出备用屏幕时,源内容被恢复。
  3. 所以xterm下的normal/alternate概念并非是原创,而是终端本身的设计上就这两种模式,普通和备用

写在最后

xterm.js只是xterm的一种实现,为了更好的理解xterm.js还是需要多了解xterm-终端模拟器的一些设计。

相关文档

在查看项目时,发现一些项目尤其后端项目有个Makefile文件,这样一些构建命令可以方便的封装调用。

之前没了解过该工具,这里mark下。

特点

  1. Mac/Linux天然支持,这样声明创建后,直接执行即可
    • shell文件的话,还需手动增加执行权限chmod +x *.sh
    • 项目中使用nodejs实现构建工具也行,但是毕竟还有环境依赖
  2. 支持变量传参

举个例子

1
2
3
# 构建前端镜像 make build version=1.0.0
build:
docker build -t stacker/web:v$(version) .

比如封装如上命令到Makefile,以后想打包新镜像文件,直接make build version=1.0.0即可

语法说明

  • 文件名推荐为Makefile,但也可以是makefile
  • 只支持单行注释
  • @开头命令声明,表示该命令输出结果不打印

参考配置

  1. https://gitlab.com/gnachman/iterm2/-/blob/master/Makefile