<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Github on Colinx Blog</title><link>/tags/github/</link><description>Recent content in Github on Colinx Blog</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Mon, 10 May 2021 00:00:00 +0000</lastBuildDate><atom:link href="/tags/github/index.xml" rel="self" type="application/rss+xml"/><item><title>我的 RSS 方案与心得</title><link>/posts/%E6%88%91%E7%9A%84rss%E6%96%B9%E6%A1%88%E4%B8%8E%E5%BF%83%E5%BE%97/</link><pubDate>Mon, 10 May 2021 00:00:00 +0000</pubDate><guid>/posts/%E6%88%91%E7%9A%84rss%E6%96%B9%E6%A1%88%E4%B8%8E%E5%BF%83%E5%BE%97/</guid><description>
&lt;img src="https://www.gethow.org/wp-content/uploads/2013/07/feed-297x140.jpg"/>
&lt;!-- # 我的 RSS 方案与心得 -->
&lt;p>使用 RSS 已经一年有余，这种对信息的主动掌握让我获取信息的质量和密度都上升了一个台阶。最早是使用 TTRSS 做服务端，安卓手机使用 &lt;a href="https://github.com/seazon/FeedMe">FeedMe&lt;/a> 订阅，主要订阅的是有源的商业内容站点、个人博客以及其他人分享的使用 Feed43 或 Feedburner 压制的源。随着我逐渐加大 RSS 阅读在我闲暇、琐碎时间内的比重，我对 RSS 有了更高的期望和要求，便开始了对如何构建更高效、更易用的 RSS 方案的探索。&lt;/p>
&lt;h2 id="0x01-借助-rsshub-订阅各种热门冷门网站">
0x01 借助 RSSHub 订阅各种热门冷门网站
&lt;a href="#0x01-%e5%80%9f%e5%8a%a9-rsshub-%e8%ae%a2%e9%98%85%e5%90%84%e7%a7%8d%e7%83%ad%e9%97%a8%e5%86%b7%e9%97%a8%e7%bd%91%e7%ab%99" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>&lt;a href="https://docs.rsshub.app/">RSSHub&lt;/a> 是个很赞的项目，它聚集了众多 RSS 爱好者来为现代的网站构建 RSS 订阅源。众所周知，网站提供 RSS 并不能为他的站点带来更高的收入，反而会减少主站的访客数。借助 RSSHub 可以方便地通过 RSS 订阅知乎、豆瓣、Facebook 等现代媒体社交平台。&lt;/p>
&lt;h2 id="0x02-获取-feed-文章全文">
0x02 获取 Feed 文章全文
&lt;a href="#0x02-%e8%8e%b7%e5%8f%96-feed-%e6%96%87%e7%ab%a0%e5%85%a8%e6%96%87" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>部分 RSS 源并不会在 xml 文件内提供文章全文，说白了是想让你点进他们的网站去浏览，这样网页上的广告才有可能被你点击。解决的方案有很多，方便起见我使用了 TTRSS 的插件 Readability 和 Mercury。两者都不能完美适配所有站点，同时启用这两者以实现互补。&lt;/p>
&lt;h2 id="0x03-无障碍阅读繁体中文-feed">
0x03 无障碍阅读繁体中文 Feed
&lt;a href="#0x03-%e6%97%a0%e9%9a%9c%e7%a2%8d%e9%98%85%e8%af%bb%e7%b9%81%e4%bd%93%e4%b8%ad%e6%96%87-feed" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>发现了几个质量不错的繁体中文信息源，主要是台湾的站点，如泛科学。由于文字和部分两岸文化差异，直接阅读繁体中文的文章有些困难。我的解决方案是使用 OpenCC 简繁转换服务，它能够对可映射的简繁汉字以及同一事物的两岸不同的表述进行翻译，输出的简体中文版文章基本可以无障碍阅读。Awesome-TTRSS 内有集成相应的插件和服务程序。&lt;/p>
&lt;p>不过原作者是使用 node.js 编写的服务端，翻译数据库得不到及时更新，如翻译后还是写的是&lt;code>义大利&lt;/code>而不是&lt;code>意大利&lt;/code>。而且 docker image 体积 100+M，内存占用也较大。我在考虑用 Go 语言重写 OpenCC 的服务端并兼容 TTRSS 的 OpenCC 插件，并加入 CI 自动从上游同步翻译数据库。&lt;/p>
&lt;h2 id="0x04-为不支持-rss-的网站自制源">
0x04 为不支持 RSS 的网站自制源
&lt;a href="#0x04-%e4%b8%ba%e4%b8%8d%e6%94%af%e6%8c%81-rss-%e7%9a%84%e7%bd%91%e7%ab%99%e8%87%aa%e5%88%b6%e6%ba%90" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>繁茂如 RSSHub 也不能保证拥有所有站点的 RSS 源。对于自制源，网上的方案大多数为使用 Feed43 和 Feedburner，但是人家是商业服务，虽然使用确实方便，但说到底还是为了商业。白嫖用户限制多不说，天知道哪天会有 break change 或者直接被墙或者跑路。最稳妥的做法还是自建。&lt;/p>
&lt;p>手写爬虫程序简单灵活，不过后期维护难度较高而且难以复用。对于我想要订阅而有没有现成的源的网站，我的解决方案主要是两个：&lt;/p>
&lt;h3 id="1-为-rsshub-编写目标站点的规则并-pull-request-申请合并">
1. 为 RSSHub 编写目标站点的规则，并 Pull Request 申请合并
&lt;a href="#1-%e4%b8%ba-rsshub-%e7%bc%96%e5%86%99%e7%9b%ae%e6%a0%87%e7%ab%99%e7%82%b9%e7%9a%84%e8%a7%84%e5%88%99%e5%b9%b6-pull-request-%e7%94%b3%e8%af%b7%e5%90%88%e5%b9%b6" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>RSSHub 除了提供众多现成的各类站点的 RSS 规则之外，也提供了快速构建一个站点的 RSS 源的常用工具类和模板。需要对 JavaScript 和爬虫技术有一定了解。很荣幸能提交了几个 pr 并且已经合并进了主分支，如 CQUT 的教务处通知和&lt;a href="https://docs.rsshub.app/social-media.html#zhi-hu-yong-hu-wen-zhang">知乎的用户文章列表&lt;/a>。&lt;/p>
&lt;h3 id="2-使用-huginn-为目标站点自制源">
2. 使用 Huginn 为目标站点自制源
&lt;a href="#2-%e4%bd%bf%e7%94%a8-huginn-%e4%b8%ba%e7%9b%ae%e6%a0%87%e7%ab%99%e7%82%b9%e8%87%aa%e5%88%b6%e6%ba%90" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>&lt;a href="https://github.com/huginn/huginn">Huginn&lt;/a> 是一个强大的 &lt;a href="https://sspai.com/post/25270#!">IFTTT&lt;/a> 应用，用它来生成 RSS 源简直是大材小用（主要是他动辄 200M 的内存占用）。不过某些情况下我需要监视特定站点并在内容变化时得到通知，个人向为主，这类就不适合写 RSSHub 的规则。&lt;/p>
&lt;p>使用门槛比 RSSHub 略低，可视化界面还是比较友好的，不过新手上手还是会有点困难，了解了 Huginn 的工作原理和基本的 Liquid 语法之后就手到擒来了。&lt;/p>
&lt;h3 id="3-使用-feed43-和-rss-proxy-这类可视化工具自助生成-rss-链接">
3. 使用 feed43 和 rss-proxy 这类可视化工具自助生成 RSS 链接
&lt;a href="#3-%e4%bd%bf%e7%94%a8-feed43-%e5%92%8c-rss-proxy-%e8%bf%99%e7%b1%bb%e5%8f%af%e8%a7%86%e5%8c%96%e5%b7%a5%e5%85%b7%e8%87%aa%e5%8a%a9%e7%94%9f%e6%88%90-rss-%e9%93%be%e6%8e%a5" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>手写解析规则还是太麻烦，很多网页结构很简单根本没必要单独花时间写一堆解析规则，而且有些时候只是想临时订阅一段时间或是订阅个很小的网站，不想大费周章，选择 feed43 这类工具不失为一个轻量又便捷的选择。不过&lt;a href="https://feed43.com/">feed43&lt;/a>对免费账户创建的 RSS 并不保证稳定，时常无法连接甚至直接失效。在 Github 上发现一个不错的替代品&lt;a href="https://github.com/damoeb/rss-proxy/">rss-proxy&lt;/a>，一个可视化的，快速自助生成站点 RSS 链接的工具。&lt;/p>
&lt;p>&lt;img src="https://cdn.jsdelivr.net/gh/damoeb/rss-proxy/docs/rssproxy-candidates.png" alt="rss-proxy screenshot">&lt;/p>
&lt;p>填入目标网址就可以自动解析目标网页，程序会自动检测网页上的列表内容，可以自己选择要订阅哪个列表，然后就可以生成一个 RSS 链接。生成的 RSS 链接包括的信息有目标网址、要订阅的目标列表的节点信息和输出格式（RSS/ATOM）等，也就是说，rss-proxy 并不像 feed43 会把解析的规则存储在服务端，它是直接编码在 url 里面的！rss-proxy 开源支持自部署，不想用它提供的公用实例也可以自建，迁移零门槛。rss-proxy 也支持调用无头浏览器渲染异步获取数据的网页，可玩性很高。&lt;/p>
&lt;p>-&amp;raquo;&amp;raquo; &lt;a href="https://rssproxy-v1.migor.org/">rss-proxy 公用实例&lt;/a>，可以点击体验下，还是很方便的&lt;/p>
&lt;p>使用了一段时间体验挺不错，有个小问题就是对 UTF-8 以外的编码不太友好。&lt;/p>
&lt;h2 id="0x05-解锁海外-rss-源">
0x05 解锁海外 RSS 源
&lt;a href="#0x05-%e8%a7%a3%e9%94%81%e6%b5%b7%e5%a4%96-rss-%e6%ba%90" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>由于众所周知的原因，我国的互联网是不「互联」的。rsshub.app 部署在国外，现已基本无法直接访问。国内服务器上自建的 RSSHub 订阅如 Facebook 等国外站点更是不可行。为此我使用了 Clash 代理，并添加了一些公开的机场订阅，虽然速度和稳定性不是很高，但对于 RSS 这种需求还是绰绰有余的。又完善了一些爬墙的规则，比如对 google、facebook，rsshub.app 走代理，内网地址和 CN 的 IP 直连，反爬严格的网站完全走随机节点。一番操作下来，基本可以实现全球 RSS 订阅自由了 😁&lt;/p>
&lt;h2 id="0x06-rss-订阅破-cloudflare-五秒盾">
0x06 RSS 订阅破 CloudFlare 五秒盾
&lt;a href="#0x06-rss-%e8%ae%a2%e9%98%85%e7%a0%b4-cloudflare-%e4%ba%94%e7%a7%92%e7%9b%be" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>如上所述，海外 RSS 源走公用机场可以解决国内的网络问题。但是很多站点会使用 CloudFlare 做 CDN 和防火墙，我们使用的公用机场其实一大半都是被用作非法用途的，IP 很多都在人家的黑名单里面，但凡通过那个节点访问 CloudFlare 保护的网站都会触发五秒盾防御，浏览器访问倒是没什么，但是可苦了 RSS。&lt;/p>
&lt;p>google 了一番，没人写过我这个问题。。。人家都是爬虫绕过五秒盾，调包实现的破解。不过好在最终还是有了可行的解决方案：&lt;strong>Clash 识别 CloudFlare 节点 IP 段，对于他家的节点，使用 Round-Robin 算法的 Load-Balance 策略走海内外随机节点，包括本机直连。&lt;/strong>&lt;/p>
&lt;p>上面一句话有三个技术要点：&lt;/p>
&lt;ol>
&lt;li>&lt;strong>识别 CF 节点&lt;/strong>：CF 的节点遍布全球，把 IP 列表加到 Clash 规则集里面肯定是不现实的。不过好在人家家大业大都是买的 IP 段，官网也给出了所有节点的 IP 段，也就十个左右。&lt;/li>
&lt;li>&lt;strong>Round-Robin&lt;/strong>：一种常见的负载均衡算法，简单来说就是把所有节点组成一个圆环，每次访问选择一个环上的节点，之后沿环方向移动一个特定步长，作为下一个要使用的节点，每次访问所使用的节点都不一样。另一种常用的算法是 Consist-Hashing，一致性哈希，相同的 url 拥有相同的哈希值，根据哈希值来选择的节点是一样的，同一个 url 会使用同一个节点。对于上文提到的场景，要实现反反爬虫，那必须选择 Round-Robin 算法。&lt;/li>
&lt;li>&lt;strong>包括本机节点&lt;/strong>：如上文所述，触发五秒盾的原因是那些公用机场的 IP 都不大干净，但是我用来部署 RSS 这些东西的自用的服务器没有这个问题，只有网络问题 😂。使用本机作为随机节点的兜底，即便特殊情况下所有的公共机场都是脏 IP，但是本机能直连东亚和美西的 CF 节点，还是可以保证 RSS 的可用性。&lt;/li>
&lt;/ol>
&lt;p>可能的改进：匹配到 CF 节点，选择从本机连接东亚的连接较好的 CF 节点来请求目标站点的内容，可以一次解决那两个问题&lt;/p>
&lt;p>以上都被我整合进了我的 Github 项目 &lt;a href="https://github.com/Colin-XKL/RSSmanX">RSSman X&lt;/a>&lt;/p>
&lt;blockquote>
&lt;p>&lt;a href="https://github.com/Colin-XKL/RSSmanX">RSSman X&lt;/a> 基于 docker-compsoe 提供容器化 TTRSS 与 RSSHUB 等组件的一键部署，整合实用组件为你带来最佳 RSS 体验&lt;/p>
&lt;p>&lt;strong>Feature：简单一键部署，常用组件整合，自动更新支持，服务健康自检支持，海外站点 RSS 解锁&lt;/strong>&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs20210512190819.png" alt="image-20210512190732383">&lt;/p>
&lt;p>感兴趣的朋友可以关注一下 🍺&lt;/p></description></item><item><title>RSSManX - 一套 RSS 综合解决方案</title><link>/posts/rssmanx/</link><pubDate>Sat, 08 May 2021 00:00:00 +0000</pubDate><guid>/posts/rssmanx/</guid><description>
&lt;p>&lt;img src="https://cdn.jsdelivr.net/gh/Colin-XKL/RSSmanX/.github/logo.png" alt="logo">&lt;/p>
&lt;p>&lt;img src="https://img.shields.io/github/license/Colin-XKL/RSSmanX" alt="license">&lt;br>
&lt;img src="https://img.shields.io/github/v/release/Colin-XKL/RSSmanX" alt="release">&lt;/p>
&lt;p>&lt;a href="https://github.com/Colin-XKL/RSSmanX/blob/master/README-zh_cn.md">中文说明&lt;/a> ｜ &lt;a href="https://github.com/Colin-XKL/RSSmanX/">English&lt;/a>&lt;/p>
&lt;p>&lt;strong>RSSman X is a project that composed several useful services to help you build an excellent RSS experience.&lt;/strong>&lt;/p>
&lt;p>&lt;a href="https://github.com/Colin-XKL/RSSmanX">RSSman X&lt;/a> 基于 docker-compsoe 提供容器化 TTRSS 与 RSSHUB 等组件的一键部署，整合实用组件为你带来最佳 RSS 体验&lt;/p>
&lt;p>&lt;strong>Feature：简单一键部署，常用组件支持，自动更新支持，服务健康自检支持，海外站点 RSS 解锁&lt;/strong>&lt;/p>
&lt;h3 id="快速开始">
快速开始
&lt;a href="#%e5%bf%ab%e9%80%9f%e5%bc%80%e5%a7%8b" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>(若已安装 &lt;code>docker&lt;/code> 和 &lt;code>docker-compose&lt;/code>)&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">mkdir RSSmanX &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> cd $_ &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> wget https://cdn.jsdelivr.net/gh/Colin-XKL/RSSmanX/docker-compose.yml &lt;span style="color:#f92672">&amp;amp;&amp;amp;&lt;/span> sudo docker-compose up -d
&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="说明">
说明
&lt;a href="#%e8%af%b4%e6%98%8e" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>本项目旨在为 RSS 的同好提供一个方便地搭建自己的 RSS 服务的捷径。毕竟不是所有 RSS 爱好者都懂代码 😂。如果你想快速地搭建自己的 RSS 服务，能够有 RSS 订阅管理、RSS 在线阅读界面，进阶功能包括服务健康自检、海外站点 RSS 解锁等。希望订阅国内外的各大网站的 RSS 信息源又不想跟着网上漫天飞的教程瞎折腾的话，那么你可以使用本仓库的脚本快速完成安装部署。&lt;/p>
&lt;h3 id="不同版本中包含的组件说明">
不同版本中包含的组件说明
&lt;a href="#%e4%b8%8d%e5%90%8c%e7%89%88%e6%9c%ac%e4%b8%ad%e5%8c%85%e5%90%ab%e7%9a%84%e7%bb%84%e4%bb%b6%e8%af%b4%e6%98%8e" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>三个版本的&lt;code>docker-compose&lt;/code>文件对应不同的需求，包含的组件和服务有差异。&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>组件/服务/功能名称&lt;/th>
&lt;th>标准版&lt;/th>
&lt;th>Lite 版&lt;/th>
&lt;th>Ultimate 版 ✨&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>TTRSS&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>RSSHub&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Huginn&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Mercury&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>OpenCC&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Redis&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Browserless&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>数据持久化保存&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>容器自动更新&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>容器健康检查&lt;/td>
&lt;td>✅&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>海外站点加速&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>智能路由&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>✅&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;td>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>不同组件的功能描述见文末。不同版本对应的配置文件如下：&lt;/p>
&lt;p>&lt;strong>标准版&lt;/strong>：&lt;code>docker-compose.yml&lt;/code>&lt;/p>
&lt;p>&lt;strong>Lite 版&lt;/strong>：&lt;code>docker-compose-lite.yml&lt;/code>&lt;/p>
&lt;p>&lt;strong>Ultimate 版&lt;/strong>：&lt;code>docker-compose-ultimate.yml&lt;/code>和&lt;code>config.yaml&lt;/code>&lt;/p>
&lt;p>选择对应版本下载到本地后都 compose 文件需要重命名为标准的&lt;code>docker-compose.yml&lt;/code>才可使用&lt;/p>
&lt;h2 id="安装说明">
安装说明
&lt;a href="#%e5%ae%89%e8%a3%85%e8%af%b4%e6%98%8e" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;h3 id="需求">
需求
&lt;a href="#%e9%9c%80%e6%b1%82" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>
&lt;p>一台 Linux 系统的服务器&lt;/p>
&lt;blockquote>
&lt;p>本文以腾讯云 Ubuntu 18.04 系统的服务器为例，其他云服务商的没差，系统为 CentOS 的会有点差异&lt;/p>
&lt;/blockquote>
&lt;/li>
&lt;/ul>
&lt;h3 id="依赖项">
依赖项
&lt;a href="#%e4%be%9d%e8%b5%96%e9%a1%b9" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>docker&lt;/li>
&lt;li>docker-compose&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>安装 Docker&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo
sudo add-apt-repository &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> &lt;span style="color:#e6db74">&amp;#34;deb [arch=amd64] https://download.docker.com/linux/ubuntu \
&lt;/span>&lt;span style="color:#e6db74"> &lt;/span>&lt;span style="color:#66d9ef">$(&lt;/span>lsb_release -cs&lt;span style="color:#66d9ef">)&lt;/span>&lt;span style="color:#e6db74"> \
&lt;/span>&lt;span style="color:#e6db74"> stable&amp;#34;&lt;/span>
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;strong>安装 docker-compose&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4">&lt;code class="language-bash" data-lang="bash">sudo apt install docker-compose
&lt;/code>&lt;/pre>&lt;/div>&lt;p>完整文档参见 📕&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://docs.docker.com/engine/install/">https://docs.docker.com/engine/install/&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://docs.docker.com/compose/install/">https://docs.docker.com/compose/install/&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="如何安装">
如何安装
&lt;a href="#%e5%a6%82%e4%bd%95%e5%ae%89%e8%a3%85" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>安装好了 &lt;code>docker&lt;/code> 和 &lt;code>docker-compose&lt;/code> 后可以执行文章开头的快速开始的指令。或者可以按照下面的步骤手动操作：&lt;/p>
&lt;ol>
&lt;li>确定安装好了 &lt;code>docker&lt;/code> 和 &lt;code>docker-compose&lt;/code>&lt;/li>
&lt;li>克隆本仓库/下载你所需要的版本的 compose 文件，注意修改文件名&lt;/li>
&lt;li>cd 进入文件夹，编辑&lt;code>docker-compose&lt;/code>文件，修改密码及 ttrss 的&lt;code>SELF_URL&lt;/code>处的值&lt;/li>
&lt;li>运行 &lt;code>sudo docker-compose up -d&lt;/code>&lt;/li>
&lt;li>等待程序跑完&lt;/li>
&lt;li>安装完成 ✅&lt;/li>
&lt;/ol>
&lt;h4 id="使用相关事宜">
使用相关事宜：
&lt;a href="#%e4%bd%bf%e7%94%a8%e7%9b%b8%e5%85%b3%e4%ba%8b%e5%ae%9c" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h4>
&lt;ol>
&lt;li>访问你设置的&lt;code>SELF_URL&lt;/code>即可看到 Tiny Tiny RSS 的登陆页面，使用默认账户&lt;code>admin&lt;/code>，密码&lt;code>password&lt;/code>登陆即可开始使用。&lt;/li>
&lt;li>如开启海外站点解锁支持，第一次冷启动需要等待 3-5 分钟才能完全启动所有组件。&lt;/li>
&lt;li>数据保存位置 ~/.dockerData/Database/&lt;/li>
&lt;/ol>
&lt;p>详细配置和使用事宜请参考对应应用的文档说明。&lt;/p>
&lt;ul>
&lt;li>TTRSS 相关文档 &lt;a href="https://ttrss.henry.wang/">https://ttrss.henry.wang/&lt;/a>&lt;/li>
&lt;li>RSSHub 相关文档 &lt;a href="https://docs.rsshub.app/">https://docs.rsshub.app/&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="功能模块介绍">
功能模块介绍
&lt;a href="#%e5%8a%9f%e8%83%bd%e6%a8%a1%e5%9d%97%e4%bb%8b%e7%bb%8d" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>&lt;strong>Tiny Tiny RSS&lt;/strong>
RSS 订阅管理与在线阅读工具&lt;/p>
&lt;p>&lt;strong>RSShub&lt;/strong>
生成国内大部分网站的 RSS 信息源，同时自部署可以访问到那些严格防爬的站点的源（知乎、微博等）&lt;/p>
&lt;p>&lt;strong>Huginn&lt;/strong>
高级 IFTTT 工具，你可以用生成任何 RSS 源，但使用门槛略高&lt;/p>
&lt;p>&lt;strong>Postgres&lt;/strong>
数据库，用于存储 RSS 文章数据等。比 MySQL 更轻，性能更好&lt;/p>
&lt;p>&lt;strong>OpenCC&lt;/strong>
简繁体转换，如果你订阅了一些繁体的 RSS 源，可以用它来将文章转为简体&lt;/p>
&lt;p>&lt;strong>Mercury&lt;/strong>
用于获取 RSS 全文&lt;/p>
&lt;p>&lt;strong>Browserless&lt;/strong>
用于获取常规方式无法获取的网站 RSS，为 RSSHub 的可选组件&lt;/p>
&lt;p>&lt;strong>Redis&lt;/strong>
提供缓存，提升性能，为 RSSHub 的可选组件&lt;/p>
&lt;p>&lt;strong>WatchTower&lt;/strong>
用于自动更新 RSShub 等组件，可以更好地支持新添加的源以及更快的获得 bug 修复&lt;/p>
&lt;p>&lt;strong>Clash&lt;/strong>
智能路由与正向代理工具，用于解锁海外站点及提供海外 RSS 源的加速&lt;/p>
&lt;h2 id="acknowledgement">
Acknowledgement
&lt;a href="#acknowledgement" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://tt-rss.org/">Tiny tiny RSS&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/BYVoid/OpenCC">OpenCC&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/postlight/mercury-parser">Mercury&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/huginn/huginn">Huginn&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/DIYgod/RSSHub">RSShub&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/HenryQW/Awesome-TTRSS">Awesome TTRSS&lt;/a>&lt;/li>
&lt;/ul>
&lt;h2 id="license">
License
&lt;a href="#license" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>GPL-3.0&lt;/p>
&lt;h2 id="changelogs">
Changelogs
&lt;a href="#changelogs" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>2020-07-07 v1.0 First release&lt;/li>
&lt;li>2020-07-14 v1.1 Update quick start shell script&lt;/li>
&lt;li>2020-10-05 v1.2 Fix wrong environment variable.&lt;/li>
&lt;li>2020-11-08 v1.3 TTRSS now can update feeds with ports except 80/443, and our self-hosted rsshub works again.&lt;/li>
&lt;li>2020-11-13 v1.4 Several updates includes security and performance enhancements.&lt;/li>
&lt;li>2020-11-24 v1.5 Lock the docker image version of some services to avoid unexpected errors.&lt;/li>
&lt;li>2021-05-08 v2.0 Add container network isolation, health check, global proxy, smart routing etc.&lt;/li>
&lt;/ul></description></item><item><title>Colin's 实验室 - 2021 春</title><link>/posts/colins-%E5%AE%9E%E9%AA%8C%E5%AE%A4-2021%E6%98%A5/</link><pubDate>Thu, 25 Feb 2021 00:00:00 +0000</pubDate><guid>/posts/colins-%E5%AE%9E%E9%AA%8C%E5%AE%A4-2021%E6%98%A5/</guid><description>
&lt;!-- # Colin's 实验室 - 2021 春 -->
&lt;blockquote>
&lt;p>小玩具及他们的 demo&lt;/p>
&lt;/blockquote>
&lt;h2 id="英语文本智能查词project-sweeper">
英语文本智能查词（Project Sweeper）
&lt;a href="#%e8%8b%b1%e8%af%ad%e6%96%87%e6%9c%ac%e6%99%ba%e8%83%bd%e6%9f%a5%e8%af%8dproject-sweeper" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;blockquote>
&lt;p>自动分割给定的英文文本，提取词元后在数据库中搜索，根据给定的词汇量和难度等级进行筛选，只能提取阅读障碍词汇并高亮当前备考项目（如四级）的重点单词&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20210330233722.jpg" alt="360 截图 20210206210445677">&lt;/p>
&lt;h2 id="知乎爬虫及-js-逆向">
知乎爬虫及 JS 逆向
&lt;a href="#%e7%9f%a5%e4%b9%8e%e7%88%ac%e8%99%ab%e5%8f%8a-js-%e9%80%86%e5%90%91" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;blockquote>
&lt;p>日常用 RSS 订阅知乎的一些高质量专栏。但由于知乎本事并不支持 RSS，内容大多通过 RSShub 来的，其本质是个爬虫，经常会受到前端页面结构变更的影响。为了应对这个变化，RSShub 中对于知乎相关页面的爬取规则必须得重写。&lt;/p>
&lt;p>分析了一通知乎的页面，发现有个接口可以直接请求，但是会检验 header。header 里面有几项特殊的自定义参数，&lt;code>x-zse-83&lt;/code> 和 &lt;code>x-zse-86&lt;/code>等。为了搞清楚这里面的数值怎么来的，就必须对知乎前端页面资源中的一个 js 文件进行逆向分析。&lt;/p>
&lt;p>逆向折腾了大半天，就快要成功提取核心加密函数的时候，发现知乎的前端页面为了 SEO 有加入一页的文章列表数据，可以直接用上。考虑到逆向的工作量和潜在的法律问题，遂放弃原本的方案。&lt;/p>
&lt;p>新的方案完成后，已向 RSShub 提交 PR 并已被合并。&lt;/p>
&lt;/blockquote>
&lt;h2 id="mc-服务器搭建与极限优化">
MC 服务器搭建与极限优化
&lt;a href="#mc-%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%90%ad%e5%bb%ba%e4%b8%8e%e6%9e%81%e9%99%90%e4%bc%98%e5%8c%96" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;blockquote>
&lt;p>1 核 2G 学生机，从 2 人联机频频崩溃到 8 人挖矿毫无压力，学习了 JVM GC 种种，对服务端程序的一些参数也渐渐熟悉。优化效果喜人，总有还能压榨的性能，就像资本家看手下的骡子一样 hhh&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs20210207205949.png" alt="屏幕截图 (12)">&lt;/p>
&lt;h2 id="洞洞板冰箱贴cvpro没想好名字">
洞洞板/冰箱贴/CVPRO/（&amp;hellip;没想好名字）
&lt;a href="#%e6%b4%9e%e6%b4%9e%e6%9d%bf%e5%86%b0%e7%ae%b1%e8%b4%b4cvpro%e6%b2%a1%e6%83%b3%e5%a5%bd%e5%90%8d%e5%ad%97" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;blockquote>
&lt;p>一款跨平台的灵感素材收集与简易管理 App，基于 Flutter 构建，跨平台，颜值在线。&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/20210330233350.png" alt="截屏 2021-03-30 23.21.32">&lt;/p>
&lt;blockquote>
&lt;p>持续开发中，附 roadmap&lt;/p>
&lt;p>version 1.0&lt;/p>
&lt;p>[x] Text support&lt;br>
[x] Key shortcut support&lt;br>
[x] About Page&lt;br>
[ ] Content editing&lt;br>
[x] List item dismiss
[x] List Sorting&lt;/p>
&lt;p>Future - Key functions&lt;/p>
&lt;p>[ ] Data Storage&lt;br>
[ ] Pic support&lt;br>
[ ] Trashbin&lt;br>
[ ] File support&lt;br>
[ ] Multiple List&lt;/p>
&lt;p>Future - Key features&lt;/p>
&lt;p>[ ] Grid view&lt;br>
[ ] Drag and Drop support&lt;br>
[ ] Card resize&lt;/p>
&lt;p>Future - Extra&lt;/p>
&lt;p>[ ] Text reformat, delete useless spaces etc.&lt;br>
[ ] Pic OCR support&lt;br>
[ ] WebDav support and automatically upload files&amp;lt;10M&lt;/p>
&lt;/blockquote></description></item><item><title>JAMStack 初体验 - 基于 Pocket 和 Gatsby 构建你的「网络日志」</title><link>/posts/jamstack%E5%88%9D%E4%BD%93%E9%AA%8C-%E5%9F%BA%E4%BA%8Epocket-%E5%92%8C-gatsby-%E6%9E%84%E5%BB%BA%E4%BD%A0%E7%9A%84%E7%BD%91%E7%BB%9C%E6%97%A5%E5%BF%97/</link><pubDate>Sat, 09 Jan 2021 00:00:00 +0000</pubDate><guid>/posts/jamstack%E5%88%9D%E4%BD%93%E9%AA%8C-%E5%9F%BA%E4%BA%8Epocket-%E5%92%8C-gatsby-%E6%9E%84%E5%BB%BA%E4%BD%A0%E7%9A%84%E7%BD%91%E7%BB%9C%E6%97%A5%E5%BF%97/</guid><description>
&lt;!-- # JAMStack 初体验 - 基于 Pocket 和 Gatsby 构建你的「网络日志」 -->
&lt;p>折腾了自己的专属 RSS 信息流，每天都能从那些高质量的信息源中获得不少干货知识，一般就会顺手收藏一下。有一天突然想起自己收藏的那些文章，本身不就是经过二次筛选的高质量文章吗？于是便在构想能不能通过某种方式将这个信息源也公开出来，一方面是记录，另一方面也是间接地展示自己。恰逢遇见&lt;strong>JAMStack&lt;/strong>，最近在国外非常火，国内的阿里和腾讯也在跟进，搞静态托管那一套。经多方物色，最终确定基于&lt;code>Pocket API&lt;/code>+&lt;code>Gatsby&lt;/code>来构建这样一个自己的「网络日志」。&lt;/p>
&lt;blockquote>
&lt;p>You are what you read.&lt;/p>
&lt;/blockquote>
&lt;h2 id="简谈-jamstack">
简谈 JAMStack
&lt;a href="#%e7%ae%80%e8%b0%88-jamstack" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;blockquote>
&lt;p>JAMStack 即基于客户端 &lt;strong>J&lt;/strong>avaScript，可重用 &lt;strong>A&lt;/strong>PI 和预先构建 &lt;strong>M&lt;/strong>arkup 的现代 Web 开发架构。当我们谈论“堆栈”时，我们不再谈论操作系统，特定 Web JAMStack 与特定技术无关。这是一种构建网站和应用程序的新方法，可提供更好的性能，更高的安全性，更低的扩展成本以及更好的开发人员体验。&lt;/p>
&lt;/blockquote>
&lt;p>JAMStack 是一种新颖的网站架构，与传统的服务端渲染和近些年国内流行的前后端分离等架构不同的是，他的网页是静态的，可以托管在 CDN 上，内容是动态的，可以方便地进行修改。&lt;/p>
&lt;p>&lt;strong>JAMStack 几个显著的优势&lt;/strong>：&lt;/p>
&lt;ul>
&lt;li>页面为静态，TTFT（TimeToFirstByte）的时间可以降到非常低&lt;/li>
&lt;li>页面为静态，服务器遭受的安全风险要低得多&lt;/li>
&lt;li>不同于客户端渲染，JAMStack 对 SEO 会非常友好&lt;/li>
&lt;li>不同于传统纯静态网站，内容可以方便地动态更新&lt;/li>
&lt;/ul>
&lt;h2 id="为什么选择-gatsby">
为什么选择 Gatsby
&lt;a href="#%e4%b8%ba%e4%bb%80%e4%b9%88%e9%80%89%e6%8b%a9-gatsby" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>作为一个网站生成器 Site Generator，Gastby 的入门门槛其实是较高的，相对于 Hexo、Hugo 那种简简单单配置下就是一个站点，Gatsby 的难度要更高，因为其灵活度更大，所有的配置、页面都是 Javascript 来配置的，当然你也可以使用 Typescript。其基于 React，生态丰富且灵活度高，天生&lt;code>GarphQL&lt;/code>是选择它的主要原因。&lt;/p>
&lt;h2 id="网站架构及效果">
网站架构及效果
&lt;a href="#%e7%bd%91%e7%ab%99%e6%9e%b6%e6%9e%84%e5%8f%8a%e6%95%88%e6%9e%9c" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>流程：&lt;/p>
&lt;ol>
&lt;li>我在其他地方看到不错的文章，将其收藏到 Pocket&lt;/li>
&lt;li>定时任务，从&lt;code>Pocket API&lt;/code>获取文章数据，交给 Gatsby 生成站点&lt;/li>
&lt;li>自动部署，将生成的静态文件部署到 CDN&lt;/li>
&lt;li>&lt;a href="https://reading.colinx.one">reading.colinx.one&lt;/a>站点主页就会出现我收藏的文章啦&lt;/li>
&lt;/ol>
&lt;p>这其中，Gastby 充当的是&lt;strong>Site Generator&lt;/strong>的角色，而数据来源为我的&lt;code>Pocket API&lt;/code>，也就是我把 Pocket 作为&lt;strong>Headless CMS&lt;/strong>来管理我的数据，可以方便地进行更新和管理。&lt;/p>
&lt;h2 id="总结">
总结
&lt;a href="#%e6%80%bb%e7%bb%93" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>项目已经开源，地址在&lt;a href="https://github.com/Colin-XKL/Colinx-Reading">https://github.com/Colin-XKL/Colinx-Reading.git&lt;/a>。你也可以去申请自己的 Pocket API 然后部署你自己的站点。&lt;/p>
&lt;p>初始尝试 JAMStack，感觉对于博客、文档这类的站点会非常友好，国外比较火的像 Shopify 这种的无头电商也不错，国内的碍于国情应该不大可能了。&lt;/p>
&lt;h2 id="链接">
链接
&lt;a href="#%e9%93%be%e6%8e%a5" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Welcome to the Gatsby Way of Building | Gatsby
&lt;a href="https://www.gatsbyjs.com/docs/">https://www.gatsbyjs.com/docs/&lt;/a>&lt;/li>
&lt;li>For fast and secure sites | Jamstack
&lt;a href="https://jamstack.org/">https://jamstack.org/&lt;/a>&lt;/li>
&lt;/ul></description></item></channel></rss>