diff --git a/jwch_test.go b/jwch_test.go index 11fe259..2342a06 100644 --- a/jwch_test.go +++ b/jwch_test.go @@ -279,7 +279,7 @@ func TestGetExamRoomInfo(t *testing.T) { } func TestGetNoticesInfo(t *testing.T) { - _, err := stu.GetNoticeInfo() + _, err := stu.GetNoticeInfo(&NoticeInfoReq{PageNum: 2}) if err != nil { t.Error(err) } diff --git a/model.go b/model.go index 8da6832..5c6ee29 100644 --- a/model.go +++ b/model.go @@ -193,3 +193,7 @@ type NoticeInfo struct { URL string // 通知链接 Date string // 通知日期 } + +type NoticeInfoReq struct { + PageNum int // 获取第几页的数据,从 1 开始 +} diff --git a/notice.go b/notice.go index 2993d29..44215b9 100644 --- a/notice.go +++ b/notice.go @@ -26,15 +26,24 @@ import ( "github.com/west2-online/jwch/constants" ) -func (s *Student) GetNoticeInfo() (list []*NoticeInfo, err error) { - // 获取通知公告 - // 1. 获取通知公告页面 +func (s *Student) GetNoticeInfo(req *NoticeInfoReq) (list []*NoticeInfo, err error) { + // 获取通知公告页面的总页数 res, err := s.PostWithIdentifier(constants.NoticeInfoQueryURL, map[string]string{}) if err != nil { return nil, err } - // 2. 解析页面 - list, err = parseNoticeInfo(res) + lastPageNum, err := getTotalPages(res) + if err != nil { + return nil, err + } + // 根据总页数计算 url + num := lastPageNum - req.PageNum + 1 + url := fmt.Sprintf("https://jwch.fzu.edu.cn/jxtz/%d.htm", num) + doc, err := s.PostWithIdentifier(url, map[string]string{}) + if err != nil { + return nil, err + } + list, err = parseNoticeInfo(doc) if err != nil { return nil, err } @@ -42,17 +51,16 @@ func (s *Student) GetNoticeInfo() (list []*NoticeInfo, err error) { return list, nil } +// 获取当前页面的所有数据信息 func parseNoticeInfo(doc *html.Node) ([]*NoticeInfo, error) { // 解析通知公告页面 var list []*NoticeInfo - // 修正 XPath 表达式 sel := htmlquery.FindOne(doc, "//div[@class='box-gl clearfix']") if sel == nil { return nil, fmt.Errorf("cannot find the notice list") } - // 查找所有的
  • 元素 rows := htmlquery.Find(sel, ".//ul[@class='list-gl']/li") for _, row := range rows { @@ -74,9 +82,24 @@ func parseNoticeInfo(doc *html.Node) ([]*NoticeInfo, error) { URL: url, Date: date, } - list = append(list, noticeInfo) } return list, nil } + +// 获取总页数 +func getTotalPages(doc *html.Node) (int, error) { + totalPagesNode := htmlquery.FindOne(doc, "//span[@class='p_pages']//a[@href='jxtz/1.htm']") + if totalPagesNode == nil { + return 0, fmt.Errorf("未找到总页数") + } + + totalPagesStr := htmlquery.InnerText(totalPagesNode) + var totalPages int + _, err := fmt.Sscanf(totalPagesStr, "%d", &totalPages) + if err != nil { + return 0, fmt.Errorf("解析总页数失败: %v", err) + } + return totalPages, nil +}