feat(bilibili): bilibili login

This commit is contained in:
mei
2026-04-05 22:28:38 +08:00
parent 202f53915f
commit 52dc548c53
10 changed files with 73 additions and 193 deletions
-30
View File
@@ -1,30 +0,0 @@
package bilibili
import (
"log"
"os"
"github.com/CuteReimu/bilibili/v2"
)
// Qrcode login
func HandleLoginWithQRCode(biliClient *bilibili.Client) {
qrCode, err := biliClient.GetQRCode()
if err != nil {
log.Printf("获取二维码失败: %v", err)
return
}
buf, _ := qrCode.Encode()
os.WriteFile("tmp/qrcode.png", buf, 0644)
qrCode.Print()
result, err := biliClient.LoginWithQRCode(bilibili.LoginWithQRCodeParam{
QrcodeKey: qrCode.QrcodeKey,
})
if err != nil || result.Code != 0 {
log.Printf("登录失败: %v", err)
return
}
log.Println("登录成功")
}
+1 -1
View File
@@ -1,7 +1,7 @@
package bilibili
type BiliAccount struct {
CookiesString string `json:"cookies_string"`
RawCookies string `json:"raw_cookies"`
}
type BiliDynamicRule struct {
+1 -99
View File
@@ -2,110 +2,12 @@ package bilibili
import (
"encoding/json"
"log"
"net/http"
"strings"
"time"
"github.com/CuteReimu/bilibili/v2"
"github.com/ssdomei232/goodBaby/handler/db"
"github.com/ssdomei232/goodBaby/model"
)
// 检查cookie是否过期
func isCookiesExpired(cookiesString string) bool {
// 从cookie字符串中提取过期时间
lines := strings.SplitSeq(cookiesString, "\n")
for line := range lines {
if strings.Contains(line, "Expires=") {
// 提取过期时间字符串
expireStr := ""
parts := strings.SplitSeq(line, ";")
for part := range parts {
part = strings.TrimSpace(part)
if after, ok := strings.CutPrefix(part, "Expires="); ok {
expireStr = after
break
}
}
if expireStr != "" {
// 解析过期时间
expireTime, err := http.ParseTime(expireStr)
if err != nil {
log.Printf("解析过期时间失败: %v", err)
return true // 如果解析失败,cookie已过期
}
if time.Now().After(expireTime) {
return true
}
}
}
}
return false
}
// 检查cookie是否即将过期(提前1天)
func isCookiesExpiringSoon(cookiesString string) bool {
lines := strings.SplitSeq(cookiesString, "\n")
for line := range lines {
if strings.Contains(line, "Expires=") {
// 提取过期时间字符串
expireStr := ""
parts := strings.SplitSeq(line, ";")
for part := range parts {
part = strings.TrimSpace(part)
if after, ok := strings.CutPrefix(part, "Expires="); ok {
expireStr = after
break
}
}
if expireStr != "" {
// 解析过期时间
expireTime, err := http.ParseTime(expireStr)
if err != nil {
log.Printf("解析过期时间失败: %v", err)
return true // 如果解析失败,认为需要重新登录
}
// 检查是否即将过期(提前1天)
if time.Now().Add(24 * time.Hour).After(expireTime) {
return true // 即将过期
}
}
}
}
return false
}
// 触发登录请求
func triggerLoginRequest(biliClient *bilibili.Client) {
// 生成新的二维码
qrCode, err := biliClient.GetQRCode()
if err != nil {
log.Printf("获取二维码失败: %v", err)
return
}
// 在命令行打印二维码
log.Println("需要重新登录哔哩哔哩")
qrCode.Print()
// 通过Dingtalk发送登录请求
// title := "B站登录请求 - Cookie即将过期"
// msg := "您的B站cookie即将过期,请尽快重启摇篮系统进行登陆,请尽快完成登录操作。"
// 发送Dingtalk通知
// if config.DingtalkBot.AccessToken != "" && config.DingtalkBot.Secret != "" {
// SendDingTalkMsg(title, msg, config.DingtalkBot.AccessToken, config.DingtalkBot.Secret)
// }
}
// 获取 Bilibili Client
func GetBiliClient(rule *model.Rule) (*bilibili.Client, error) {
client := bilibili.New()
@@ -128,7 +30,7 @@ func GetBiliClient(rule *model.Rule) (*bilibili.Client, error) {
return nil, err
}
client.SetCookiesString(biliAccountConfig.CookiesString)
client.SetRawCookies(biliAccountConfig.RawCookies)
return client, nil
}
+20 -2
View File
@@ -1,5 +1,23 @@
// dingtalk 仅用于发送提醒
package dingtalk
import "github.com/ssdomei232/goodBaby/model"
import (
"log"
func SendDingTalkMsg(user *model.User, title string, msg string) {}
"github.com/CatchZeng/dingtalk/pkg/dingtalk"
"github.com/ssdomei232/goodBaby/model"
)
func SendDingTalkMsg(user *model.User, title string, msg string) {
dingtalkAccount := getDingTalkConfigFromUser(user)
if dingtalkAccount == nil {
return
}
client := dingtalk.NewClient(dingtalkAccount.AccessToken, dingtalkAccount.Secret)
sendMsg := dingtalk.NewMarkdownMessage().SetMarkdown(title, msg)
_, _, err := client.Send(sendMsg)
if err != nil {
log.Printf("发送钉钉消息失败: %v", err)
}
}