在 youtube 和 twitter 中连刷两周,就会感到算法只推某一领域的东西,而且这个信息比较散乱,有重复性的信息。但是某一频道自己却不会发送重复信息,我只需要扫一眼某频道更新没,另外 youtube 的小铃铛并不好使。最终我选择了 Tiny Tiny RSS + rsshub + wewerss 的方案, Tiny Tiny RSS 是个有年头的 php 程序,虽然不是现代化 UI,但也满足需求,重要的是这个可以跨多端浏览。rsshub 可以将 youtube 转为 rss 订阅,还可以自定义规则来弄其他网站。wewerss 可以将微信公众号文章转为 rss。
Tiny Tiny RSS
官方虽然在推荐 docker 部署,但是小 vps 不想上 docker,浪费资源,直接 host 部署。
tt-rss 加星标后就相当于存档文章,然后发布相当于人工过滤后再输出一份 feed 给他人订阅。存档是已取消订阅的但是加星标的文章。
rsshub
直接根据官方文档来转换 youtube 频道
https://rsshub.app/youtube/user/@用户名
wewerss
这个难搭一点,看了下源码,实际是个半成品,这个东西估计是逆向了微信读书的接口,把关键的一部分接口发包弄到了第三方服务器上,然后开源项目只是抓取文章数据。虽然项目方说他不会存储用户数据,这很难说,说不定就是为了多搞点用户 token,来规避腾讯的反扒机制。
这里开个 supervisor 守护进程
[program:wewe-rss]
command=/root/.nvm/versions/node/v20.12.2/bin/node ./dist/main
environment=NODE_ENV=production,HOST=127.0.0.1,DATABASE_TYPE=sqlite,DATABASE_URL=file:./data/wewe-rss.db,AUTH_CODE=123567,FEED_MODE=fulltext,CRON_EXPRESSION="*/15 * * * *"
directory=/opt/wewe-rss
priority=999
autostart=true
autorestart=true
startsecs=5
redirect_stderr=true
最终就是希望一站式浏览内容,去重,去算法推荐。我还尝试拦截一下文华财经的新闻,PC端貌似走的下载数据的路子,没有走 http 协议,android 端加固了,简单的拦包不可能,有些麻烦,就先不搞了。
其他
看了下 rsshub 的源码,本来想在里面添加个几个站点的规则,但是作者说正在重构,那就不在此之上开发了。这个抓取生成主要就是用 cheerio 这个库抓一下页面然后放到缓存里,然后 render 一下就可以了。这个仓库能让你发现有些从来没访问过的有意思的站点。后来我采用了再 google apps script 中实现一个定时抓取,因为 GAS 中有定时触发器和缓存接口,批量创建了一批 5 分钟定时触发器,然后拉队列来生成放到缓存里,相当于多任务处理。最后 GAS 导出 web api,这个 URL 可不怎么样,然后用 CloudFlare 反向代理了一下,这样订阅端的 URL 就是固定的。然后更新 GAS 脚本部署后的 URL 变动,直接在 CloudFlare 的 Worker 里改动一下就好。当然 CloudFlare 的 .dev 域名被墙了,不过这没关系,因为 VPS 没被墙。而 Tiny tinty RSS 是一个后端 PHP 程序,可以 24 小时不断刷,不管你在哪一段浏览过新闻都会记录你已经看过了,比纯客户端应用程序好的多。
这里 GAS 的 web api,本来用 openresty 来反向代理了一下,但是觉得这个地址不断被刷,有点浪费宝贵的 VPS 资源(如果单次生成的 RSS 全文条数多且内容大,很占内存),还是用 CloudFlare 反代节省以下资源。
CloudFlare 反代
/**
* Welcome to Cloudflare Workers! This is your first worker.
*
* - Run "npm run dev" in your terminal to start a development server
* - Open a browser tab at http://localhost:8787/ to see your worker in action
* - Run "npm run deploy" to publish your worker
*
* Learn more at https://developers.cloudflare.com/workers/
*/
const TARGET_BASE_URL = 'https://script.google.com/macros/s/XXXXXXX/exec';
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
const url = new URL(request.url);
const target_url = TARGET_BASE_URL + url.search;
const tragetURL = new URL(target_url);
const modifiedRequest = new Request(tragetURL, {
headers: request.headers,
method: request.method,
body: request.body,
redirect: 'follow'
});
console.log(tragetURL.toString());
const response = await fetch(modifiedRequest);
const modifiedResponse = new Response(response.body, response);
// 添加允许跨域访问的响应头
modifiedResponse.headers.set('Access-Control-Allow-Origin', '*');
modifiedResponse.headers.set("Content-Type", 'application/xml; charset=utf-8');
return modifiedResponse;
}
总结
用 tt-rss 的理由是 vps 不断刷新,不用开客户端来刷新,这样会尽量不漏消息,像财联社电报这样的订阅,更新频率很快,等客户端刷新不合适。同样 rsshub 的默认缓存 1 小时,或者所有频道共享同一时间缓存是不合适的,有些频道更新快,有些频道更新慢,简单粗暴 1 小时缓存,会漏掉高频率消息。所以修改了 rsshub 源码将不同频道的缓存改为 ?cache=180 查询参数来控制,但这对自托管 rsshub 自己私用管用,如果你公开给其他人用 rsshub,肯定不希望别人修改频道缓存参数。同样需要修改 tt-rss 的 update.php 的更新频率为 3 分钟一次,这样才能尽快的收到财联社电报消息。
tt-rss 阅读器读财经信息,就相当于消消乐,看似海量的消息,只需瞄一眼,把重要信息加星,然后点击不重要的消息消除即可。