diff --git a/channel/bark.go b/channel/bark.go new file mode 100644 index 0000000..9716894 --- /dev/null +++ b/channel/bark.go @@ -0,0 +1,39 @@ +package channel + +import ( + "encoding/json" + "errors" + "fmt" + "message-pusher/model" + "net/http" +) + +type barkMessageResponse struct { + Code int `json:"code"` + Message string `json:"message"` +} + +func SendBarkMessage(message *Message, user *model.User) error { + if user.BarkServer == "" || user.BarkSecret == "" { + return errors.New("未配置 Bark 消息推送方式") + } + url := "" + if message.Title != "" { + url = fmt.Sprintf("%s/%s/%s/%s", user.BarkServer, user.BarkSecret, message.Title, message.Description) + } else { + url = fmt.Sprintf("%s/%s/%s", user.BarkServer, user.BarkSecret, message.Description) + } + resp, err := http.Get(url) + if err != nil { + return err + } + var res barkMessageResponse + err = json.NewDecoder(resp.Body).Decode(&res) + if err != nil { + return err + } + if res.Code != 200 { + return errors.New(res.Message) + } + return nil +} diff --git a/channel/main.go b/channel/main.go index af22929..77153e5 100644 --- a/channel/main.go +++ b/channel/main.go @@ -12,6 +12,7 @@ const ( TypeLark = "lark" TypeDing = "ding" TypeTelegram = "telegram" + TypeBark = "bark" ) type Message struct { @@ -36,6 +37,8 @@ func (message *Message) Send(user *model.User) error { return SendLarkMessage(message, user) case TypeDing: return SendDingMessage(message, user) + case TypeBark: + return SendBarkMessage(message, user) default: return errors.New("不支持的消息通道:" + message.Channel) } diff --git a/controller/user.go b/controller/user.go index 61b17fa..bea72e5 100644 --- a/controller/user.go +++ b/controller/user.go @@ -413,6 +413,8 @@ func UpdateSelf(c *gin.Context) { LarkWebhookSecret: user.LarkWebhookSecret, DingWebhookURL: user.DingWebhookURL, DingWebhookSecret: user.DingWebhookSecret, + BarkServer: user.BarkServer, + BarkSecret: user.BarkSecret, } channel.TokenStoreUpdateUser(&cleanUser, originUser) diff --git a/model/user.go b/model/user.go index ac0f326..a6dc7dc 100644 --- a/model/user.go +++ b/model/user.go @@ -35,6 +35,8 @@ type User struct { LarkWebhookSecret string `json:"lark_webhook_secret"` DingWebhookURL string `json:"ding_webhook_url"` DingWebhookSecret string `json:"ding_webhook_secret"` + BarkServer string `json:"bark_server"` + BarkSecret string `json:"bark_secret"` } func GetMaxUserId() int { @@ -68,8 +70,7 @@ func GetUserById(id int, selectAll bool) (*User, error) { "channel", "token", "wechat_test_account_id", "wechat_test_account_template_id", "wechat_test_account_open_id", "wechat_corp_account_id", "wechat_corp_account_agent_id", "wechat_corp_account_user_id", "wechat_corp_account_client_type", - "lark_webhook_url", - "ding_webhook_url", + "lark_webhook_url", "ding_webhook_url", "bark_server", }).First(&user, "id = ?", id).Error } return &user, err diff --git a/web/src/components/PushSetting.js b/web/src/components/PushSetting.js index dc0a3f7..fb2ab5e 100644 --- a/web/src/components/PushSetting.js +++ b/web/src/components/PushSetting.js @@ -29,6 +29,8 @@ const PushSetting = () => { lark_webhook_secret: '', ding_webhook_url: '', ding_webhook_secret: '', + bark_server: '', + bark_secret: '', }); let [loading, setLoading] = useState(false); @@ -49,6 +51,9 @@ const PushSetting = () => { if (data.token === ' ') { data.token = ''; } + if (data.bark_server === '') { + data.bark_server = 'https://api.day.app'; + } setInputs(data); } else { showError(message); @@ -96,6 +101,10 @@ const PushSetting = () => { data.ding_webhook_url = inputs.ding_webhook_url; data.ding_webhook_secret = inputs.ding_webhook_secret; break; + case 'bark': + data.bark_server = inputs.bark_server; + data.bark_secret = inputs.bark_secret; + break; default: showError(`无效的参数:${which}`); return; @@ -137,6 +146,7 @@ const PushSetting = () => { { key: 'corp', text: '企业微信', value: 'corp' }, { key: 'lark', text: '飞书群机器人', value: 'lark' }, { key: 'ding', text: '钉钉群机器人', value: 'ding' }, + { key: 'bark', text: 'Bark', value: 'bark' }, ]} value={inputs.channel} onChange={handleInputChange} @@ -375,6 +385,36 @@ const PushSetting = () => { 保存 + +
+ Bark 设置(bark) + + 通过 Bark 进行推送,下载 Bark 后按提示注册设备即可。 + +
+ + + + + +