Appservice(Application Service 的简称)是 Matrix 内建的扩展机制。一个 Appservice 是一个被主机服务器 信任 的外部程序,它可以:
@slack_*:your-server)#_discord_*:your-server)你在 桥接 一节里看到的每一个桥接,底层都是 Appservice。但你也可以自己写一个——用于自定义机器人、集成、数据分析、后台工具,或者对接 Meldry 默认没有出厂的网络。
本页讲清概念,说明什么时候要用 Appservice 而不是普通机器人,并演示如何在 Meldry 工作区里注册一个 Appservice。
| 普通机器人 | Appservice | |
|---|---|---|
| 身份 | 一个 Matrix 用户账户 | 一整段命名空间下的虚拟用户(例如 @myint_*) |
| 认证 | Access token,与普通用户相同 | 两个共享密钥 token:as_token、hs_token |
| 收事件 | 只能收到机器人用户能看见的事件 | 所有命中 AS 命名空间的事件,通过 HTTP 推送 |
| 创建用户 | 否——机器人是单一身份 | 是——按需创建,无需走注册流程 |
| 创建房间 | 可以,和普通用户一样 | 可以,还能创建"只通过别名访问"的命名空间房间 |
| 典型用途 | !weather 机器人、提醒机器人、GitHub 通知 | 桥接、批量集成、机器人农场、后台仪表板 |
经验法则: 如果你的集成只需要一个身份、只对"@它的消息"做出反应,用普通机器人即可。如果需要多个身份(每个外部用户一个)、或者需要看到房间里的 全部 消息却又不在房间里,就得用 Appservice。
registration.yaml 文件 #Appservice 通过一份 注册文件 向主机服务器登记——一份简短的 YAML,声明:
as_token(Appservice → 主机服务器)和 hs_token(主机服务器 → Appservice)id: meldry-weatherbot url: https://weather.example.com/_matrix as_token: as_7f3a... # 你自己生成的随机长字符串 hs_token: hs_b1c9... # 另一个随机长字符串 sender_localpart: weatherbot rate_limited: false namespaces: users: - exclusive: true regex: '@weather_.*:your-name\.meldry\.com' aliases: - exclusive: true regex: '#weather_.*:your-name\.meldry\.com' rooms: []
独占命名空间(exclusive) 意味着同一主机服务器上不会再有其他人注册符合该正则的用户或别名。请让正则尽可能精准——不要写 @.*:your-server,否则会屏蔽普通用户注册。
任意随机密钥生成器都可以。常见方式:
openssl rand -hex 32 # 跑两次,一次给 as_token,一次给 hs_token
两个 token 都保存好。这两个 token 不会被自动轮转,一旦丢失就必须重新注册。
registration.yaml #以上面的例子为模板,修改成你集成需要的样子。id 取一个可读的名字;url 必须是可达的 HTTPS endpoint,Meldry 主机服务器会把事件 POST 到这里。
在 Meldry 仪表板里:
Meldry 会校验 YAML(命名空间不能和已有桥接冲突,URL 必须可解析),把它写入主机服务器配置,并重启主机服务器让改动生效。大约 10 秒。
你的外部程序需要做这些事:
?access_token=<hs_token>,token 不对的请求必须拒绝。Authorization: Bearer <as_token>。用这个 token 可以创建命名空间下的任意用户(POST /_matrix/client/v3/register?kind=user,body 里 type: m.login.application_service),以这些用户的身份发消息、建房间等等。最常用的参考 SDK:Node.js 用 matrix-appservice-bridge,Python 用 matrix-nio。Rust 也有一个 crate:matrix-sdk-appservice。
不再需要时:
Appservice 创建过的虚拟用户会留在数据库里(在房间历史里还能看到),但 Appservice 再也无法推送事件或以它们的身份行动。
Meldry 管理的桥接(Telegram、Slack、Discord 等)不占用这个配额——只有你自己注册的 Appservice 才算。
registration.yaml 提交到公开的 git——它里面有两把 token。rate_limited: false 会为来自该 AS 的流量关闭速率限制。只对真正高吞吐量的集成这样写,其他情况保持默认 true(或者干脆不写)。hs_token 不对。exclusive: true——没有这个字段,主机服务器不会允许 AS 创建该模式下的用户。