refactor: 重命名 ParseRssFeed 函数为 ParseFeed,并更新相关调用,增强代码可读性和一致性;添加 RSS 解析测试用例,确保功能的正确性和稳定性

This commit is contained in:
lixiangwuxian 2025-07-17 14:28:12 +08:00
parent a5b24d4437
commit aa52fb16d1
3 changed files with 22 additions and 9 deletions

View File

@ -47,7 +47,7 @@ func CheckNewRss() {
continue continue
} }
//获取最新的rss数据 //获取最新的rss数据
title, items, err := ParseRssFeed(feed.FeedURL) title, items, err := ParseFeed(feed.FeedURL)
if err != nil { if err != nil {
continue continue
} }
@ -64,11 +64,12 @@ func CheckNewRss() {
&qq_message.TextMessage{ &qq_message.TextMessage{
Type: qq_message.TypeText, Type: qq_message.TypeText,
Data: qq_message.TextMessageData{ Data: qq_message.TextMessageData{
Text: fmt.Sprintf("您订阅的%s发布了新的文章: %s", title, items[0].Title), Text: fmt.Sprintf("您订阅的%s发布了新的文章: %s\n%s", title, items[0].Title, items[0].Link),
}, },
}, },
}, },
}) })
db.Model(&group).Update("last_item_hash", items[0].Hash)
} }
} }
} }

View File

@ -3,6 +3,7 @@ package rss
import ( import (
"crypto/md5" "crypto/md5"
"encoding/xml" "encoding/xml"
"errors"
"fmt" "fmt"
"io" "io"
"net/http" "net/http"
@ -43,7 +44,7 @@ func CheckRssFeed(feedURL string) error {
return nil return nil
} }
func ParseRssFeed(feedURL string) (string, []RssItem, error) { func ParseFeed(feedURL string) (string, []RssItem, error) {
//确认大小 //确认大小
resp, err := http.Head(feedURL) resp, err := http.Head(feedURL)
if err != nil { if err != nil {
@ -81,6 +82,10 @@ func ParseRssFeed(feedURL string) (string, []RssItem, error) {
return "", nil, fmt.Errorf("解析RSS/Atom数据失败: %v", err) return "", nil, fmt.Errorf("解析RSS/Atom数据失败: %v", err)
} }
if len(items) == 0 {
return title, nil, errors.New("未解析到rss信息")
}
return title, items, nil return title, items, nil
} }

View File

@ -27,7 +27,7 @@ func init() {
func TestRss(msg model.Message) (reply *model.Reply) { func TestRss(msg model.Message) (reply *model.Reply) {
rssUrl := util.SplitN(msg.StructuredMsg[0].(*qq_message.TextMessage).Data.Text, 2)[1] rssUrl := util.SplitN(msg.StructuredMsg[0].(*qq_message.TextMessage).Data.Text, 2)[1]
title, items, err := ParseRssFeed(rssUrl) title, items, err := ParseFeed(rssUrl)
if err != nil { if err != nil {
return &model.Reply{ return &model.Reply{
ReplyMsg: "解析RSS源失败: " + err.Error(), ReplyMsg: "解析RSS源失败: " + err.Error(),
@ -76,7 +76,8 @@ func Subscribe(msg model.Message) (reply *model.Reply) {
// SubscribeToFeed 订阅RSS源 // SubscribeToFeed 订阅RSS源
func SubscribeToFeed(feedURL string, userID int64, groupID int64) error { func SubscribeToFeed(feedURL string, userID int64, groupID int64) error {
db := sqlite3.GetGormDB() db := sqlite3.GetGormDB().Begin()
defer db.Rollback()
// 确保URL有协议前缀 // 确保URL有协议前缀
if !regexp.MustCompile(`^https?://`).MatchString(feedURL) { if !regexp.MustCompile(`^https?://`).MatchString(feedURL) {
@ -116,16 +117,22 @@ func SubscribeToFeed(feedURL string, userID int64, groupID int64) error {
return fmt.Errorf("该群已订阅过此RSS源") return fmt.Errorf("该群已订阅过此RSS源")
} }
//获取最新文章hash
_, items, err := ParseFeed(feedURL)
if err != nil {
return err
}
// 创建订阅关系 // 创建订阅关系
newSubscribe := RssSubscribe{ newSubscribe := RssSubscribe{
FeedID: feedID, FeedID: feedID,
GroupID: int(groupID), GroupID: int(groupID),
LastItemHash: items[0].Hash,
} }
if err := db.Create(&newSubscribe).Error; err != nil { if err := db.Create(&newSubscribe).Error; err != nil {
return fmt.Errorf("创建订阅关系失败: %v", err) return fmt.Errorf("创建订阅关系失败: %v", err)
} }
return db.Commit().Error
return nil
} }
func MySubscribed(msg model.Message) (reply *model.Reply) { func MySubscribed(msg model.Message) (reply *model.Reply) {