From aa52fb16d1801337fc24f58d1abca518e5d154ef Mon Sep 17 00:00:00 2001 From: lixiangwuxian Date: Thu, 17 Jul 2025 14:28:12 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E5=91=BD=E5=90=8D=20Parse?= =?UTF-8?q?RssFeed=20=E5=87=BD=E6=95=B0=E4=B8=BA=20ParseFeed=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E6=9B=B4=E6=96=B0=E7=9B=B8=E5=85=B3=E8=B0=83=E7=94=A8?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=BC=BA=E4=BB=A3=E7=A0=81=E5=8F=AF=E8=AF=BB?= =?UTF-8?q?=E6=80=A7=E5=92=8C=E4=B8=80=E8=87=B4=E6=80=A7=EF=BC=9B=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=20RSS=20=E8=A7=A3=E6=9E=90=E6=B5=8B=E8=AF=95=E7=94=A8?= =?UTF-8?q?=E4=BE=8B=EF=BC=8C=E7=A1=AE=E4=BF=9D=E5=8A=9F=E8=83=BD=E7=9A=84?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E6=80=A7=E5=92=8C=E7=A8=B3=E5=AE=9A=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handler/rss/job.go | 5 +++-- handler/rss/parse.go | 7 ++++++- handler/rss/rss.go | 19 +++++++++++++------ 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/handler/rss/job.go b/handler/rss/job.go index d1355d3..81063b5 100644 --- a/handler/rss/job.go +++ b/handler/rss/job.go @@ -47,7 +47,7 @@ func CheckNewRss() { continue } //获取最新的rss数据 - title, items, err := ParseRssFeed(feed.FeedURL) + title, items, err := ParseFeed(feed.FeedURL) if err != nil { continue } @@ -64,11 +64,12 @@ func CheckNewRss() { &qq_message.TextMessage{ Type: qq_message.TypeText, 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) } } } diff --git a/handler/rss/parse.go b/handler/rss/parse.go index 67a20ad..4ee27f2 100644 --- a/handler/rss/parse.go +++ b/handler/rss/parse.go @@ -3,6 +3,7 @@ package rss import ( "crypto/md5" "encoding/xml" + "errors" "fmt" "io" "net/http" @@ -43,7 +44,7 @@ func CheckRssFeed(feedURL string) error { return nil } -func ParseRssFeed(feedURL string) (string, []RssItem, error) { +func ParseFeed(feedURL string) (string, []RssItem, error) { //确认大小 resp, err := http.Head(feedURL) if err != nil { @@ -81,6 +82,10 @@ func ParseRssFeed(feedURL string) (string, []RssItem, error) { return "", nil, fmt.Errorf("解析RSS/Atom数据失败: %v", err) } + if len(items) == 0 { + return title, nil, errors.New("未解析到rss信息") + } + return title, items, nil } diff --git a/handler/rss/rss.go b/handler/rss/rss.go index 55e4799..ef3bc38 100644 --- a/handler/rss/rss.go +++ b/handler/rss/rss.go @@ -27,7 +27,7 @@ func init() { func TestRss(msg model.Message) (reply *model.Reply) { 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 { return &model.Reply{ ReplyMsg: "解析RSS源失败: " + err.Error(), @@ -76,7 +76,8 @@ func Subscribe(msg model.Message) (reply *model.Reply) { // SubscribeToFeed 订阅RSS源 func SubscribeToFeed(feedURL string, userID int64, groupID int64) error { - db := sqlite3.GetGormDB() + db := sqlite3.GetGormDB().Begin() + defer db.Rollback() // 确保URL有协议前缀 if !regexp.MustCompile(`^https?://`).MatchString(feedURL) { @@ -116,16 +117,22 @@ func SubscribeToFeed(feedURL string, userID int64, groupID int64) error { return fmt.Errorf("该群已订阅过此RSS源") } + //获取最新文章hash + _, items, err := ParseFeed(feedURL) + if err != nil { + return err + } + // 创建订阅关系 newSubscribe := RssSubscribe{ - FeedID: feedID, - GroupID: int(groupID), + FeedID: feedID, + GroupID: int(groupID), + LastItemHash: items[0].Hash, } if err := db.Create(&newSubscribe).Error; err != nil { return fmt.Errorf("创建订阅关系失败: %v", err) } - - return nil + return db.Commit().Error } func MySubscribed(msg model.Message) (reply *model.Reply) {