diff --git a/README.md b/README.md index b452bef..cd1506c 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,10 @@ "token": "ghp_xxxx" }, "bili_msg": "xxx", // 哔哩哔哩动态的附加消息 - "bili_warn_address": "" // 哔哩哔哩cookie过期发送告警的邮件地址 + "dingtalk_bot": { + "access_token": "", // 钉钉机器人的 access_token + "secret": "" // 钉钉机器人的 secret + } // 钉钉机器人(用于提醒发送signal和bilibili过期提醒) } ``` diff --git a/config.example.json b/config.example.json index 8c317a2..9c86626 100644 --- a/config.example.json +++ b/config.example.json @@ -7,7 +7,7 @@ "cause_stop": "自杀" }, "signal_secret": "", - "debug": false, + "debug": true, "disconnect_duration": 5, "enable_qq": true, "cat_bot_url": "", @@ -29,5 +29,8 @@ "token": "ghp_xxxx" }, "bili_msg": "摇篮系统测试", - "bili_warn_address": "" + "dingtalk_bot": { + "access_token": "", + "secret": "" + } } \ No newline at end of file diff --git a/configs/config.go b/configs/config.go index 2baa224..c50be23 100644 --- a/configs/config.go +++ b/configs/config.go @@ -21,7 +21,7 @@ type Config struct { MailContent string `json:"mail_content"` GithubConfig GithubConfig `json:"github_config"` BiliMsg string `json:"bili_msg"` - BiliWarnAddress string `json:"bili_warn_address"` + DingtalkBot DingtalkBot `json:"dingtalk_bot"` } type SMTPConfig struct { @@ -45,6 +45,11 @@ type Basic struct { CauseStop string `json:"cause_stop"` } +type DingtalkBot struct { + AccessToken string `json:"access_token"` + Secret string `json:"secret"` +} + // Get config from json file func GetConfig() (config Config, err error) { content, err := os.ReadFile("config.json") diff --git a/go.mod b/go.mod index 2e231ec..558a372 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/ssdomei232/goodBaby go 1.24.0 require ( + github.com/CatchZeng/dingtalk v1.5.0 github.com/CuteReimu/bilibili/v2 v2.3.5 github.com/gin-gonic/gin v1.11.0 github.com/robfig/cron/v3 v3.0.1 diff --git a/go.sum b/go.sum index 48f2f27..52bde9f 100644 --- a/go.sum +++ b/go.sum @@ -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/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/go.mod h1:FHKH1cc04M/qpQhF+DaFIBFleLtvgMwYfZCNhHK/kBQ= 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-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= 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/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= diff --git a/internal/bilibili.go b/internal/bilibili.go index de6c989..be71084 100644 --- a/internal/bilibili.go +++ b/internal/bilibili.go @@ -195,16 +195,16 @@ func CheckCookieValidity(biliClient *bilibili.Client) { // 检查cookie是否即将过期(提前1天) func isCookiesExpiringSoon(cookiesString string) bool { - lines := strings.Split(cookiesString, "\n") - for _, line := range lines { + lines := strings.SplitSeq(cookiesString, "\n") + for line := range lines { if strings.Contains(line, "Expires=") { // 提取过期时间字符串 expireStr := "" - parts := strings.Split(line, ";") - for _, part := range parts { + parts := strings.SplitSeq(line, ";") + for part := range parts { part = strings.TrimSpace(part) - if strings.HasPrefix(part, "Expires=") { - expireStr = strings.TrimPrefix(part, "Expires=") + if after, ok := strings.CutPrefix(part, "Expires="); ok { + expireStr = after break } } @@ -248,19 +248,15 @@ func triggerLoginRequest(biliClient *bilibili.Client) { log.Println("需要重新登录哔哩哔哩") qrCode.Print() - // 通过邮件发送登录请求 - emailTitle := "B站登录请求 - Cookie即将过期" - emailMsg := "您的B站cookie即将过期,请尽快重启摇篮系统进行登陆,请尽快完成登录操作。" + // 通过Dingtalk发送登录请求 + title := "B站登录请求 - Cookie即将过期" + msg := "您的B站cookie即将过期,请尽快重启摇篮系统进行登陆,请尽快完成登录操作。" - // 发送邮件通知 - if config.BiliWarnAddress != "" { - err = sendMailMsg(config.BiliWarnAddress, emailMsg, emailTitle) - if err != nil { - log.Printf("发送登录邮件失败: %v", err) - } else { - log.Println("登录请求邮件已发送") - } + // 发送Dingtalk通知 + if config.DingtalkBot.AccessToken != "" && config.DingtalkBot.Secret != "" { + sendDingTalkMsg(title, msg, config.DingtalkBot.AccessToken, config.DingtalkBot.Secret) } + } // Enable periodic cookie checks diff --git a/internal/remind.go b/internal/remind.go index fa3a6ea..7173dae 100644 --- a/internal/remind.go +++ b/internal/remind.go @@ -5,6 +5,7 @@ import ( "log" "time" + "github.com/CatchZeng/dingtalk/pkg/dingtalk" "github.com/ssdomei232/goodBaby/configs" ) @@ -17,6 +18,15 @@ func Reminder() { remainingTime := GlobalTimerManager.GetRemainingTime() if remainingTime <= 48*time.Hour { 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) } } diff --git a/main.go b/main.go index da3ddc4..810c167 100644 --- a/main.go +++ b/main.go @@ -70,10 +70,18 @@ func trigger(config configs.Config) { } func main() { + config, err := configs.GetConfig() + if err != nil { + log.Printf("获取配置文件失败: %v", err) + } // cron job internal.Reminder() c := cron.New() - c.AddFunc("@every 1h", internal.Reminder) + if config.Debug { + c.AddFunc("@every 1s", internal.Reminder) + } else { + c.AddFunc("@every 1h", internal.Reminder) + } c.Start() // Web service