首先介绍下,Liuli
是什么?这是我最近开发的一个开源项目,主要目的是为了让有阅读习惯的朋友快速构建一个多源、干净、个性化的阅读环境。
为什么叫Liuli
?
Liuli
原来命名为2C
,后面交流群的朋友提供了琉璃这个名字,取自梅尧臣《缑山子晋祠 会善寺》中的琉璃开净界,薜荔启禅关,其寓意也很符合项目的立意:
为用户构建一方阅读净土如东方琉璃净世界
距离上次发布已经过去了一个月(我实在是太拖了,反省),今天很高兴地和大家宣布Liuli
又有一大波更新了!🥳 具体见v0.2.0 任务看板[1]。
接下来我将根据Liuli
最新版本V0.1.5
来给大家介绍下如何基于 Liuli 构建纯净的 RSS 公众号信息流,最终订阅效果展示如下:
开始
首先从需求谈起,目前我有三点诉求:
- 聚合目前订阅的公众号,通过 RSS 输出然后分别订阅
- 对订阅的文章做广告识别
- 对文章做一个快速备份
以上诉求正好就是本篇文章的主题构建纯净的 RSS 公众号信息流,具体实现这里不详谈,有兴趣可以在交流群里面交流,本篇文章只说怎么用。
如果你阅读过我之前写的那篇打造一个干净且个性化的公众号阅读环境[2],那么你对采集器、处理器、分发器等概念可能有些了解,但这里为了阅读的连贯性,所以再次介绍下,首先看架构图:
简单解释一下:
- 采集器:监控各自关注的公众号或者博客等自定义阅读源,以统一标准格式流入
Liuli
作为输入源; - 处理器:对目标内容进行自定义处理,如基于历史广告数据,利用机器学习实现一个广告分类器自动打标签,或者引入钩子函数在相关节点执行等;
- 分发器:依靠接口层进行数据请求&响应,为使用者提供个性化配置,然后根据配置自动进行分发,将干净的文章流向微信、钉钉、TG 甚至自建网站;
- 备份器:将处理后的文章进行备份,如持久化到数据库或者 GitHub 等。
其实不了解流程也没关系,知道怎么用就行了,接下来请详细跟着教程一步一步来,最好有台电脑跟着操作。
使用
好,正戏开始。Liuli
的部署使用还是很方便的,推荐大家使用Docker
进行部署,所以开始前大家手头的设备需要安装好Docker
,如果没安装,点击这里进行安装[3]即可。
配置
当前Liuli
的配置主要分两大块:
- 全局配置:就是全局环境变量,相关说明见Liuli 环境变量[4]
- 任务配置:此配置针对用户需要解决的问题而形成,比如本文就会生成一个将公众号采集、处理、输出成 RSS 的配置(诸位使用时候将我的配置复制过去即可使用)
全局配置
首先说说全局配置,其实默认提供的配置也能让大家跑起来,但是如果你需要将文章分发到微信或者钉钉等,那就需要填写相关配置,好了,让我们开始吧,请打开终端或者用你熟悉的方式,建立一些文件夹或者文件。
mkdir liuli cd liuli # 存放调度任务配置,默认命名为default.json mkdir liuli_config # 数据库 mkdir mongodb_data # 下拉 docker-compose 配置 # 如果网络不好请手动填写,内容见附录 wget https://raw.githubusercontent.com/howie6879/liuli/main/docker-compose.yaml # 配置 pro.env 具体查看全局配置处的Liuli 环境变量 vim pro.env
对于pro.env
,想了解详情的话建议查看全局配置[5]处的Liuli
环境变量,当然你不想看也没关系,跟着此教程填即可,首先请将以下配置复制到pro.env
:
PYTHONPATH=${PYTHONPATH}:${PWD} LL_M_USER="liuli" LL_M_PASS="liuli" LL_M_HOST="liuli_mongodb" LL_M_PORT="27017" LL_M_DB="admin" LL_M_OP_DB="liuli" LL_FLASK_DEBUG=0 LL_HOST="0.0.0.0" LL_HTTP_PORT=8765 LL_WORKERS=1 # 上面这么多配置不用改,下面的才需要各自配置 # 请填写你的实际IP LL_DOMAIN="http://{real_ip}:8765" # 请填写微信分发配置 LL_WECOM_ID="" LL_WECOM_AGENT_ID="-1" LL_WECOM_SECRET=""
假设你和我一样使用微信作为分发终端,只需要通过以下步骤获取以下参数即可:
- LL_WECOM_ID
- LL_WECOM_AGENT_ID
- LL_WECOM_SECRET
获取流程如下,请先随便用手机号注册一个企业微信[6]。
首先创造应用:
获取相关 ID:
企业 ID 在我的企业->企业信息->企业ID
。
为了方便可以在微信上接收消息,记得开启微信插件,进入下图所在位置,扫码关注你的二维码即可:
现在你获取了以下三个参数,请到对应配置填写秘钥即可。
任务配置
任务配置主要是让使用者可以更加个性化地使用Liuli
,从而满足用户各种需求,当前Liuli
还只能支持公众号采集、过滤、分发、备份操作,也就是本文的核心目的,大家将以下内容复制到liuli_config/default.json
即可:
{ "name": "default", "author": "liuli_team", "collector": { "wechat_sougou": { "wechat_list": [ "老胡的储物柜" ], "delta_time": 5, "spider_type": "playwright" } }, "processor": { "before_collect": [], "after_collect": [{ "func": "ad_marker", "cos_value": 0.6 }, { "func": "to_rss", "link_source": "github" }] }, "sender": { "sender_list": ["wecom"], "query_days": 7, "delta_time": 3 }, "backup": { "backup_list": ["mongodb"], "query_days": 7, "delta_time": 3, "init_config": {}, "after_get_content": [{ "func": "str_replace", "before_str": "data-src=\"", "after_str": "src=\"https://images.weserv.nl/?url=" }] }, "schedule": { "period_list": [ "00:10", "12:10", "21:10" ] } }
注意上面的wechat_list
字段,你只需要将自己想订阅的公众号输入进去即可,后面这块会做界面进行配置,先将就着用用吧。
启动
感谢你能看到这里,现在距离成功就只有一行命令了,请先检查liuli
目录下文件树是否是下面这个样子:
(base) [liuli] tree -L 1 ├── docker-compose.yaml ├── liuli_config ├────default.json ├── mongodb_data └── pro.env
确认没问题后,执行:
docker-compose up -d
不出意外,会看到Docker
启动了这三个容器:
查看liuli_schedule
,会有日志如下:
输出日志如下:
Loading .env environment variables... [2022:01:26 23:09:24] INFO Liuli Schedule(v0.1.5) started successfully :) [2022:01:26 23:09:24] INFO Liuli Schedule time: 00:10 12:10 21:10 [2022:01:26 23:09:36] INFO Liuli playwright 匹配公众号 老胡的储物柜(howie_locker) 成功! 正在提取最新文章: 我的周刊(第023期) [2022:01:26 23:09:39] INFO Liuli 公众号文章持久化成功! 👉 老胡的储物柜 [2022:01:26 23:09:40] INFO Liuli 🤗 微信公众号文章更新完毕(1/1) ... [2022:01:26 23:09:45] INFO Liuli 备份器执行完毕!
执行完毕后,你可以进入 MongoDB 数据库,会出现如下collection
:
- liuli_articles: 获取的文章元信息
- liuli_backup: 文章全部备份
- liuli_rss: 生成的 RSS
- liuli_send_list: 分发状态
- liuli_backup_list: 备份状态
假设你公众号源有老胡的储物柜
,那么启动完毕,你可以访问老胡的储物柜
的RSS
订阅地址http://ip:8765/rss/liuli_wechat/老胡的储物柜/
,效果如下:
注意红框部分,因为我使用的是GitHub
备份器,所以地址显示的是GitHub
地址,大家如果也想用这个,可以参考教程备份器配置[7],我使用GitHub
备份器效果如下如:
每日更新的文章都会被Liuli
自动同步到这个项目,如果大家都用Liuli
的GitHub
备份器,一起将备份结果结合起来的话,那将会是一股非常庞大的力量,可以期待下。
展示
Liuli
启动成功后,对于使用者来说,主要感知在分发订阅这一层。
订阅效果如下图:
附录
docker-compose.yaml
配置如下:
version: "3" services: liuli_api: image: liuliio/api:v0.1.1 restart: always container_name: liuli_api ports: - "8765:8765" volumes: - ./pro.env:/data/code/pro.env links: - liuli_mongodb depends_on: - liuli_mongodb networks: - liuli-network liuli_schedule: image: liuliio/schedule:v0.1.5 restart: always container_name: liuli_schedule volumes: - ./pro.env:/data/code/pro.env - ./liuli_config:/data/code/liuli_config links: - liuli_mongodb depends_on: - liuli_mongodb networks: - liuli-network liuli_mongodb: image: mongo:3.6 restart: always container_name: liuli_mongodb environment: - MONGO_INITDB_ROOT_USERNAME=liuli - MONGO_INITDB_ROOT_PASSWORD=liuli ports: - "27027:27017" volumes: - ./mongodb_data:/data/db command: mongod networks: - liuli-network networks: liuli-network: driver: bridge