跬步 On Coding

自动化自己的生活:创造自己的小工具

前言

作为一位程序员,我写的大部分当然都是用来赚钱生活的代码,赚钱的代码都是非常规范的,一般都是复杂业务逻辑在程序上映射,很多时候都只有在解决了复杂的业务问题,才能获得打怪升级的成就感。

但是我也会在业余时间学习一些工作无关的技术,比如最近半年我学习了Rust,每当我学习一门新的技术,我总是希望把之前实现的一些程序改用新技术来实现,这样就可以更快的上手。平常生活中也没什么用到Rust的场景,那就只能先把之前用Bash,Python写的小工具用Rust重写一遍。然后最近我也自己发掘了一些生活上的场景,这些场景很多时候都是重复的,手动的,如果能改成自动化能够节省很多时间。想起了不知道哪里看过的一个说法:懒惰是程序员的第一生产力,因为懒,我们会把各种重复手动的工作自动化。

下面的内容就是我在今年自动化生活的一部分,通过自己创造的这些小工具,我解决了自己生活中的一些小痛点。

1. 自动追番

早前我在家里的开发板上搭建了Jellyfin, Sonarr用来追美剧,效果还是不错的,自动下载自动整理文件,自动削刮海报。Sonarr依赖的Indexer服务是一个搭建在fly.io平台上的Prowlarr服务,把Prowlarr搭建在外网,可以避免国内网络访问的限制。

这套方案对于美剧来说已经非常完美了,但是我除了看美剧,还喜欢看日本动漫,由于Sonarr对于番组的中文支持不好,我在网络上也找了一些方案,都不是特别满意,所以我都是手动在蜜柑计划上找磁力链,然后手动下载。

因为我很懒,所以我就学习了一下Prowlarr的API,写了一个小工具,每小时自动从Prowlarr上搜索蜜柑计划的索引,通过我在配置中填写的关键字,找到符合条件的番组,然后触发自动下载,如果触发了下载还可以配置通过ntfy.sh发送通知到手机,这样就不会漏掉我订阅的番组。

代码地址:https://github.com/zhu327/ani-sub

代码很逻辑很简单,只是一些API的调用,如果感兴趣可以自己看看。

为了方便没有自己服务器的朋友,我还开发一个可以部署在Cloudflare Workers的版本:https://github.com/zhu327/ani-sub/tree/workers

这个版本由于没有配置文件,需要依赖Cloudflare D1数据库,可以在Cloudflare网站上编辑D1数据库的数据来添加修改自己订阅的番组关键字。

2. 自动生成RSS AI摘要

我在fly.io平台上搭建了自己的RSS订阅服务Miniflux,并且还在Vercel平台上搭建了自己的RSSHub服务。随着订阅的RSS源越来越多,我一般在浏览器上使用ChatGPT总结助手来生成文章摘要来快速阅读。但是这样每次打开文章,都需要我自己手动点击一下来生成摘要,非常麻烦,所以在网络上找了Minifux与OpenAI相关的话题,但是并没有找到一个合适的方案。直到我在v2ex看到一个网友分享的他用Python实现的一个旁路服务,通过Miniflux的API遍历文章,然后通过OpenAI的API生成摘要,再保存到Miniflux中。那我也可以用Rust实现一个类似的服务,并且可以部署在Cloudflare Workers上。还可以利用到 Cloudflare Workers AI的免费模型来生成摘要。

代码地址:https://github.com/zhu327/miniflux-ai

现在对于比较长的新闻,我一般都只看AI摘要了,只有有兴趣的文章才会阅读全文,并且在手机上也可以方便的阅读到AI摘要。

3. 自动翻译HackNews RSS

作为一位程序员,我建议每个程序员都应该关注HackNews,了解下每天的业界新闻。网络上已经有了HackNews RSS源https://hnrss.github.io,但是每天的信息太多,我一般只看标题,英文的标题会影响我的阅读,所以我需要一个自动翻译的HackNews RSS源。正好前几个月Cloudflare Workers开始支持Python,所以我就用Python实现了一个利用微软azure翻译API自动翻译的HackNews RSS源。微软azure翻译API是有免费额度,每天可以翻译10万字符,对于HackNews来说已经足够了。

代码地址:https://github.com/zhu327/workers-hnrss

4. 自动检测AWS Cloudfront 新加坡 DDNS

由于一些特殊的需求,我需要保证一个域名一直指向AWS Cloudfront的新加坡的IP上,但是Cloudfront的IP地址是动态的,一段时间可能失效,需要找新的IP地址。所以我就写了一个小工具,每小时检测一次Cloudfront的IP地址是否有效,如果不可达,则自动找到新的IP地址,并且更新DNS记录。

整个逻辑是这样的:

  1. 查询DNSPod的DNS记录,获取老的IP地址
  2. http 访问这个 IP地址,如果不可达
  3. 通过https://sg-sin.doh.sb/dns-query这个DOH查询一个新的新加坡的IP地址
  4. 通过DNSPod的API更新DNS记录

刚开始这个小工具是用Bash写的并通过crontab运行在我的服务器上,后来为了练习Rust,我就用Rust重写了这个工具,并且部署在Cloudflare Workers上。

5. Gemini OpenAI Proxy

去年我用Golang写了个一个Gemini的OpenAI代理服务https://github.com/zhu327/gemini-openai-proxy,并且部署在fly.io平台上。但是其实用的也挺少的,还占了fly.io的实例资源。所以我就想找一个serveless的版本来替代这个工具,然后就找了这个支持Cloudflare Workers的Gemini代理:https://github.com/PublicAffairs/openai-gemini

但是呢Cloudflare Workers在国内是被屏蔽了的,所以我就把这个小工具部署到deno deploy上,国内可以无痛访问。

总结

除了工作,我们在生活中也会有一些重复性的工作,如果能自动化,那么就可以节省很多时间。作为程序员我们可以利用现有的免费资源,来创造自己的小工具,让我们的生活更美好。

Cloudflare Workers, deno deploy,fly.io都有一些免费的资源可以利用,可以让我们零成本实现一些小工具。