Fragments 用于存放无法单独成文的碎片内容。未来将会与 Twitter Monitor 联动。
10:00 · 23 Mar, 2023
最近 Twitter 费尽心思在阻止用户和开发者匿名访问推文内容,尽管我在 nitter 的 issue 提出取得访客帐号并签名请求的方案,但在本篇我也提到过要运行这玩意需要大量的访客帐号,所以单打独斗可能不是一个好的办法。
压力大时我就会胡思乱想,想着能不能构建一个分布式的帐号池,由于 Twitter 客户端的请求统一采用 OAuth 签名,这一套方案甚至能在访客帐号彻底失效后继续由人工录入 userbot 的各种信息的方式延续下去。
架构我就参考 ZeroTier,总共分成三级:
- Planet,这个是中心节点,会保存属于自己的帐号池,通过录入添加的 userbot 在允许共享前也只会存在这里,下一层的节点会跟此节点共享帐号池;Planet 可以自由地允许或者移除下一级别的节点的连接;基于上一点,Planet 需要公网可访问。
- Node,Node 可以自由地选择连接到一个或多个 Planet,同一 Planet 下的 Node 会共享帐号池,Node 可以理解为一种基础设施,是所有人都能用的
- Leaf,叶节点专注于获得访客帐号,只能单向将获取到的访客帐号传输给 Node,一般用于没有公网ip的设备,如果设备能在公网访问,其实可以跟 Node 节点合并。
Planet 可以开放 API 供外部调用,发号顺序应该是 本机的访客帐号 > 同步来的访客帐号 > 本机的 userbot 帐号(如果开放)
这只是一个想法,还有很多不完善的地方,暂时想到的:
- 如何防止”串号“的情况发生?方案似乎没有解决这个问题。
- 存储方面我在考虑 SQLite,也许会有更好的方案?
- 通信用什么方式,长连接?WebSocket?还是别的,我不知道。如果一个 Planet 连接着大量的下一级节点,会不会因为这些连接拖慢整个系统的运行效率?
- 怎么防止恶意请求?如果每位 Planet 控制者都限制他人的连接这还叫不叫“分布式”?
- 如果将整个架构改成类似 bt 的架构,Planet 改成类似 Tracker,Node 之间共享访客帐号,这时 Twitter 偷偷也建立一个 Node 节点加进来,将所有的帐号都一网打尽时又该如何应对?
- 访客帐号有效期只有一个月,一个月后怎么同步删除?
当然啦,这只是我的一点想法,目前我还没有时间和精力去完善那些问题,甚至还没新建文件夹。
也许只是又一个在我的胡思乱想下的无用产物。
19:38 · 21 Aug, 2023
在两个月前的某一天,我就想到了我这个 blog 的标题栏的那个 の 很适合拿来替换成各种各样的元素,于是这个组件的雏形就出来了:
- 单字。因为 の 也是单字,这就意味着中间的元素需要尽量方正,否则切换时会让标题反复横跳,于是 emoji 就成了我的首选
- 扁平化。当时我看了 Android 和 iOS 自带的 emoji,感觉都不够平,于是选了微软的 fluent-emoji-flat,由于微软一向不自绘各种国旗,所以想要国旗的只能自己另找图标了
- 动画。直接切换太生硬了,加点动画是很有必要的
- 可筛选时间。目前我写了一套简单的方法来决定什么时候放什么 emoji,以后独立成组件时应该会用相关轮子来提高可玩性
至于怎么引入 svg,我试了好几种,目前的方案是 @iconify-json + @unocss,这并不是最优解,我还需要自己在 uno.config.ts
加 safelist
动画用了点奇技淫巧,本来我想像轮播图那样滚动,js 控制当前要显示的元素,css 控制动画,于是不同步的计时器就会导致动画跑完了图还没切最后一闪而过的问题,最后选择用 position: absolute
+ display: none
来让所有元素都堆在同一位置,再把进出的动画拆分,当下一个元素显示时当前元素会淡出,最后不透明度变 0
,从视觉上消失
19:45 · 15 Aug, 2023
前段时间心血来潮写 chāo 了个类似 Twitter 生日气球的组件,因为是 vue 组件所以这边也能玩,点卡片右下角的气球标就会放气球,鼠标移上去就可以戳爆了,气球跑完以后再点再放
跟原版有小改动以适应博客环境,未来会加入好玩的组件大包中。
- 调教水平有限,直接用原版左右飘关键帧得到的效果过于诡异,所以我去掉了
- 击破统计挡字的可以点一下以清零隐藏
17:27 · 5 Aug, 2023
最近用 GitHub Actions 来更新静态资产,由于涉及到爬虫,需要跟第三方网站交互,我感觉用官方实例来跑有可能会像那些跑签到脚本的仓库那样被封,终究还是自托管一个实例。
吐槽几句:
- 每个实例只能用于一个仓库,不能重复添加……想加个仓库?那就再新建一个文件夹吧……
- 没有 yarn,首次使用时需要自己装,另外我这台甲骨文的小鸡跑
npm i
直接跑挂了,不知什么问题 - 上半年 GitHub 泄露了私钥因此最近更换了公钥,我用的其中一个组件没更新
known_hosts
,最后自己换上去就好了,没有用KNOWN_HOSTS_FILE
是因为文档也没细讲干脆一改了之 - 后来翻阅 GitHub 附加产品和功能条款,发现 此外,无论操作是否使用自托管运行器,Actions 都不应用于...,使用自托管也还是有风险,今后可能还是会换成
ci/cd + cron
的方案(主要是简单了解一下市面上的那些 ci/cd 占内存都是以GB
为单位的,而我的小鸡的内存1GB
都不到
16:12 · 5 Aug, 2023
怎么说呢……体验就是很难受:
- 由于 SQLite 的库不像 MySQL 的那样支持自动将
BIGINT
转成TEXT
,只能自己想办法,找了半天找到一个CAST(<AA> AS text) AS <AA>
,然后就是很苦逼地挨个去拷贝粘贴attributes: [ [Sequelize.options.dialect === 'sqlite' ? Sequelize.literal('CAST(value AS text)') : 'value', 'value'], ]
- 没有
MATCH...AGAINST
,MATCH
还在研究怎么搞,REGEXP
那个耗时看着就头疼,最后只能回归LIKE%%
大法 - 全局大锁直接锁死了,不知为啥
WAL
模式也救不了,写都写不进去;高I/O
的查询直接歇菜,动不动就是几十秒的耗时
吐槽归吐槽,最后还要继续折腾……
18:50 · 24 Jul, 2023
一直都有听说 B2 桶,但注册以后用不上只能摆在一边吃灰,最近准备将跑了三年半的 bing 每日图片丢上云,于是这玩意就成了省钱利器。
什么注册账号配置代理这些烂大街的内容就不说了,看 如有乐享的文章 就好。
这里就补充一个,应该是前人写文章时还没出的功能:Redirect Rules。
- If...
- All incoming requests
- Custom filter expression
- When incoming requests match…
(http.host eq "b2.example.com" and http.request.uri.query ne "")
- Then...
Type Expression Status code Dynamic concat("https://b2.example.com", http.request.uri.path)
301
- Preserve query string
其中那个 b2.example.com
改成自己的 host
这样做主要是防止被有心人无限改查询字符串刷调用次数,毕竟 2500
次动动手指就刷完了。
17:20 · 20 Jul, 2023
签发证书
先把证书导出来得到一个 FiddlerRoot.cer
,
openssl x509 -inform der -in FiddlerRoot.cer -out fiddler.pem
file1=$(openssl x509 -inform PEM -subject_hash_old -in fiddler.pem | head -1)
cat fiddler.pem > "$file1.0"
openssl x509 -inform PEM -text -in fiddler.pem -out /dev/null >>"$file1.0"
file2=$(openssl x509 -inform PEM -subject_hash -in fiddler.pem | head -1)
cat fiddler.pem > "$file2.0"
openssl x509 -inform PEM -text -in fiddler.pem -out /dev/null >>"$file2.0"
然后将生成的这两个文件拷贝到 /system/etc/security/cacerts/
目录下,重启设备。
SSL Pinning Bypass
4:20 · 7 Jul, 2023
拿 Svelte 来重构了一下blog,虽然最后没完成,不过还是挺有意思的,处理 Markdown 的生态一般,有种 戴着镣铐跳舞的感觉。
留下了一个本来用来替换掉右下角 NuxtJS
标的玩意。
9:14 · 30 May, 2023