<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>RSS on Colinx Blog</title><link>/tags/rss/</link><description>Recent content in RSS on Colinx Blog</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sun, 08 May 2022 00:00:00 +0000</lastBuildDate><atom:link href="/tags/rss/index.xml" rel="self" type="application/rss+xml"/><item><title>Huginn 指南：为任意网站制作 RSS</title><link>/posts/huginn%E6%8C%87%E5%8D%97%E4%B8%BA%E4%BB%BB%E6%84%8F%E7%BD%91%E7%AB%99%E5%88%B6%E4%BD%9Crss/</link><pubDate>Sun, 08 May 2022 00:00:00 +0000</pubDate><guid>/posts/huginn%E6%8C%87%E5%8D%97%E4%B8%BA%E4%BB%BB%E6%84%8F%E7%BD%91%E7%AB%99%E5%88%B6%E4%BD%9Crss/</guid><description>
&lt;!-- # Huginn 指南：为任意网站制作 RSS -->
&lt;p>Huginn 使用多个不同功能的 Agent 组合搭配来实现一系列功能，一个 Agent 可以执行特定的操作，并产生一个 Event，你可以指定他产生的 Event 由哪个 Agent 接收处理。&lt;/p>
&lt;p>比如我们需要使用 WebSite Agent 来爬取某个网站上的列表内容，爬取后列表的每一项会生成一个 Event，我们可以指定一个 Output Agent 来接收这些 Event，并将其转换为 RSS 的格式进行输出，复制 Output Agent 返回给你的 URL 就可以进行订阅啦，Huginn 爬取网站生成 RSS 的基本原理就是这样。&lt;/p>
&lt;h2 id="huginn-爬取普通网页制作-rss">
Huginn 爬取普通网页制作 RSS
&lt;a href="#huginn-%e7%88%ac%e5%8f%96%e6%99%ae%e9%80%9a%e7%bd%91%e9%a1%b5%e5%88%b6%e4%bd%9c-rss" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>右键网页打开开发者工具，屏幕会分出一部分空间显示开发者工具窗口，点击左上角的按钮再把鼠标移动到页面上可以选择页面的某一个元素，比如这里我们要爬取推荐文章列表，推荐文章列表的每一项都有同样的样式，我们可以使用 CSS 选择器来指定爬取该项&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207138.png" alt="image-20220508160659378">&lt;/p>
&lt;p>该元素可以用 CSS 选择器&lt;code>.meiwen&lt;/code>选择到。&lt;/p>
&lt;p>&lt;strong>Tips:&lt;/strong> class=xxx 则使用&lt;code>.xxx&lt;/code>,如果为 id=xxx 则使用&lt;code>#xxx&lt;/code>&lt;/p>
&lt;p>该标签是 a 标签，我们可以继续限定一下条件，使用&lt;code>a.meiwen&lt;/code>&lt;/p>
&lt;p>如果要限制必须是 h2 标签下的带有 meiwen 的 class 属性的 a 标签，可以使用&lt;code>h2 a.meiwen&lt;/code>&lt;/p>
&lt;p>如果要再加一个限制，是列表元素 li 下面的 h2 标签里带有 meiwen 的 class 属性的 a 标签，可以使用&lt;code>li h2 a.meiwen&lt;/code>&lt;/p>
&lt;p>添加其他附加限定条件以此类推&lt;/p>
&lt;p>你也可以在右侧 Style 面板里点击加号添加一个自定义样式，输入 CSS 选择器，浏览器会自动高亮符合条件的网页元素，你可以使用这个功能来检验你写的 CSS 选择器是否正确以及是不是提取的你想要的内容&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207716.png" alt="image-20220508163359806">&lt;/p>
&lt;p>接下来在 Huginn 里创建一个 Scenario，然后点击新建一个 Agent，类型选择 WebSite Agent，填写一个名称，并在最下面的配置处指定你要爬取的网页元素&lt;/p>
&lt;blockquote>
&lt;h6 id="website-agent">
&lt;strong>Website Agent&lt;/strong>
&lt;a href="#website-agent" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h6>
&lt;p>The Website Agent scrapes a website, XML document, or JSON feed and creates Events based on the results.&lt;/p>
&lt;/blockquote>
&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-json" data-lang="json">&lt;span style="color:#960050;background-color:#1e0010">url:&lt;/span> {
&lt;span style="color:#960050;background-color:#1e0010">css:&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">li&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">h2&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">a.meiwen&lt;/span>
&lt;span style="color:#960050;background-color:#1e0010">value:&lt;/span> &lt;span style="color:#960050;background-color:#1e0010">@href&lt;/span>
}
&lt;/code>&lt;/pre>&lt;/div>&lt;p>以爬取 url 为例，css 表示使用 css 选择器选择网页元素，value 表示从哪里获取对应的值，对于刚才我们选取的一个元素来说&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-html" data-lang="html">&amp;lt;&lt;span style="color:#f92672">a&lt;/span> &lt;span style="color:#a6e22e">class&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;meiwen&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">href&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;/article/58030.html&amp;#34;&lt;/span> &lt;span style="color:#a6e22e">title&lt;/span>&lt;span style="color:#f92672">=&lt;/span>&lt;span style="color:#e6db74">&amp;#34;缘起则聚，缘灭则散&amp;#34;&lt;/span>&amp;gt;缘起则聚，缘灭则散&amp;lt;/&lt;span style="color:#f92672">a&lt;/span>&amp;gt;
&lt;/code>&lt;/pre>&lt;/div>&lt;p>href 属性里面的内容是他的链接，title 属性里面的内容则是他的标题。接下来在 value 中填写&lt;code>@href&lt;/code>指定从 href 属性提取内容，就可以取到链接地址了&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Pro Tips:&lt;/strong>&lt;/p>
&lt;p>如果是纯文本节点或是想提取标签内嵌的文本，value 里可以填写&lt;code>string(.)&lt;/code>&lt;/p>
&lt;p>如果想删除多余的空格，可以使用&lt;code>normalize-space(.)&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;p>&lt;strong>Pro Tips 2:&lt;/strong>&lt;/p>
&lt;p>字符串处理函数和标签属性值变量可以一起使用，如&lt;code>normalize-space(@title)&lt;/code>可以获取该标签的 title 属性值并删除多余的空白字符&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207717.png" alt="image-20220508163714342">&lt;/p>
&lt;p>接下来点击 Dry Run 按钮进行测试，不出意外我们会得到一个 json 的输出，里面包括我们爬取到的每一项他的 url 和 title。&lt;/p>
&lt;p>如果没有成功，你可能需要删掉上面没有使用到的 hovertext 节点，因为该项指定的内容在我们刚才的网页中并不存在。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207718.png" alt="image-20220508164259295">&lt;/p>
&lt;p>点击 Save 保存，我们开始下一步输出 RSS。在刚才的 Scenario 中再新建一个 Agent，选择 Data Output Agent，并设置他的名字和 Source Agent&lt;/p>
&lt;blockquote>
&lt;h6 id="data-output-agent">
Data output Agent
&lt;a href="#data-output-agent" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h6>
&lt;p>The Data Output Agent outputs received events as either RSS or JSON. Use it to output a public or private stream of Huginn data.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207719.png" alt="image-20220508164941647">&lt;/p>
&lt;p>&lt;strong>Propagate immediately&lt;/strong>是指即时处理来自 Source Agent 的 Event，启用他方便我们调试，但会略微增加服务器负载，你可以自行决定是否使用。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207720.png" alt="image-20220508165345792">&lt;/p>
&lt;p>在 secret 字段中为你的这个 RSS 标注一个英文的名字，修改 title 字段标注你的 RSS 的名字。item 字段是每条文章会有的属性，一般来说主要就 title 和 link，分别设置为上文我们提取的值的变量名。这里添加一个 guid 字段，这是一篇文章的唯一标识符，避免 RSS 阅读器读到的文章标题不同但是内容相同，常见于某篇文章的标题被修改，这会导致 RSS 阅读器内出现多篇重复文章。&lt;/p>
&lt;p>此外建议增加一个 link 字段，值设置为与爬取的网站的主域名一致，避免网站内使用相对链接开头的资源无法正常加载。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207721.png" alt="image-20220508170038722">&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207722.png" alt="image-20220508170115192">&lt;/p>
&lt;p>点击 Save 保存，回到 Scenario 界面，第一次需要手动点击运行一下刚才的 Website Agent。稍等片刻后台会进行爬取，右上角会显示产生了多少个 Event。再点开刚才设置的 Data Output Agent 查看详情，vola！右侧就会显示生成的 RSS 链接了，复制以 xml 结尾的链接到 RSS 阅读器中就可以订阅啦🎉&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207723.png" alt="image-20220508170212112">&lt;/p>
&lt;p>如果你的配置正确但是 WebSite Agent 又没有输出任何内容的话，那么你要爬取的站点的内容应该是通过 JavaScript 在你带开浏览器时动态生成的。&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Pro Tips:&lt;/strong>&lt;/p>
&lt;p>你可以右键网页在开发人员菜单中点击显示源代码，然后用 Ctrl+F 搜索你在页面上见到的想爬取的某一条内容，如果有说明该网站的页面时静态的，否则说明你要爬取的内容并不是静态的。&lt;/p>
&lt;/blockquote>
&lt;p>要爬取这样的站点，我们需要模拟浏览器操作，执行页面上的 JavaScript 脚本，待数据生成完毕后再使用上面的方法去爬取内容。要模拟浏览器操作，这里介绍两个方案：一个是利用 browserless 的无头浏览器，另一个是使用在线 PhatomJS 服务。&lt;/p>
&lt;h2 id="使用-huginnbrowserless-为动态网页生成-rss">
使用 Huginn+Browserless 为动态网页生成 RSS
&lt;a href="#%e4%bd%bf%e7%94%a8-huginnbrowserless-%e4%b8%ba%e5%8a%a8%e6%80%81%e7%bd%91%e9%a1%b5%e7%94%9f%e6%88%90-rss" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>部署了&lt;a href="https://github.com/Colin-XKL/RSSmanX">RSS Man X&lt;/a>的完整版的话默认已经包含 huginn 和 browserless 服务，无需重复安装。且 huginn 可以通过&lt;code>service.browserless:3000&lt;/code>访问到 browserless 服务。&lt;/p>
&lt;p>总体步骤与上文一样，不过因为被抓取的内容是通过 JavaScript 动态生成的，所以直接使用 WebSite Agent 是抓取不到东西的，我们需要先使用 Post Agent 向 browserless 服务发送指令，让他帮我们模拟浏览器操作，再将最终完整的网页返回给我们，再使用 WebSite Agent 进行后续处理。&lt;/p>
&lt;blockquote>
&lt;h6 id="post-agent">
&lt;strong>Post Agent&lt;/strong>
&lt;a href="#post-agent" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h6>
&lt;p>A Post Agent receives events from other agents (or runs periodically), merges those events with the Liquid-interpolated contents of payload, and sends the results as POST (or GET) requests to a specified url. To skip merging in the incoming event, but still send the interpolated payload, set no_merge to true.&lt;/p>
&lt;/blockquote>
&lt;p>接下来以&lt;a href="https://pccz.court.gov.cn/pcajxxw/pcgg/ggdh?lx=0">这个网站&lt;/a>为例介绍一下，这个列表页的内容是由 JavaScript 动态生成的&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207724.png" alt="image-20220508205159783">&lt;/p>
&lt;p>按照以下内容设置你的 Post Agent&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-json" data-lang="json">{
&lt;span style="color:#f92672">&amp;#34;post_url&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;http://service.browserless:3000/content&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;expected_receive_period_in_days&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;1&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;content_type&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;json&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;method&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;post&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;payload&amp;#34;&lt;/span>: {
&lt;span style="color:#f92672">&amp;#34;url&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://pccz.court.gov.cn/pcajxxw/pcgg/ggdh?lx=0&amp;#34;&lt;/span>
},
&lt;span style="color:#f92672">&amp;#34;headers&amp;#34;&lt;/span>: {
&lt;span style="color:#f92672">&amp;#34;Cache-Control&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;no-cache&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;Content-Type&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;application/json&amp;#34;&lt;/span>
},
&lt;span style="color:#f92672">&amp;#34;emit_events&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;true&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;no_merge&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;false&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;output_mode&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;clean&amp;#34;&lt;/span>
}
&lt;/code>&lt;/pre>&lt;/div>&lt;p>其中&lt;code>post_url&lt;/code>为你的 browserless 实例地址，如果你使用了 RSS MAN X 里的 Huginn 可以直接向上面一样填写。&lt;code>payload&lt;/code>中的&lt;code>url&lt;/code>字段填写你需要的网页地址。注意 emit_events 要设置为&lt;code>true&lt;/code>，这样才方便我们后续使用 WebSite Agent 操作。&lt;/p>
&lt;p>点击 Dry Run，如果能返回一个带有&lt;code>body&lt;/code>字段且里面有文本内容说明调用成功。&lt;/p>
&lt;p>调用不成功检查一下配置，以及是不是我们的爬虫被目标网站拦截了。若是爬虫被拦截可参考文末的解决方案。&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207725.png" alt="image-20220508195731732">&lt;/p>
&lt;p>接下来点击 Save 保存，再新建一个 Website Agent，Source 设置为刚才的 Post Agent。&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-json" data-lang="json">{
&lt;span style="color:#f92672">&amp;#34;expected_update_period_in_days&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;2&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;data_from_event&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;{{ body }}&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;html&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;mode&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;on_change&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;extract&amp;#34;&lt;/span>: {
&lt;span style="color:#f92672">&amp;#34;url&amp;#34;&lt;/span>: {
&lt;span style="color:#f92672">&amp;#34;css&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;ul#wslb li a&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;value&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;normalize-space(@href)&amp;#34;&lt;/span>
},
&lt;span style="color:#f92672">&amp;#34;title&amp;#34;&lt;/span>: {
&lt;span style="color:#f92672">&amp;#34;css&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;ul#wslb li a&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;value&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;@title&amp;#34;&lt;/span>
},
&lt;span style="color:#f92672">&amp;#34;author&amp;#34;&lt;/span>: {
&lt;span style="color:#f92672">&amp;#34;css&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;ul#wslb li div.center&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;value&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;normalize-space(.)&amp;#34;&lt;/span>
}
}
}
&lt;/code>&lt;/pre>&lt;/div>&lt;p>注意修改&lt;code>data_from_event&lt;/code>的值，其他地方与爬取普通网站一样。再新建并配置一下 Output Agent，RSS 的链接就出来了&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207726.png" alt="image-20220508205856407">&lt;/p>
&lt;h2 id="使用-phantomjs-为动态页面生成-rss">
使用 PhantomJS 为动态页面生成 RSS
&lt;a href="#%e4%bd%bf%e7%94%a8-phantomjs-%e4%b8%ba%e5%8a%a8%e6%80%81%e9%a1%b5%e9%9d%a2%e7%94%9f%e6%88%90-rss" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>首先需要到&lt;a href="https://phantomjscloud.com">Phantom Js Cloud 的官网&lt;/a>注册一个账户，每个账户官方提供了一定的免费额度，每天大概可以爬取 500 个页面，对于做 RSS 来说妥妥的够用了。注册之后可以得到一个 API KEY，这个待会会使用到。&lt;/p>
&lt;p>接下来新建一个 Phantom JS Cloud Agent，填写基本的名称、API KEY 和目标 URL，render type 选择 html。底下 User Agent 建议改用真实的浏览器 UA，减少触发反爬虫的可能性。如果不知道自己的 UA 可以到这个网站查看当前浏览器的 UA，复制字符串即可。如果懒得查也可以用这个&lt;/p>
&lt;pre tabindex="0">&lt;code>Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.81 Safari/537.36
&lt;/code>&lt;/pre>&lt;blockquote>
&lt;h6 id="phantom-js-cloud-agent">
Phantom JS Cloud Agent
&lt;a href="#phantom-js-cloud-agent" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h6>
&lt;p>This Agent generates PhantomJs Cloud URLs that can be used to render JavaScript-heavy webpages for content extraction.&lt;/p>
&lt;p>URLs generated by this Agent are formulated in accordance with the PhantomJs Cloud API. The generated URLs can then be supplied to a Website Agent to fetch and parse the content. Sign up to get an api key, and add it in Huginn credentials.&lt;/p>
&lt;/blockquote>
&lt;p>点击 Dry Run 后会返回一条 url，返回格式类似这样&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-json" data-lang="json">[
{
&lt;span style="color:#f92672">&amp;#34;url&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;https://phantomjscloud.com/api/browser/xxxxxxx&amp;#34;&lt;/span>
}
]
&lt;/code>&lt;/pre>&lt;/div>&lt;p>之后创建一个 WebSite Agent，Source Agent 设置为上面的 Phantom JS Cloud Agent，然后稍微改一下 url 的部分&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-json" data-lang="json">{
&lt;span style="color:#f92672">&amp;#34;expected_update_period_in_days&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;2&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;url_from_event&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;{{url}}&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;type&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;html&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;mode&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;on_change&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;extract&amp;#34;&lt;/span>: {&lt;span style="color:#960050;background-color:#1e0010">...&lt;/span>}
}
&lt;/code>&lt;/pre>&lt;/div>&lt;p>注意将原来的&lt;code>url:??&lt;/code>的部分更改为&lt;code>&amp;quot;url_from_event&amp;quot;: &amp;quot;{{url}}&amp;quot;&lt;/code>,这样就指定使用 Phantom JS Cloud 为我们获取的完整网页，接下来的操作就大同小异了。配置好要爬取的字段和规则后点击 Dry Run 就可以看到结果&lt;/p>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207727.png" alt="image-20220508215636780">&lt;/p>
&lt;p>这里是刚才的 Agent 产生的一个 Event。这里除了 url 和 title 我还提取了 date 字段。在 Output Agent 中，可以配置为每一条文章输出发布时间的信息。对于这种规整的日期字母串，可以使用&lt;code>{{ date | date: %F }}&lt;/code>进行解析并格式化输出为 rss 规范的时间格式如果没有配置的话，每篇文章的发布时间显示的都是一样的，为 Huginn 爬虫更新的时间。&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-json" data-lang="json">&lt;span style="color:#e6db74">&amp;#34;item&amp;#34;&lt;/span>&lt;span style="color:#960050;background-color:#1e0010">:&lt;/span> {
&lt;span style="color:#f92672">&amp;#34;title&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;{{title}}&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;link&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;{{url}}&amp;#34;&lt;/span>,
&lt;span style="color:#f92672">&amp;#34;pubDate&amp;#34;&lt;/span>: &lt;span style="color:#e6db74">&amp;#34;{{ date | date: %F }}&amp;#34;&lt;/span>
}&lt;span style="color:#960050;background-color:#1e0010">,&lt;/span>
&lt;/code>&lt;/pre>&lt;/div>&lt;blockquote>
&lt;p>&lt;strong>Pro Tips:&lt;/strong>&lt;/p>
&lt;p>Huginn 解析日期&lt;/p>
&lt;p>注意&lt;code>{{ date | date: %F }}&lt;/code>里面，第一个&lt;code>date&lt;/code>是上面的 Website Agent 产生的 Event 里面的变量名，第二个&lt;code>date&lt;/code>是 Huginn 使用的 Liquid 模版引擎语法里内置的一个 filter，可以理解为有特定功能的函数&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://blog-1301127393.file.myqcloud.com/BlogImgs/202205082207637.png" alt="image-20220508220438696">&lt;/p>
&lt;h2 id="faq">
FAQ
&lt;a href="#faq" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>为什么启动 docker 容器后访问 Huginn 显示网络错误？&lt;/strong>&lt;/p>
&lt;p>Huignn 冷启动较慢，需要等待三五分钟。如果还是不行，检查端口映射和防火墙设置&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>为什么抓取到的包含相对路径的结果，网页上可以点击访问，但是生成的 RSS 不能正常使用？&lt;/strong>&lt;/p>
&lt;p>检查 link 的设置，有些网站只是域名，有些网站有子目录，具体查看该网页源码中 head 节点里 base url 的设置&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>如何对爬取到的某一项的字符串做更高级更复杂的处理？&lt;/strong>&lt;/p>
&lt;p>可以参考&lt;a href="https://github.com/huginn/huginn/wiki/Formatting-Events-using-Liquid">Hugnn 官方对 Liquid 语法的文档&lt;/a>以及&lt;a href="https://shopify.dev/api/liquid">Shopify 官方关于 Liquid 模板的语法文档&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>为什么部署了 Huginn，等了很长时间都无法访问后台页面？&lt;/strong>&lt;/p>
&lt;p>若部署后某个应用一直无法通过浏览器访问，请检查是否绑定到了 6000/6666 等特殊端口，浏览器会拦截对这些端口的访问参见&lt;a href="https://blog.colinx.one/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/">这里&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Huginn 爬虫访问目标网站被拦截了怎么解决&lt;/strong>&lt;br>
介绍几个基本的反反爬虫策略：&lt;/p>
&lt;ol>
&lt;li>带上 User Agent，要求是真实的浏览器 UA。&lt;/li>
&lt;li>Browserless 去掉默认会和请求一起发送的可以被识别为爬虫的特征参数，设置 browserless 的环境变量&lt;code>DEFAULT_HEADLESS=false&lt;/code>&lt;/li>
&lt;li>使用随机代理 IP，适用于因爬取频率达到爬虫阈值&lt;/li>
&lt;/ol>
&lt;/li>
&lt;/ul>
&lt;h2 id="扩展阅读">
扩展阅读
&lt;a href="#%e6%89%a9%e5%b1%95%e9%98%85%e8%af%bb" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>&lt;a href="https://github.com/huginn/huginn/wiki/">Huginn 官方文档&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://shopify.dev/api/liquid/filters/">Liquid 模板引擎语法官方文档&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.colinx.one/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/">RSS Man X 部署指南&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.colinx.one/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/">docker compose 的错误使用姿势&lt;/a>&lt;/li>
&lt;/ul></description></item><item><title>RSSManX 安装部署指南</title><link>/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/</link><pubDate>Sat, 07 May 2022 00:00:00 +0000</pubDate><guid>/posts/rssmanx%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97/</guid><description>
&lt;!-- # RSSManX 安装部署指南 -->
&lt;p>RSS Man X 是我两年前入坑 RSS 后，为了方便更多人更方便地使用 RSS 所发起的一个项目，主要是用 docker-compose 整合了一些常用的服务如 TTRSS、RSSHub、Huginn、OpenCC 等并进行了一些优化调整，如自动更新，反反爬虫等。这篇文章会尽可能详尽地讲解安装部署的步骤以及安装过程中可能会遇到的一些问题。&lt;/p>
&lt;p>RSS Man X 会利用到 docker 和 docker-compose，首先需要确保你的服务器正确安装了这些软件&lt;/p>
&lt;h2 id="1-docker-环境准备">
1. Docker 环境准备
&lt;a href="#1-docker-%e7%8e%af%e5%a2%83%e5%87%86%e5%a4%87" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>检查服务器中是否已经安装了 docker 和 docker-compose，并检查他们的版本是否太老。比如输入&lt;code>docker --version&lt;/code>来检查 docker 的版本&lt;/p>
&lt;p>docker 的版本建议不要低于 19，docker-compose 的版本建议不要低于 1.20&lt;br>
(注：Docker 新版本可使用&lt;code>docker compose&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-shell" data-lang="shell">~ » docker --version
Docker version 20.10.12, build 20.10.12-0ubuntu2~20.04.1
&lt;/code>&lt;/pre>&lt;/div>&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-shell" data-lang="shell">~ » docker-compose --version
docker-compose version 1.25.0, build unknown
&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果上面命令执行后提示&lt;code>command not found&lt;/code>，那么说明并没有安装对应的软件包（或是安装的路径并不在当前用户的 PATH 变量中，尝试切换到 root 操作，详细的原因和解决方法见后文）&lt;/p>
&lt;h3 id="11-ubuntudebian-安装-docker">
1.1 Ubuntu/Debian 安装 Docker
&lt;a href="#11-ubuntudebian-%e5%ae%89%e8%a3%85-docker" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>ubuntu 和 debian 主要是用 apt 安装和管理软件包，可以使用以下命令来安装，根据实际情况选择是否要加 sudo。下面以 Ubuntu 为例。Debian 下的安装略有不同，可以参见&lt;a href="https://docs.docker.com/engine/install/debian/">Docker 官方文档&lt;/a>，以及&lt;a href="https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/">清华镜像源&lt;/a>。其中&lt;code>download.docker.com&lt;/code>连接不同的可以尝试讲域名部分更换为&lt;a href="https://mirrors.ustc.edu.cn/help/docker-ce.html">中科大提供的镜像&lt;/a>地址&lt;code>mirrors.ustc.edu.cn/docker-ce&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-shell" data-lang="shell">&lt;span style="color:#75715e"># 首先移除老旧的软件包&lt;/span>
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
&lt;span style="color:#75715e"># 安装一些必要的依赖&lt;/span>
sudo apt-get install &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> ca-certificates &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> curl &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> gnupg &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> lsb-release
&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果你的服务器在墙外，可以直接使用 docker 官方的软件源&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-shell" data-lang="shell">curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> &lt;span style="color:#e6db74">&amp;#34;deb [arch=&lt;/span>&lt;span style="color:#66d9ef">$(&lt;/span>dpkg --print-architecture&lt;span style="color:#66d9ef">)&lt;/span>&lt;span style="color:#e6db74"> signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] 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"> stable&amp;#34;&lt;/span> | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果你的服务器在墙内，可以使用由中科大提供的镜像&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-shell" data-lang="shell">curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> &lt;span style="color:#e6db74">&amp;#34;deb [arch=&lt;/span>&lt;span style="color:#66d9ef">$(&lt;/span>dpkg --print-architecture&lt;span style="color:#66d9ef">)&lt;/span>&lt;span style="color:#e6db74"> signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.ustc.edu.cn/docker-ce/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"> stable&amp;#34;&lt;/span> | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/code>&lt;/pre>&lt;/div>&lt;p>导入 docker 软件源后即可开始安装 docker，安装完成后可以输入&lt;code>docker --version&lt;/code>来检查 docker 的版本&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-shell" data-lang="shell">sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="12-centosfedora-安装-docker">
1.2 CentOS/Fedora 安装 Docker
&lt;a href="#12-centosfedora-%e5%ae%89%e8%a3%85-docker" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>CentOS 和 Fedora 使用 yum 安装和管理软件包，新版本则是使用 dnf，不过两者功能一致且高度兼容。下面以 CentOS 为例，Fedora 可参见&lt;a href="https://docs.docker.com/engine/install/fedora/">官方文档&lt;/a>或&lt;a href="https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/">清华镜像源&lt;/a>&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-shell" data-lang="shell">&lt;span style="color:#75715e"># 1. 首先移除老旧的软件包&lt;/span>
sudo yum remove docker &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> docker-client &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> docker-client-latest &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> docker-common &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> docker-latest &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> docker-latest-logrotate &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> docker-logrotate &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> docker-engine
&lt;span style="color:#75715e"># 2.&lt;/span>
sudo yum install -y yum-utils
&lt;span style="color:#75715e"># 3.A 之后使用官方docker软件库&lt;/span>
sudo yum-config-manager &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> --add-repo &lt;span style="color:#ae81ff">\
&lt;/span>&lt;span style="color:#ae81ff">&lt;/span> https://download.docker.com/linux/centos/docker-ce.repo
&lt;span style="color:#75715e"># 3.B 墙内方案&lt;/span>
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo sed -i &lt;span style="color:#e6db74">&amp;#39;s+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+&amp;#39;&lt;/span> /etc/yum.repos.d/docker-ce.repo
&lt;span style="color:#75715e"># 4. 即可开始安装&lt;/span>
sudo yum update
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="13-安装或更新-docker-compose">
1.3 安装或更新 docker-compose
&lt;a href="#13-%e5%ae%89%e8%a3%85%e6%88%96%e6%9b%b4%e6%96%b0-docker-compose" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>docker-compose 目前有两个主要版本 V1 和 V2，都是可用的。V1 使用 Python 编写，使用时类似&lt;code>sudo docker-compose up -d&lt;/code>，V2 则是 Golang 编写，与前者高度兼容，但是是作为 docker 的插件安装的，使用时类似&lt;code>sudo docker compose up -d&lt;/code>，中间的短杠不需要了。&lt;/p>
&lt;p>如果是按照上文的步骤安装的 docker，那么默认已经安装了 docker compose v2，可以通过&lt;code>docker compose version&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-shell" data-lang="shell">~ » docker compose version
Docker Compose version v2.3.3
&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果需要是安装的比较老的 v1 版本的 docker-compose，想要单纯更新 docker-compose 而又不想动其他东西的话，可以更新安装 v1 版本的 docker-compose。&lt;/p>
&lt;p>首先删除老旧版本（如果有的话）&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-shell" data-lang="shell">rm $DOCKER_CONFIG/cli-plugins/docker-compose
sudo rm /usr/local/lib/docker/cli-plugins/docker-compose
pip uninstall docker-compose
&lt;/code>&lt;/pre>&lt;/div>&lt;p>然后使用 pip 来安装&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-shell" data-lang="shell">pip3 install docker-compose
&lt;/code>&lt;/pre>&lt;/div>&lt;p>墙内也可以临时使用镜像源下载&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-shell" data-lang="shell">pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple
&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果提示 pip 命令不存在需要先安装一下&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-shell" data-lang="shell">&lt;span style="color:#75715e"># Ubuntu/Debian&lt;/span>
sudo apt install python3-pip
&lt;span style="color:#75715e"># CentOS/Fedora&lt;/span>
sudo yum install python3-pip
&lt;/code>&lt;/pre>&lt;/div>&lt;p>如果 pip 报错试着升级一下 pip 的版本&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-shell" data-lang="shell">python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip
&lt;/code>&lt;/pre>&lt;/div>&lt;h3 id="14-为-docker-配置镜像源">
1.4 为 Docker 配置镜像源
&lt;a href="#14-%e4%b8%ba-docker-%e9%85%8d%e7%bd%ae%e9%95%9c%e5%83%8f%e6%ba%90" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;p>如果 Docker 下载镜像非常慢，你可能需要单独配置一下 Docker 的镜像源。==&lt;strong>注意：Docker 安装软件源的镜像和 Docker 镜像或者说映像的国内源并不是同一个，英文表述可能更准确一些：&lt;/strong>==&lt;/p>
&lt;ul>
&lt;li>上文安装 docker 时配置的是 docker 的 repo，repo 里含有 docker 的软件包，&lt;a href="https://mirrors.ustc.edu.cn/help/docker-ce.html">国内的镜像&lt;/a>为 Docker CE 安装软件包的镜像&lt;/li>
&lt;li>现在我们要配置的是 Docker Hub 的 Mirror，Docker 里拉取 Image 默认会访问&lt;a href="https://hub.docker.com">Docker Hub&lt;/a>，国内有多个 Docker Hub 镜像或是 Docker 镜像加速器，如&lt;a href="https://mirrors.ustc.edu.cn/help/dockerhub.html">中科大的源&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>在&lt;code>/etc/docker/daemon.json&lt;/code>文件中写入以下内容，如不存在可先行创建，注意 json 中列表的最后一项末尾是没有逗号的&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-json" data-lang="json">{
&lt;span style="color:#f92672">&amp;#34;registry-mirrors&amp;#34;&lt;/span>: [
&lt;span style="color:#e6db74">&amp;#34;https://hub-mirror.c.163.com&amp;#34;&lt;/span>,
&lt;span style="color:#e6db74">&amp;#34;https://mirror.baidubce.com&amp;#34;&lt;/span>,
&lt;span style="color:#e6db74">&amp;#34;https://docker.nju.edu.cn&amp;#34;&lt;/span>,
&lt;span style="color:#e6db74">&amp;#34;https://docker.mirrors.sjtug.sjtu.edu.cn&amp;#34;&lt;/span>,
&lt;span style="color:#e6db74">&amp;#34;https://dockerproxy.com&amp;#34;&lt;/span>,
&lt;span style="color:#e6db74">&amp;#34;https://docker.m.daocloud.io&amp;#34;&lt;/span>
]
}
&lt;/code>&lt;/pre>&lt;/div>&lt;p>update 20230720: 部分镜像源不再可用，更新镜像源配置。参考 &lt;a href="https://gist.github.com/y0ngb1n/7e8f16af3242c7815e7ca2f0833d3ea6">https://gist.github.com/y0ngb1n/7e8f16af3242c7815e7ca2f0833d3ea6&lt;/a>&lt;/p>
&lt;p>配置完成后&lt;code>sudo systemctl restart docker&lt;/code>重启 docker 服务，然后输入&lt;code>sudo docker info&lt;/code>，在输出结果的末尾可以看到&lt;code>Registry Mirrors&lt;/code>里会出现我们刚刚配置的 Docker Hub 镜像&lt;/p>
&lt;p>群辉等 NAS 的系统并不是标准版 Linux，安装的也是魔改版 docker，上面的配置文件地址并不适用，建议自行搜索对应的文档或教程。&lt;/p>
&lt;h2 id="2-安装-rss-man-x">
2. 安装 RSS Man X
&lt;a href="#2-%e5%ae%89%e8%a3%85-rss-man-x" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h2>
&lt;p>&lt;a href="https://github.com/Colin-XKL/RSSmanX">RSS MAN X 项目&lt;/a>旨在为 RSS 的同好提供一个方便地搭建自己的 RSS 服务的捷径，毕竟不是所有 RSS 爱好者都懂代码 😂。RSS Man X 能够有 RSS 订阅管理、RSS 在线阅读界面，进阶功能包括服务健康自检、海外站点 RSS 解锁等，提供不同的版本供选择，三个版本的 &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;h3 id="21-安装流程">
2.1 安装流程
&lt;a href="#21-%e5%ae%89%e8%a3%85%e6%b5%81%e7%a8%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;code>git clone https://github.com/Colin-XKL/RSSmanX --depth=1&lt;/code>快速克隆本仓库，也可以通过&lt;a href="https://archive.fastgit.org/Colin-XKL/RSSmanX/archive/refs/heads/master.zip">这个镜像地址&lt;/a>下载仓库 zip 文件，&lt;a href="https://gitee.com/colin-xkl/RSSmanX">Gitee 上也有镜像&lt;/a>不过不经常更新。&lt;/p>
&lt;ol>
&lt;li>cd 进入文件夹，修改&lt;code>.env&lt;/code>中的值，如密码和 TTRSS 入口 URL 等&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;h3 id="22-相关事宜">
2.2 相关事宜
&lt;a href="#22-%e7%9b%b8%e5%85%b3%e4%ba%8b%e5%ae%9c" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;ol>
&lt;li>
&lt;p>访问你设置的 &lt;code>SELF_URL&lt;/code> 即可看到 Tiny Tiny RSS 的登陆页面，使用默认账户 &lt;code>admin&lt;/code>，密码 &lt;code>password&lt;/code> 登陆即可开始使用&lt;/p>
&lt;/li>
&lt;li>
&lt;p>如开启海外站点解锁支持，第一次冷启动需要等待 3-5 分钟才能完全启动所有组件。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>数据默认保存位置&lt;code>~/.docker/Database&lt;/code>（注意以执行 docker 命令的用户为准，如使用 root 账户执行，则文件位于 root 用户 home 目录）&lt;/p>
&lt;/li>
&lt;li>
&lt;p>默认情况下只有 TTRSS 和 Huginn 可以从外部访问，其他组件互相可以访问但不能直接从外部访问以提高安全性。组件间互相访问可以使用&lt;code>容器名+指定端口&lt;/code>，端口默认为 80，如&lt;code>http://rsshub/xxxxx&lt;/code>即可访问到 RSS Man X 内的监听 80 端口的 rsshub 实例。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>在 TTRSS 中将原来订阅的 &lt;code>https://rsshub.app/*&lt;/code> 更改为 &lt;code>http://rsshub/*&lt;/code> 即可使用 RSS Man X 内的自建 RSSHub 实例，并激活反反爬虫和海外源加速等功能&lt;/p>
&lt;/li>
&lt;li>
&lt;p>如无法访问 rsshub 的官方文档站点，可以使用我维护的反代站点&lt;a href="https://rsshub-doc.azure.colinx.one/">https://rsshub-doc.azure.colinx.one/&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>关于 ARM 平台的支持可查阅&lt;a href="https://github.com/Colin-XKL/RSSmanX/issues/5">置顶的 issue&lt;/a>，替换部分不支持 arm 架构的 docker 镜像为支持 arm 的镜像即可。&lt;/p>
&lt;/li>
&lt;li>
&lt;p>RSS Man X 的除 lite 以外的版本默认包含了自托管的 mercury 实例，你只需要在插件配置页面设置 mercury 实例地址为 &lt;code>service.mercury:3000&lt;/code> 即可，同理，OpenCC 实例地址为&lt;code>service.opencc:3000&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>如果部分 RSS 源不能订阅，检查是否使用了非常规端口。在&lt;code>.env&lt;/code>文件中设置&lt;code>RSS_ALLOW_PORTS&lt;/code>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>若部署后某个应用一直无法通过浏览器访问，请检查是否绑定到了&lt;code>6000&lt;/code>/&lt;code>6666&lt;/code>等特殊端口，浏览器会拦截对这些端口的访问参见&lt;a href="https://blog.colinx.one/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/">这里&lt;/a>&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;code>ls&lt;/code>没有显示&lt;code>.env&lt;/code>文件是因为以点开头的文件在 Linux 中都是默认隐藏的，可以使用&lt;code>ls -a&lt;/code>查看到&lt;/p>
&lt;/li>
&lt;li>
&lt;p>vi/vim 编辑文本太麻烦可以尝试使用 nano&lt;/p>
&lt;/li>
&lt;li>
&lt;p>RSS Man 里所有容器绑定了服务器的/etc/localtime，使用&lt;code>sudo timedatectl set-timezone Asia/Shanghai&lt;/code> 设定系统的时区为上海后，容器里的时区也可以同步，这样日志里的时间就是东八区了&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>&lt;strong>获取帮助&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>For Tiny tiny RSS problems:&lt;/strong>
&lt;a href="https://tt-rss.org/wiki.php">https://tt-rss.org/wiki.php&lt;/a>
&lt;a href="http://ttrss.henry.wang/">http://ttrss.henry.wang/&lt;/a>&lt;/li>
&lt;li>&lt;strong>For RSSHub problems:&lt;/strong>
&lt;a href="https://docs.rsshub.app/faq.html">https://docs.rsshub.app/faq.html&lt;/a>&lt;/li>
&lt;li>&lt;strong>For Huginn problems:&lt;/strong>
&lt;a href="https://github.com/huginn/huginn#readme">https://github.com/huginn/huginn#readme&lt;/a>&lt;/li>
&lt;/ul>
&lt;h3 id="23-链接">
2.3 链接
&lt;a href="#23-%e9%93%be%e6%8e%a5" class="h-anchor" aria-hidden="true">#&lt;/a>
&lt;/h3>
&lt;ul>
&lt;li>&lt;a href="https://blog.colinx.one/posts/%E6%88%91%E7%9A%84rss%E6%96%B9%E6%A1%88%E4%B8%8E%E5%BF%83%E5%BE%97/">我的 RSS 方案与心得&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://github.com/Colin-XKL/RSSmanX">RSS Man X GitHub repo&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.colinx.one/posts/huginn%E6%8C%87%E5%8D%97%E4%B8%BA%E4%BB%BB%E6%84%8F%E7%BD%91%E7%AB%99%E5%88%B6%E4%BD%9Crss/">Huginn 指南：为任意网站制作 RSS&lt;/a>&lt;/li>
&lt;li>&lt;a href="https://blog.colinx.one/posts/docker-compose%E7%9A%84%E9%94%99%E8%AF%AF%E4%BD%BF%E7%94%A8%E5%A7%BF%E5%8A%BF/">docker compose 的错误使用姿势&lt;/a>&lt;/li>
&lt;/ul></description></item><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></channel></rss>