这是一篇指导如何使用和开发MSG的博客
概念介绍
- 平台: 例如SMS,邮箱,Telegram,微信
- Bot: 每个bot都可以支持一个或多个平台, 但每种平台只能绑定一个
- 通知渠道: 将Bot,平台以及发送目标绑定在一起, 同时可以给渠道设置标记(全局唯一), 发送信息时可以通过渠道ID或渠道标记向对应的渠道发送信息
相关项目
相关
- https://github.com/Akvicor/gmsg 一个Go Mod, 可以快速调用已经搭建的MSG来发送信息
- https://github.com/Akvicor/msg-cmd 一个命令行应用, 可以快速调用已经搭建的MSG来发送信息
- https://github.com/Akvicor/sms SMS平台, 用来发送短信
界面介绍
用户中心
可以在这里面修改密码和头像什么的
访问密钥
通过API访问时需要使用这个
发送渠道
实际的发送渠道, 将信息接受者绑定到平台和Bot
发送渠道的 目标
- SMS/短信: 手机号
- Mail/邮件: 邮箱地址
- Telegram: 会话ID(添加对应机器人后, 通过发送
/get_id
获取到的内容) - 微信: 用户在企业微信中的名称
搭建
Docker快速搭建
如需自己编译镜像, 可以直接使用项目中的Dockerfile
编译, 编译完成后替换后续docker-compose.yml
中的镜像名称
通过docker-compose.yml
快速搭建
Sqlite
需要修改数据存储的目录
services:
msg:
image: akvicor/msg:v0.1.6
restart: always
volumes:
- /path/to/msg/data/msg-data:/data
ports:
- 3000:3000
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/sys/info/health"]
interval: 10s
timeout: 5s
retries: 5
Postgres
需要修改数据存储的目录, postgres的密码
services:
msg:
image: akvicor/msg:v0.1.6
restart: always
volumes:
- /path/to/msg/data/msg-data:/data
ports:
- 3000:3000
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/sys/info/health"]
interval: 10s
timeout: 5s
retries: 5
depends_on:
db:
condition: service_healthy
db:
image: postgres:17.2
restart: always
volumes:
- /path/to/msg/data/db-data:/var/lib/postgresql/data
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=password
- POSTGRES_DB=msg
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres -d msg"]
interval: 10s
timeout: 5s
retries: 5
启动
docker compose -p msg up -d
对于使用postgres的用户, 需要在启动后修改/path/to/msg/data/msg-data/config.toml
将
[database]
# sqlite, postgres
type = 'sqlite'
改为
[database]
# sqlite, postgres
type = 'postgres'
然后重启docker容器
docker compose -p msg restart
配置
Bot部分放在介绍默认Bot Maid时介绍
server
这是配置web服务域名和端口的
database
配置数据库, 目前仅支持sqlite和postgres两种
sqlite: 仅type和file生效
postgres: 如果是按照上面的docker-compose.yml
启动的服务, 那么host可以直接使用db
encrypt
每次生成配置文件时, 都会随机生成key
和iv
log
这是日志配置, 默认不会写入文件
cron
这是定时执行某个任务时需要的配置, 但这个功能比较私人, 我在开放的版本中清空了这部分
默认Bot Reminder
这个bot仅支持微信企业应用, 当然你也可以自己在代码中添加支持其他平台.
毕竟我现在用的就是微信企业应用, 懒得继续加平台
下面这张图就完整的概括了Reminder的功能, 这是一个让MSG定时向你发送信息的功能, 用于提醒自己指定时间该干啥
如需使用Reminder, 请手动添加一个绑定Reminder的通知渠道, 这个通知渠道绑定的发送目标才能使用Reminder功能
默认Bot Maid (包含如何配置每种平台的示例)
这个bot支持目前所有平台, 但默认情况下仅支持发送信息, 如果你想支持收到消息后自动进行某些操作, 那你需要去代码的指定接收函数中编写对应功能
配置 SMS
这个平台是自己搭建的, 项目地址 https://github.com/Akvicor/sms
将这个项目搭建后开放出来的URL以及Token配置到这里后, maid就可以通过sms发送短信了
enable-sender
: 是否启用发送短信功能, 默认为false
, 如需启用需修改为true
enable-receiver
: 目前并未实现接受短信功能
[bot.maid.sms]
debug = false
enable-receiver = false
enable-sender = false
api = 'https://example.com'
token = ''
配置 Mail
如何搭建邮件服务器可以看 这篇博客
enable-smtp
: 是否启用发送邮件功能, 默认为false
, 如需启用需修改为true
enable-imap
: 是否启用接收邮件功能, 默认为false
, 如需启用需修改为true
, 如需进一步处理接收到的邮件, 需要自行修改代码
发送邮件需要SMTP, 接收邮件需要IMAP
[bot.maid.mail]
debug = false
enable-imap = false
host-imap = 'https://imap.example.com'
port-imap = 993
enable-smtp = false
host-smtp = 'https://smtp.example.com'
port-smtp = 465
from = 'MSG Backend <maid@example.com>'
username = 'maid@example.com'
password = ''
配置 Telegram
enable-sender
: 是否启用发送信息功能, 默认为false
, 如需启用需修改为true
enable-receiver
: 是否启用接收信息功能, 默认为false
, 如需启用需修改为true
, 如需进一步处理接收到的信息, 需要自行修改代码
token处填写机器人的Token, 如何创建机器人请自行Google或咨询AI
当机器人被添加到对话后, 发送/get_id
可以获取当前会话的ID, 这个ID就是本程序的发送渠道中的Telegram的渠道目标
[bot.maid.telegram]
debug = false
enable-receiver = false
enable-sender = false
api = 'https://api.telegram.org/bot%s/%s'
token = ''
配置 微信
enable-sender
: 是否启用发送信息功能, 默认为false
, 如需启用需修改为true
enable-receiver
: 是否启用接收信息功能, 默认为false
, 如需启用需修改为true
, 如需进一步处理接收到的信息, 需要自行修改代码corp-id
: 企业IDsecret
: 企业应用的Secretagent-id
: 企业应用的IDtoken
: 应用收到消息的回调所需的token (receiver使用)aes-key
: 应用收到消息的回调所需的加密密钥 (receiver使用)
receiver还需要在企业微信中配置应用的回调URL, 例如本应用的域名是msg.example.com
, bot是maid
, 那么URL就需要填写https://msg.example.com/api/bot/maid/wechat/callback
[bot.maid.wechat]
debug = false
enable-receiver = false
enable-sender = false
corp-id = ''
secret = ''
agent-id = 0
token = ''
aes-key = ''
API调用发送
通过API可以绕过发送渠道直接通过Bot发送给指定的目标, 无需先添加发送渠道, 再通过发送渠道发送
/api/send
发送
支持POST/GET
参数如下
id
: 发送渠道的IDsign
: 发送渠道的标记type
: 消息类型(text/textcard/markdown/html), 由于部分消息类型仅支持特定平台, 因此在不支持的平台会自动变更为其他类型at
: 秒级Unix时间戳, 信息期望的发送时间title
: 信息标题msg
: 信息内容
其中id
和sign
提供一个即可, title
和msg
至少填写一个
/send/cancel
取消
在消息还未发送出去时 (未达到指定发送时间), 取消发送此消息
id
: 消息的ID
其他API
请在cmd/app/server/app/server.go
查询
示例: maid
每个bot的API请在cmd/app/server/bot/bot.go
查询, 通过这些API可以直接调用指定bot发送信息
/api/bot/maid/sms/send
:POST/GET
参数为phone
,msg
/api/bot/maid/mail/send
:POST/GET
参数为to
,subject
,type
,msg
/api/bot/maid/telegram/send
:POST/GET
参数为chat
,mode
,msg
/api/bot/maid/wechat/send
:POST/GET
参数为touser
,type
,title
,msg
,url
,btn
/api/bot/maid/wechat/callback
: 企业微信回调
示例: reminder
/api/bot/reminder/wechat/send
:POST/GET
参数为touser
,type
,title
,msg
,url
,btn
/api/bot/reminder/wechat/callback
: 企业微信回调
使用简易教程
以Maid为例, 仅提供创建所需参数介绍
SMS
在发送渠道这里, 点击创建
如图
- 标记: 我将此渠道的标记配置为
channel_sms_1
, 这样我就可以用此标记替代通知渠道ID来代指某个通知渠道, 这个可以随意填写, 但无法创建已存在的字符串(包括存在于其他人账号中的) - 名称: 名称随意
- Bot: 这个演示里我用 Maid 作为发送信息的机器人
- 类型: 我希望用这个Bot发送 短信
- 目标: 我希望用这个Bot给 10086 发送短信
邮件
在发送渠道这里, 点击创建
如图
- 标记: 我将此渠道的标记配置为
mail_1
, 这样我就可以用此标记替代通知渠道ID来代指某个通知渠道, 这个可以随意填写, 但无法创建已存在的字符串(包括存在于其他人账号中的) - 名称: 名称随意
- Bot: 这个演示里我用 Maid 作为发送信息的机器人
- 类型: 我希望用这个Bot发送 邮件
- 目标: 我希望用这个Bot给 akvicor@akvicor.com 发送邮件
Telegram
在发送渠道这里, 点击创建
如图
- 标记: 我将此渠道的标记配置为
tg
, 这样我就可以用此标记替代通知渠道ID来代指某个通知渠道, 这个可以随意填写, 但无法创建已存在的字符串(包括存在于其他人账号中的) - 名称: 名称随意
- Bot: 这个演示里我用 Maid 作为发送信息的机器人
- 类型: 我希望用这个Bot发送 Telegram
- 目标: 我希望用这个Bot给 -123456789 发送邮件(通过在会话中发送
\get_id
获取,适用于与bot的私聊,和bot共同的Group和Channel)
微信
在发送渠道这里, 点击创建
如图
- 标记: 我将此渠道的标记配置为
wechat
, 这样我就可以用此标记替代通知渠道ID来代指某个通知渠道, 这个可以随意填写, 但无法创建已存在的字符串(包括存在于其他人账号中的) - 名称: 名称随意
- Bot: 这个演示里我用 Maid 作为发送信息的机器人
- 类型: 我希望用这个Bot发送 微信
- 目标: 我希望用这个Bot给 Akvicor 发送邮件(通过在会话中发送
\get_id
获取,适用于与bot的私聊,和bot共同的Group和Channel)
发送目标来源
开发
目录cmd/app/server/bot
下存放各类平台和bot
平台
cmd/app/server/bot/mail
收发邮件相关的代码cmd/app/server/bot/sms
收发短信相关的代码cmd/app/server/bot/telegram
收发Telegram相关的代码cmd/app/server/bot/wechat
收发微信相关的代码
Maid
cmd/app/server/bot/maid.go
内就是Maid这个bot相关的功能
- 开启接收邮件后:
mailReceiver
函数用于处理接收到的所有邮件, 代码默认不对邮件内容做出任何操作 - 开启接收Telegram后:
telegramReceiver
函数用于处理接收到的所有电报信息, 函数简单的对每种类型信息做了区分, 如果想要对应功能则自行在对应的信息下编写功能, 代码默认不对信息内容做出任何操作 - 开启接收微信后:
wechatReceiver
函数用于处理接收到的所有微信消息, 代码默认不对消息内容做出任何操作
Reminder
cmd/app/server/bot/reminder.go
内就是Reminder这个bot相关的功能
开启接收微信后: wechatReceiver
函数用于处理接收到的所有微信消息, 这个函数提供了Reminder的定时发送信息功能