feat: 钉钉机器人通知
This commit is contained in:
@@ -49,7 +49,10 @@
|
|||||||
"token": "ghp_xxxx"
|
"token": "ghp_xxxx"
|
||||||
},
|
},
|
||||||
"bili_msg": "xxx", // 哔哩哔哩动态的附加消息
|
"bili_msg": "xxx", // 哔哩哔哩动态的附加消息
|
||||||
"bili_warn_address": "" // 哔哩哔哩cookie过期发送告警的邮件地址
|
"dingtalk_bot": {
|
||||||
|
"access_token": "", // 钉钉机器人的 access_token
|
||||||
|
"secret": "" // 钉钉机器人的 secret
|
||||||
|
} // 钉钉机器人(用于提醒发送signal和bilibili过期提醒)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
+5
-2
@@ -7,7 +7,7 @@
|
|||||||
"cause_stop": "自杀"
|
"cause_stop": "自杀"
|
||||||
},
|
},
|
||||||
"signal_secret": "",
|
"signal_secret": "",
|
||||||
"debug": false,
|
"debug": true,
|
||||||
"disconnect_duration": 5,
|
"disconnect_duration": 5,
|
||||||
"enable_qq": true,
|
"enable_qq": true,
|
||||||
"cat_bot_url": "",
|
"cat_bot_url": "",
|
||||||
@@ -29,5 +29,8 @@
|
|||||||
"token": "ghp_xxxx"
|
"token": "ghp_xxxx"
|
||||||
},
|
},
|
||||||
"bili_msg": "摇篮系统测试",
|
"bili_msg": "摇篮系统测试",
|
||||||
"bili_warn_address": ""
|
"dingtalk_bot": {
|
||||||
|
"access_token": "",
|
||||||
|
"secret": ""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+6
-1
@@ -21,7 +21,7 @@ type Config struct {
|
|||||||
MailContent string `json:"mail_content"`
|
MailContent string `json:"mail_content"`
|
||||||
GithubConfig GithubConfig `json:"github_config"`
|
GithubConfig GithubConfig `json:"github_config"`
|
||||||
BiliMsg string `json:"bili_msg"`
|
BiliMsg string `json:"bili_msg"`
|
||||||
BiliWarnAddress string `json:"bili_warn_address"`
|
DingtalkBot DingtalkBot `json:"dingtalk_bot"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type SMTPConfig struct {
|
type SMTPConfig struct {
|
||||||
@@ -45,6 +45,11 @@ type Basic struct {
|
|||||||
CauseStop string `json:"cause_stop"`
|
CauseStop string `json:"cause_stop"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type DingtalkBot struct {
|
||||||
|
AccessToken string `json:"access_token"`
|
||||||
|
Secret string `json:"secret"`
|
||||||
|
}
|
||||||
|
|
||||||
// Get config from json file
|
// Get config from json file
|
||||||
func GetConfig() (config Config, err error) {
|
func GetConfig() (config Config, err error) {
|
||||||
content, err := os.ReadFile("config.json")
|
content, err := os.ReadFile("config.json")
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ module github.com/ssdomei232/goodBaby
|
|||||||
go 1.24.0
|
go 1.24.0
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/CatchZeng/dingtalk v1.5.0
|
||||||
github.com/CuteReimu/bilibili/v2 v2.3.5
|
github.com/CuteReimu/bilibili/v2 v2.3.5
|
||||||
github.com/gin-gonic/gin v1.11.0
|
github.com/gin-gonic/gin v1.11.0
|
||||||
github.com/robfig/cron/v3 v3.0.1
|
github.com/robfig/cron/v3 v3.0.1
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
|
bou.ke/monkey v1.0.2 h1:kWcnsrCNUatbxncxR/ThdYqbytgOIArtYWqcQLQzKLI=
|
||||||
|
bou.ke/monkey v1.0.2/go.mod h1:OqickVX3tNx6t33n1xvtTtu85YN5s6cKwVug+oHMaIA=
|
||||||
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f h1:2dk3eOnYllh+wUOuDhOoC2vUVoJF/5z478ryJ+wzEII=
|
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f h1:2dk3eOnYllh+wUOuDhOoC2vUVoJF/5z478ryJ+wzEII=
|
||||||
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f/go.mod h1:4a58ifQTEe2uwwsaqbh3i2un5/CBPg+At/qHpt18Tmk=
|
github.com/Baozisoftware/qrcode-terminal-go v0.0.0-20170407111555-c0650d8dff0f/go.mod h1:4a58ifQTEe2uwwsaqbh3i2un5/CBPg+At/qHpt18Tmk=
|
||||||
|
github.com/CatchZeng/dingtalk v1.5.0 h1:3YNpGIdeZ4pTfjjVyC2G1CCzWocMmYniBY8CXiOY9Ss=
|
||||||
|
github.com/CatchZeng/dingtalk v1.5.0/go.mod h1:/CT0Eskr26XfjAybLBLV+DjvPHaznwiFXRBndQp7zZ8=
|
||||||
github.com/CuteReimu/bilibili/v2 v2.3.5 h1:0MpBOJL6Q7kP3lFItC7NQ3MLG/I1uIzZBjemXIE0CRM=
|
github.com/CuteReimu/bilibili/v2 v2.3.5 h1:0MpBOJL6Q7kP3lFItC7NQ3MLG/I1uIzZBjemXIE0CRM=
|
||||||
github.com/CuteReimu/bilibili/v2 v2.3.5/go.mod h1:FHKH1cc04M/qpQhF+DaFIBFleLtvgMwYfZCNhHK/kBQ=
|
github.com/CuteReimu/bilibili/v2 v2.3.5/go.mod h1:FHKH1cc04M/qpQhF+DaFIBFleLtvgMwYfZCNhHK/kBQ=
|
||||||
github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ=
|
github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ=
|
||||||
@@ -33,6 +37,8 @@ github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
|
|||||||
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
|
||||||
github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
|
github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw=
|
||||||
github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
|
github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA=
|
||||||
|
github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc=
|
||||||
|
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
|
||||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
|
|||||||
+13
-17
@@ -195,16 +195,16 @@ func CheckCookieValidity(biliClient *bilibili.Client) {
|
|||||||
|
|
||||||
// 检查cookie是否即将过期(提前1天)
|
// 检查cookie是否即将过期(提前1天)
|
||||||
func isCookiesExpiringSoon(cookiesString string) bool {
|
func isCookiesExpiringSoon(cookiesString string) bool {
|
||||||
lines := strings.Split(cookiesString, "\n")
|
lines := strings.SplitSeq(cookiesString, "\n")
|
||||||
for _, line := range lines {
|
for line := range lines {
|
||||||
if strings.Contains(line, "Expires=") {
|
if strings.Contains(line, "Expires=") {
|
||||||
// 提取过期时间字符串
|
// 提取过期时间字符串
|
||||||
expireStr := ""
|
expireStr := ""
|
||||||
parts := strings.Split(line, ";")
|
parts := strings.SplitSeq(line, ";")
|
||||||
for _, part := range parts {
|
for part := range parts {
|
||||||
part = strings.TrimSpace(part)
|
part = strings.TrimSpace(part)
|
||||||
if strings.HasPrefix(part, "Expires=") {
|
if after, ok := strings.CutPrefix(part, "Expires="); ok {
|
||||||
expireStr = strings.TrimPrefix(part, "Expires=")
|
expireStr = after
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -248,19 +248,15 @@ func triggerLoginRequest(biliClient *bilibili.Client) {
|
|||||||
log.Println("需要重新登录哔哩哔哩")
|
log.Println("需要重新登录哔哩哔哩")
|
||||||
qrCode.Print()
|
qrCode.Print()
|
||||||
|
|
||||||
// 通过邮件发送登录请求
|
// 通过Dingtalk发送登录请求
|
||||||
emailTitle := "B站登录请求 - Cookie即将过期"
|
title := "B站登录请求 - Cookie即将过期"
|
||||||
emailMsg := "您的B站cookie即将过期,请尽快重启摇篮系统进行登陆,请尽快完成登录操作。"
|
msg := "您的B站cookie即将过期,请尽快重启摇篮系统进行登陆,请尽快完成登录操作。"
|
||||||
|
|
||||||
// 发送邮件通知
|
// 发送Dingtalk通知
|
||||||
if config.BiliWarnAddress != "" {
|
if config.DingtalkBot.AccessToken != "" && config.DingtalkBot.Secret != "" {
|
||||||
err = sendMailMsg(config.BiliWarnAddress, emailMsg, emailTitle)
|
sendDingTalkMsg(title, msg, config.DingtalkBot.AccessToken, config.DingtalkBot.Secret)
|
||||||
if err != nil {
|
|
||||||
log.Printf("发送登录邮件失败: %v", err)
|
|
||||||
} else {
|
|
||||||
log.Println("登录请求邮件已发送")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable periodic cookie checks
|
// Enable periodic cookie checks
|
||||||
|
|||||||
+11
-1
@@ -5,6 +5,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/CatchZeng/dingtalk/pkg/dingtalk"
|
||||||
"github.com/ssdomei232/goodBaby/configs"
|
"github.com/ssdomei232/goodBaby/configs"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -17,6 +18,15 @@ func Reminder() {
|
|||||||
remainingTime := GlobalTimerManager.GetRemainingTime()
|
remainingTime := GlobalTimerManager.GetRemainingTime()
|
||||||
if remainingTime <= 48*time.Hour {
|
if remainingTime <= 48*time.Hour {
|
||||||
sendMsg := fmt.Sprintf("距离摇篮系统触发还有%d小时,请尽快发送Signal", int(remainingTime.Hours()))
|
sendMsg := fmt.Sprintf("距离摇篮系统触发还有%d小时,请尽快发送Signal", int(remainingTime.Hours()))
|
||||||
sendMailMsg(config.BiliWarnAddress, sendMsg, "GoodBaby提醒")
|
sendDingTalkMsg("摇篮系统触发提醒", sendMsg, config.DingtalkBot.AccessToken, config.DingtalkBot.Secret)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func sendDingTalkMsg(title string, msg string, accessToken string, secret string) {
|
||||||
|
client := dingtalk.NewClient(accessToken, secret)
|
||||||
|
sendMsg := dingtalk.NewMarkdownMessage().SetMarkdown(title, msg)
|
||||||
|
_, _, err := client.Send(sendMsg)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("发送钉钉消息失败: %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,10 +70,18 @@ func trigger(config configs.Config) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
config, err := configs.GetConfig()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("获取配置文件失败: %v", err)
|
||||||
|
}
|
||||||
// cron job
|
// cron job
|
||||||
internal.Reminder()
|
internal.Reminder()
|
||||||
c := cron.New()
|
c := cron.New()
|
||||||
|
if config.Debug {
|
||||||
|
c.AddFunc("@every 1s", internal.Reminder)
|
||||||
|
} else {
|
||||||
c.AddFunc("@every 1h", internal.Reminder)
|
c.AddFunc("@every 1h", internal.Reminder)
|
||||||
|
}
|
||||||
c.Start()
|
c.Start()
|
||||||
|
|
||||||
// Web service
|
// Web service
|
||||||
|
|||||||
Reference in New Issue
Block a user