连点成线,拼凑软件,听上去不专业,实际上却是模块化追求的目标,做好一个个模块,然后用搭积木的方式来构建软件。不过,模块化仍然有点自上而下的味道,强调将复杂的软件拆解成一个个简单的模块,似乎已经有一个“复杂的”软件蓝图在那儿了(起码在我们的脑海里已经有了),模块化只是在实际过程中采用的一种能够控制复杂性的方法。但是连点成线则不一样,虽然点和模块一样,都是简单可重用的部件,但是连点成线之前,并没有一个预先设想好的软件蓝图在那里,纯粹只是出于探索,到最后竞然连点成线,发现并拼凑出一个更复杂的软件。

我最近就利用之前做好的一个个点,拼凑出了一个像样的软件,解决了自己的一个大难题: 将 Markdown 文章同步到知乎专栏。以下是这个拼凑过程。

叽歪同步:将 Markdown 文章同步到知乎专栏

我喜欢写博客,最早开始写博客时,世界上并没有知乎这个东西。后来有了知乎,以及专栏,我尝试了一下在知乎上写作,知乎的编辑器虽然还可以,但仍然不如语雀使用起来方便,当然,支持 Markdown 的编辑器多如牛毛,比语雀优秀的也有很多,但是我已经习惯了语雀,因此,我个人的需求是希望将语雀上的文章同步到知乎专栏上,这样,就不用同一篇博客写两遍。不过,语雀只是一个 Markdown 写作时的工具,所以真正的需求是将 Markdown 同步到知乎专栏,将 Markdown 和知乎编辑器解藕,这是最重要的。

看过牛岱的 VSCode 知乎插件,非常好,但是仍然有一个 Markdown 和 VSCode 的绑定,有点不完美。我尝试过将它的逻辑从 VSCode 抽出来,比如基于 Web 来做同样的事情,最后放弃了,因为它是通过知乎的非公开 API 来实现的,过程非常复杂,足以让人放弃。所以很佩服牛岱的钻研精神和毅力,因为这条路实在太难了。比如,需要解析 Markdown,将文章中的图片抽出来,完成上传,再将上传完的图片地址插入到 Markdown 源中去,这就足够复杂了。并且,使用了非公开的 API,导致有风险,如果知乎修改了 API,就得重新研究新的 API,再相应修改代码。最后,通过 API 来完成文章的同步只能同步文章本身,但是知乎的编辑器还提供了更丰富的功能,比如插入“付费咨询”卡片,插入文章目录等等等等,这些特性,用 API 可能完成不了(我没有细细研究)。

所以,我理想的同步方式是:只需要告诉这个同步工具,要同步的 Markdown 内容,然后,这个工具就像人一样,打开知乎编辑器,将文字输入进去,然后,插入文章目录,插入“付费咨询”卡片(毕竟,这是我使用知乎的很重要的原因),以及自动投稿到相应的回答等等。没想到,这种同步方式不仅效果更好,而且实现起来更加轻松,完全不用研究知乎的 API,也不同去写复杂的 Markdown 解析,因为,只需要把自己以前做好的一些东西,拼凑起来即可。

最终,我给这个拼凑起来的工具,命名为“叽歪”。“叽歪 ”几乎完美地解决了我自己的问题,但是我还没有把它公开出来,代码也没有全部开源,如果本文点赞数超过一千,就说明有同样需求的人不少,那么这个工具就有一点价值,那就立个 Flag: 点赞数过千,就将叽歪开源

拼凑过程

先不开源,是因为代码中写死的信息比较多,只能适用于我自己。开源之前需要将这些写死的内容泛化出来(是否值得泛化,就看点赞数量了),以供任何人使用。如果点赞数不够,就有少许读者像我一样,特别需要这个功能的话,可以参考本文的拼凑过程,拼出你自己的同步工具。

登录

我最早写过一篇专栏: https://zhuanlan.zhihu.com/p/349504145,设计并实现了基于 Keycloak 的关注微信公众号即登录方式,从此开始关注登录这个问题,后来又将 Keycloak 去掉,使用 Java Spring Security 重新实现了一遍: https://zhuanlan.zhihu.com/p/393360806

再后来,又吐槽了《非你莫属》中某一老板说短信验证码登录一定是最安全的说法,以实际例子说明了短信验证码登录并不一定安全,由于各大网站大量使用短信验证码登录又做得不好,导致了严重的安全问题和隐私泄漏问题, https://www.zhihu.com/zvideo/1475559649864409088。紧接着,又录制视频用实际例子证明了扫码登录方式有着明显的钓鱼风险: https://www.zhihu.com/zvideo/1518236539352440833

就这样对各种登录方式有了详细的了解,发现不管怎么登录,各大网站最终都是保存一系列的 Cookie 到客户端,知乎也不例外。这和“叽歪”工具有什么关系?其实“叽歪”本质上是使用了 Cypress 做了一系列的自动化操作,即真的像一个人一样,去操作了知乎的编辑器,从而完成最好的文章同步效果(后面会录制一个视频来展示),并没有技术难点。但是操作知乎编辑器前,得先登录才行,这其实才是难点。

万能 BFF

个人不喜欢重复造轮子,连静态站点在构建过程中临时使用的 GraphQL 服务,都想着要重用,于是部署到了 AWS Lambda,并起名为万能 BFF: https://zhuanlan.zhihu.com/p/412196725。这样就有了一个简单的后端服务,可以扩展使用。

在线剪贴板

这是一个很常见的服务,网上有各种现成的实现。为了展示 TDD 的开发过程,以及生动说明什么是霍夫斯塔特定律,就在万能 BFF 项目里开发了一个简单版的在线剪贴板服务:

https://www.zhihu.com/zvideo/1518914371601895424

Cypress

Cypress 是一个用来做自动化界面测试的工具,也是在学习到了 GOOS 后,才了解到原来应该先写端到端测试,于是开始在某些项目中使用它。但把它用到“叽歪”项目上,是不受 Cypress 鼓励的。尽管如此,叽歪的第一版还是用了 Cypress,当然,除了 Cypress,还可以用其他的工具,比如 Selenium 等等。
https://www.zhihu.com/zvideo/1525828011673194496

叽歪

以上的工具都是由于各种不同的目的,单独开发,没有想到拼凑一下,竟然成了另一种有用的工具 : 叽歪。点赞过千,就开源。

它利用知乎二维码扫描获取登录信息,利用在线剪贴板传递登录信息和 Markdown 源文件,最后运行 Cypress 自动化完成专栏写作,就是这么简单。