利用 Cloudflare Workers 为 Telegram 频道搭建镜像

不想看思考过程的可以跳到 "部署" 或者直接去看我写完的项目 Telegram-Channel-Mirror

傻翠翠长篇输出的主要地方就是自己的博客啦。经过了一次又一次的功能迭代、代码优化以及 debug 之后,这个博客自己用起来也是越来越顺手了。

但是问题是,自己在摸鱼的过程中往往有些想要分享的文章、视频甚至段子之类的短文字、链接等等,总不能想到什么就都发博客吧------这让表达欲无处安放的翠翠犯了难。

其实对于国内,这个需求最好的去处是微博。但是因为实在对微博对一系列行为不很满意,而又怕自己的一些 暴论 一不小心触碰雷区,最终选择了 Telegram 频道镜像站)作为主要的短文字输出地点。

随之而来的问题就是------Telegram 频道被墙了哇喂,怎么让不常挂梯子的小伙伴也能浏览到自己频道的信息呢?于是便心心念念地琢磨着,怎么能把 Telegram 频道 "引过来"。

初探索

对这件事情的最早探索是在疫情的时候,在疫情伊始自己便开始注意到 @ncov2019 的信息,既准确又及时,极大缓解了那段时间自己的吃瓜焦虑。

而随后,自己也发现了网友所建立的 镜像站,让自己意识到,把数据抓过来在墙内广播这件事是【有戏的】。

简单来说,这样的镜像更像一个爬虫,定期爬取 Telegram Channel 中的数据,并以前端的形式呈现出来,画成图的话,大概是这样。

随后自己便去研究了一下这个镜像站的 前端后端 代码。但可惜的是很快自己便遇到了问题。

首先由于前后端语言不统一,前端用 Vue 后端用 Python,使得部署起来很麻烦。于是自己首先想到的思路是将两端直接捏合起来做一个 docker 镜像。

但另一个问题是:自己有 docker 的机子在国内,而国外机由于性能原因没有装 docker,这就使得 docker 还需要搭配代理食用 ------ 想了想当初自己配 rsshub 和 ttrss 的时候,现在想想也是挺噩梦的一件事。

其次,前端的一些代码是写死的,很难做成配置项(例如,随频道改变标题等等),因此即使做出来也难以做到很强的泛用性。因此这个方案最后也就作罢了。

再探索

这件事本不了了之了,但随着看到木子的 这篇博客,其中提出了用 Cloudflare Workers 直接把 Telegram 频道预览网站镜像过来的可能性,从而让这件事有了新的希望。

而正巧前段时间刚刚因为自己的另一个项目 GitHub-Star-CounterSpencer WooSubstats,简单用上了 Cloudflare Workers,脑补了一下觉得这事有戏,于是便更细致地研究了一下。

用 Cloudflare Workers 做镜像的思路则来自于 ChrAlpha这篇文章(啊,我的友链都是些什么怪物们 orz 傻翠给大家丢脸了 QAQ)。

Cloudflare Workers 是 Cloudflare 所推出的 Serverless 服务,大概可以理解为跑在可以任何地方的小函数与中间件,借助 JS 可以实现各种奇妙的功能。

更神奇的是,免费用户 每天 只有区区 10 万次 的调用额度 ------ 哇,太少了,根本花不完诶!不用你部署还用谁呢?不愧是 Cloudflare,有钱就是任性 orz

如果说初探索的思路更像是个爬虫,定时爬取频道信息并呈现,那么现在的思路更像是搬运工,直接将 Telegram 频道的预览地址 eg: t.me/s/idealclov... 整体搬了过来,需要什么?我帮你取!当我们去访问镜像站的时候,由 Cloudflare 直接做信息的搬运工。

但是这个过程中遇到的问题是,对于一个网站来说,我们往往需要请求其 html、css、js、json 及各种静态文件。当我们请求主文件过后,会根据其所附的文件,再请求其他文件 ------ 虽然主文件被搬过来了,但如果上面其他文件的地址还是原封不动的,同样什么用也没有。

因此我们所需要做的不单单是【转发】,还有【修改】。

通过正则表达式的批量匹配与替换,我们便可以将原来指向其他域名的文件重新指回我们的 Cloudflare Worker 上,并通过映射让其指向正确的网址。

然而由于前人的代码或多或少有些问题。于是在进行了这样的思路整理与 "文献综述"(写论文写魔怔了 2333)后,也算是站在巨人的肩上迈出了自己的一小步。

巨人肩上的一小步

因此在前人的基础上,自己捋顺了整体思路,做了如下的总结与尝试。

  • 首先对主 URL 进行映射,将 / 对应到 t.me/s/频道名称
  • 其次将主 URL 中所引用的其他文件进行正则匹配与替换
    • telegram.org 域名下的引用更改为自己域名 /static 下的对应引用
    • 将原有的 Download Telegram 链接内容直接替换为自己频道的原本链接
    • 将出现最多的个人头像直接替换为墙内 CDN 的对应链接
  • 将引用资源进行映射,将 /static 对应到 telegram.org,完成对其他文件对解析

而对于图片、视频等资源,由于 CloudFlare Workers 的资源限制,自己试验过后发现即使进行代理,图片也往往加载不出来或加载速度堪忧,视频就更不用想了。

不显示就不显示吧,谁让你不挂梯子呢(

而最终,自己也将这个思路所形成的代码浓缩进了 Telegram-Channel-Mirror 项目中,更准确地说是 这个文件 中,与大家共享,希望能帮到需要的人。

部署

这里我懒,很多图和文字就直接用木子的 这篇博客 的啦 XD

首先是要去 CloudFlare 上注册一个账号... 这步就不教了嗷

登录到面板,点击左上角的 Menu ----> Workers 进入到 Workers 页面。新注册的用户会提示设置一个 workers.dev 顶级域名下的二级子域名,这个子域名设置好之后是 ** 不可更改的 **

之后你新创建的 Worker 就会使以这个域名而二级子域名开始的,类似于 WorkerName.yousetdomain.workers.devyousetdomain 就是你要设置的二级子域名,WorkerName 可以自定义,默认是随机生成的。

当然,也可以给自己的域名添加一条 CNAME 到 WorkerName.yousetdomain.workers.dev ,这样使用自己的域名就可以访问到 Worker 了。

设置好二级子域名之后选择 free 套餐计划,然后进入到 Worker 管理界面,创建一个新的 Worker。

之后我们复制我项目中的 index.js 中的代码到 Script 输入框,并更改头几行的配置:

channel_name: 频道名称
host_name: Worker 的域名,供替换使用
icon_url: 由于不反代图片,故需另附头像链接

修改好代码之后点击左下角的 Save and Deploy 然后 Preview 看看页面是否显示正常,如果显示正常就完全 OK 啦~

写在最后

唉,也许过段时间,cloudflare workers 也会被拒之于门外吧 ------ 毕竟在国内也不是没有替代品。serverless 服务现在也是各大云所赤手可热的焦点项目。还有阿里云、腾讯云等等云在等着我们。

但是,有时候真的要佩服互联网元老们所怀揣对那份自由、共享的精神,以及他们的技术能力与高瞻远瞩的视野所带来的互联网底层规则。

虽然时至今日,不论任何国家、地区还是组织愈发开始自我封闭,甚至交流的社区也开始充斥着各种小团体小圈子,但只要互联网还存在着,还联通着,只要我们想彼此沟通,就必然有办法能绕过彼此间的封锁,与大洋彼岸互相沟通。这一点,无论如何都不会回去了。

也许,虽然艰难且步步妥协,但互联网终究还是些许改变了世界呢。

拓展链接


theme: channing-cyan

相关推荐
文火冰糖的硅基工坊4 天前
[产品管理-41]:什么是变量、属性、特征、特性?他们的相同点、不同点?
产品·创业·思维
熊猫片沃子4 天前
范围管理各过程定义、作用、开展次数或频率
产品·设计
熊猫片沃子5 天前
质量管理各过程定义、作用、开展次数或频率
产品·设计
文火冰糖的硅基工坊6 天前
[产品管理-39]:什么是指标、规格、标准?什么是产品指标?什么是产品的设计指标? 什么是产品的技术指标?
产品经理·产品·思维·流程·战略
熊猫片沃子6 天前
进度管理各过程定义、作用、开展次数或频率
产品·设计
EosphorosAI技术社区8 天前
DB-GPT v0.6.0 版本更新,发布六大核心新特性!
产品
文火冰糖的硅基工坊9 天前
[产品管理-33]:实验室技术与商业化产品的距离,实验室技术在商业化过程中要越过多少道“坎”?
产品·管理·创业·思维·战略
梓羽玩Python11 天前
15.4K Star 国产下载器!亿万人在用!真的叫Go快下载器,不叫Go屁下载器!
开源·github·产品
Ceelog12 天前
如何将动态、图文和视频内容同步到全网 30+ 平台 | 爱贝壳内容同步助手
产品
图王大胜1 个月前
模型 KJ分析法(亲和图法)
人工智能·产品·管理·认知·决策