安装 huginn
网上关于如何安装 huginn 的文章太多了, 这里不做介绍, 我自己使用的是 huginn 的 docker 安装方式, docker-compose.yml 如下
1 | version: '2' |
启动后, 配置 nginx 使用 ssl 时发现, 每次登录总是跳转到首页, 变为未登录状态, 解决方式是参考 nginx-ssl, 添加必要的 proxy_set_header
:
1 | proxy_set_header Host $http_host; |
安装完成后, 通过默认用户名密码 admin / password
即可登录.
配置 huginn
huginn 中的几个关键术语解释一下:
- Agent
代理, 简单理解就是一个操作, 比如发送消息, 解析网页等等.
- Scenarios
场景, 场景由多个 agent 组成, 通过 agent 构建一个有向图.
- Event
事件, 即 agent 的执行的中间结果, 前一步的 agent 将处理后的信息以 event 的形式抛出去, 由下一步的 agent 去接着处理. 这里就涉及到 agent 中的两个概念, sources 和 receivers, 分别定义的是当前 agent 的前置和后置 agent.
以当前我们的任务为例. 我们要收集信息的页面为 https://maoyan.com/films:

可以看到, 我们能从这个页面获取到最新电影的 中文名称/缩略图/分数, 我们第一步就是要解析这个页面, 获取最基本的信息, 第二步去每部电影的详情页去获取电影的详细信息(介绍, 时间等等), 第三步将获取的信息格式化为 slack message 进行发送.
这里, 我们先创建一个名为 movie 的 Scenarios.

step 1
通过查看页面元素, 我们不难去定位每一个字段

我们新建一个 agent, 类型为 Website Agent, 这个 agent 用于处理页面元素.

1 | { |
通过点击 Dry Run
可以进行测试. 我们看到可以拉取到的数据如下:
1 | [ |
这个数组中的每个 {} 都将是一个 event 向外发布.
step 2
这里我们再创建一个 agent, url 使用上一步给出的 url 进行拼接.
另外还有一个细节是, 这里的 mode 为 merge
, 意思是, 将上一步的 event 带过了的字段和当前 event 进行合并, 往下一步传.

1 | { |
点击 Dry Run
, 在 Event to Send 中填入一个上一步的 event. 如:
1 | { |
可以看到我们获取到了更详细的影片信息
1 | [ |
step 3
先要为 slack 创建一个 app, 用于接受消息. Create New App.
为这个 app 创建一个 incoming_webhook. 格式应该是
https://hooks.slack.com/services/XXXXXXXXXX/xxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxx

关于发送 slack, 虽然 huginn 提供了一个 slack agent, 但使用起来仅仅发送最简单的 message 可以使用, 无法构建复杂的格式. 我们改用 post agent.

1 | { |
显示效果如下:

关于 slack 的消息格式, 不是本文的重点, 具体可以参考这里 An introduction to messages.