Matrix 协议适配器插件,让 AstrBot 能够连接到 Matrix 网络,支持端到端加密(E2EE)、OAuth2 认证、消息线程等功能。
- 多种认证方式:支持密码认证、Access Token 认证、OAuth2 认证
- 端到端加密(E2EE):支持加密房间的消息收发(试验性)
- 消息线程:支持 Matrix Threading 功能
- 自动加入房间:可配置自动接受房间邀请
- 富文本消息:支持 Markdown 格式的消息发送
- 媒体消息:支持图片、视频、语音、文件等媒体消息的收发
- 表情回应:支持消息表情回应(Reaction)
- 设备管理:自动生成和管理设备 ID
将插件目录放置到 AstrBot 的 data/plugins/ 目录下:
data/plugins/astrbot_plugin_matrix_adapter/
安装插件后,AstrBot 会自动根据 requirements.txt 为插件安装依赖库。
AstrBot 插件依赖通过插件目录下的 requirements.txt 管理。一般情况下,AstrBot 会在安装好插件后自动为插件安装依赖库;若出现 No module named 'xxx' 等报错,可能是网络问题、requirements.txt 缺失或 Python 版本不兼容导致依赖未正确安装。此时可在 AstrBot WebUI 的 控制台 -> 安装 Pip 库 中手动安装依赖,或在 AstrBot 运行环境中执行:
python -m pip install -r data/plugins/astrbot_plugin_matrix_adapter/requirements.txt
重启 AstrBot 后,插件会自动加载。
在 AstrBot 管理面板中添加 Matrix 平台适配器,或在配置文件中添加以下配置:
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
matrix_homeserver |
string | https://matrix.org |
Matrix 服务器地址 |
matrix_user_id |
string | - | 用户 ID,格式:@username:homeserver.com |
matrix_auth_method |
string | password |
认证方式:password、token、oauth2 |
matrix_password |
string | - | 密码(密码认证模式必填) |
matrix_access_token |
string | - | Access Token(Token 认证模式必填) |
matrix_device_name |
string | AstrBot |
设备显示名称 |
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
matrix_auto_join_rooms |
bool | true |
是否自动接受房间邀请 |
matrix_sync_timeout |
int | 30000 |
同步超时时间(毫秒) |
matrix_enable_threading |
bool | false |
是否使用消息线程回复 |
以下配置位于插件配置中(_conf_schema.json),由所有 Matrix 适配器实例共享:
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
matrix_http_timeout_seconds |
int | 120 |
全局 HTTP 请求超时(秒),用于 Matrix 客户端与 OAuth2 网络请求(最小 5 秒) |
matrix_media_cache_gc_days |
int | 30 |
媒体缓存清理天数,<=0 表示禁用 |
matrix_media_download_concurrency |
int | 4 |
每个媒体源 server 的并发下载上限(最小为 1) |
matrix_quoted_media_background_download_concurrency |
int | 2 |
引用媒体超时后转后台下载时的并发上限(最小为 1) |
matrix_media_download_min_interval_ms |
int | 0 |
同一媒体源 server 的最小下载请求间隔(毫秒),<=0 表示不限制 |
matrix_media_download_breaker_fail_threshold |
int | 6 |
下载熔断触发的连续失败阈值(<=0 表示禁用) |
matrix_media_download_breaker_cooldown_ms |
int | 5000 |
下载熔断基础冷却时长(毫秒) |
matrix_media_download_breaker_max_cooldown_ms |
int | 120000 |
下载熔断最大冷却时长(毫秒) |
matrix_media_cache_index_persist |
bool | true |
是否启用 SQLite 持久化媒体缓存索引 |
matrix_media_auto_download_max_bytes |
int | 0 |
媒体自动下载大小上限(字节),超过后跳过自动下载并尽量保留 URL,<=0 表示不限制 |
matrix_media_download_max_in_memory_bytes |
int | 33554432 |
download_file 返回 bytes 时的内存上限(字节),<=0 表示不限制 |
matrix_media_auto_download_image |
bool | true |
是否自动下载图片消息(m.image) |
matrix_media_auto_download_video |
bool | true |
是否自动下载视频消息(m.video) |
matrix_media_auto_download_audio |
bool | true |
是否自动下载音频消息(m.audio) |
matrix_media_auto_download_file |
bool | true |
是否自动下载文件消息(m.file) |
matrix_media_auto_download_sticker |
bool | true |
是否自动下载贴纸消息(m.sticker) |
matrix_media_upload_strict_mime_check |
bool | true |
上传前执行 MIME 严格一致性校验 |
matrix_media_upload_blocked_extensions |
list | [".exe", ".dll", ...] |
上传扩展名黑名单 |
matrix_media_upload_allowed_mime_rules |
list | ["image/*", "video/*", ...] |
上传允许的 MIME 规则(支持 *) |
matrix_e2ee_store_max_pending_writes |
int | 256 |
E2EE 异步持久化待处理写任务队列上限(最小为 1) |
matrix_data_storage_backend |
string | json |
数据存储后端(users/rooms/auth/sync/device_info + E2EE 本地状态):json / sqlite / pgsql |
matrix_pgsql |
object | 见下方 | 当后端为 pgsql 时使用的 PostgreSQL 配置对象 |
说明:
- Emoji 短码转换与 Sticker 自动同步配置已迁移到
astrbot_plugin_matrix_sticker插件。
matrix_pgsql 对象字段:
dsn:例如postgresql://user:[email protected]:5432/dbnameschema:默认publictable_prefix:默认matrix_store
说明:
json:保持原有按文件存储(每条记录一个.json,E2EE 兼容旧olm_*.json/cross_signing.json/trusted_devices.json)。sqlite:按文件夹拆分为多个.db(例如users/users.db、rooms/rooms.db、store/<homeserver>/<user>/<user>.db)。pgsql:按文件夹拆分为多张表(表名由文件夹路径稳定映射生成)。
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
matrix_enable_e2ee |
bool | false |
是否启用端到端加密 |
matrix_e2ee_auto_verify |
string | auto_accept |
自动验证模式:auto_accept、auto_reject、manual |
matrix_e2ee_trust_on_first_use |
bool | false |
是否自动信任首次使用的设备 |
matrix_e2ee_key_backup |
bool | false |
是否启用密钥备份 |
matrix_e2ee_recovery_key |
string | - | 恢复密钥(留空则自动生成) |
{
"type": "matrix",
"enable": true,
"matrix_homeserver": "https://matrix.org",
"matrix_user_id": "@mybot:matrix.org",
"matrix_auth_method": "password",
"matrix_password": "your_password",
"matrix_device_name": "AstrBot"
}{
"type": "matrix",
"enable": true,
"matrix_homeserver": "https://matrix.org",
"matrix_user_id": "@mybot:matrix.org",
"matrix_auth_method": "token",
"matrix_access_token": "syt_xxxxx"
}{
"type": "matrix",
"enable": true,
"matrix_homeserver": "https://matrix.org",
"matrix_user_id": "@mybot:matrix.org",
"matrix_auth_method": "password",
"matrix_password": "your_password",
"matrix_enable_e2ee": true,
"matrix_e2ee_auto_verify": "auto_accept",
"matrix_e2ee_trust_on_first_use": true
}手动批准 Matrix 设备,用于 E2EE 设备验证。 此命令需要管理员权限。
用法:
/approve_device <user_id> <device_id>
参数:
user_id:Matrix 用户 ID(例如@user:example.com)device_id:设备 ID
示例:
/approve_device @alice:matrix.org DEVICEID123
Matrix 适配器暴露了 MatrixSender.send_video 接口用于发送视频(文件路径或 http/https URL):
from astrbot.api.event import MessageChain
from astrbot.api.message_components import Video
# adapter 是 Matrix 平台适配器实例
await adapter.sender.send_video("!roomid:example.org", "/path/to/video.mp4")
# 或者直接构造 MessageChain
await adapter.sender.send_message(
"!roomid:example.org",
MessageChain([Video.fromURL("https://example.org/video.mp4")]),
)Matrix 适配器暴露了 MatrixSender.send_audio 接口用于发送语音(文件路径或 http/https URL):
from astrbot.api.event import MessageChain
from astrbot.api.message_components import Record
# adapter 是 Matrix 平台适配器实例
await adapter.sender.send_audio("!roomid:example.org", "/path/to/audio.ogg")
# 或者直接构造 MessageChain
await adapter.sender.send_message(
"!roomid:example.org",
MessageChain([Record.fromURL("https://example.org/audio.ogg")]),
)Matrix 适配器暴露了 MatrixSender.send_poll 接口用于发送投票:
# adapter 是 Matrix 平台适配器实例
await adapter.sender.send_poll(
"!roomid:example.org",
question="你更喜欢哪种风格?",
answers=["简洁", "复古", "未来感"],
max_selections=1,
)也可以使用适配器自带的 Poll 组件构造消息链:[^patch1]
from astrbot.api.event import MessageChain
from astrbot_plugin_matrix_adapter.components import Poll
await adapter.sender.send_message(
"!roomid:example.org",
MessageChain([Poll("最喜欢的季节?", ["春", "夏", "秋", "冬"])]),
)如果你的服务端只支持旧的(不稳定)事件类型,可以指定 event_type 和 poll_key:
await adapter.sender.send_poll(
"!roomid:example.org",
question="午饭吃什么?",
answers=["面条", "米饭"],
event_type="org.matrix.msc3381.poll.start",
poll_key="org.matrix.msc3381.poll.start",
)Matrix 适配器暴露了 MatrixSender.send_poll_response 接口用于对投票进行响应:
# 对某个投票进行投票(选择第一个选项)
await adapter.sender.send_poll_response(
"!roomid:example.org",
poll_start_event_id="$poll_event_id:example.org",
answer_ids=["1"], # 答案 ID 通常是 "1", "2", "3" 等字符串
)如果要选择多个选项(投票本身允许多选):
await adapter.sender.send_poll_response(
"!roomid:example.org",
poll_start_event_id="$poll_event_id:example.org",
answer_ids=["1", "3"], # 选择第一个和第三个选项
)可以直接发送任意 Matrix 事件类型与内容:
await adapter.sender.send_custom_message(
"!roomid:example.org",
event_type="m.room.message",
content={
"msgtype": "m.notice",
"body": "这是一个自定义内容消息",
"org.example.extra": {"foo": "bar"},
},
)也支持发送自定义事件类型(非 m.room.message):
await adapter.sender.send_custom_event(
"!roomid:example.org",
event_type="org.example.custom.event",
content={"hello": "world"},
)Matrix 适配器暴露了 MatrixSender.delete_message 接口用于删除(撤回)消息:
# adapter 是 Matrix 平台适配器实例
await adapter.sender.delete_message("!roomid:example.org", "$event_id:example.org")在事件处理器中,也可以直接删除当前消息:
await event.delete()E2EE(End-to-End Encryption)功能允许 Bot 在加密房间中接收和发送消息。这是一个试验性功能。
- auto_accept:自动接受所有验证请求(适合个人使用)
- auto_reject:自动拒绝所有验证请求
- manual:手动处理验证请求(需要使用
/approve_device命令)
启用 matrix_e2ee_trust_on_first_use 后,Bot 会自动信任首次遇到的设备。这降低了安全性但提高了便利性。
启用 matrix_e2ee_key_backup 后,E2EE 密钥会被备份到服务器。如果需要恢复密钥,可以使用 matrix_e2ee_recovery_key 配置恢复密钥。
- 检查
matrix_homeserver是否正确 - 确保服务器支持客户端连接
- 检查网络连接
- 检查用户 ID 格式是否正确(
@username:homeserver.com) - 检查密码或 Token 是否正确
- 如果使用 OAuth2,确保服务器支持
- 确保
matrix_enable_e2ee已启用 - 检查设备是否已验证
- 使用
/approve_device手动批准设备 - 检查 E2EE 存储路径是否可写
- 检查 Bot 是否已加入目标房间
- 检查 Bot 是否有发送消息的权限
- 如果是加密房间,确保 E2EE 已启用
- 设备 ID 自动管理:设备 ID 由系统自动生成和管理,无需手动配置
- E2EE 是试验性功能:可能存在兼容性问题
- 存储路径:确保存储路径目录可写,否则会导致登录状态丢失
- Token 安全:请妥善保管 Access Token 和恢复密钥
MIT License
如果你想要使用加密,请安装 vodozemac 库
对于贴纸功能的支持,请移步 https://github.com/stevessr/astrbot_plugin_matrix_sticker 请注意:那个插件会注入上下文,依赖 llm 本身的能力
房间类型可能更新不及时,有的时候会被联邦做局
不建议在多人群里面使用加密,这会造成较重的负担
也许是一个简单的插件配置演示? Link[^1]
视频里面可能出现非官方 fluffychat 版本
嗯,还是推荐自建 ( matrix 官方好像要出账号跨服务器迁移的功能 ),请保存好 tuwunel 的数据库 (里面有加密密钥) 请谨慎使用 Mozilla 的 matrix 服务器 (有限速),在使用服务器之前请详细查看各个服务器的用户协议 推荐使用 tuwunel 的原因是单文件足够简单,维护也比较活跃,但是官方版本配置 linux do 登录会有问题 (重复的字段)
[patch1]: 需要给 Astrbot 本体打一点小 patch [1]: 音量有点大