This commit is contained in:
xing 2025-03-20 23:29:05 +08:00
parent ed796e6d7f
commit 7d530f8d7d
2 changed files with 44 additions and 17 deletions

View File

@ -14,16 +14,26 @@ import (
"time" "time"
) )
func LearnParse(s string, recentDay int) string { func LearnParse(s string, recentDay int) (string, error) {
document, err := goquery.NewDocumentFromReader(strings.NewReader(s)) document, err := goquery.NewDocumentFromReader(strings.NewReader(s))
if err != nil { if err != nil {
return "" return "", err
} }
var item []rss2.Item var item []rss2.Item
item = append(item, full(document, recentDay)) f, err := full(document, recentDay)
item = append(item, items(document, recentDay)...) if err != nil {
log.Println(err)
} else {
item = append(item, f)
}
i, err := items(document, recentDay)
if err != nil {
log.Println(err)
} else {
item = append(item, i...)
}
if len(item) < 1 { if len(item) < 1 {
return "" return "", err
} }
rss := rss2.Rss2{ rss := rss2.Rss2{
Title: "BBC 英语教学", Title: "BBC 英语教学",
@ -31,7 +41,7 @@ func LearnParse(s string, recentDay int) string {
LastBuildDate: time.Now().Format(time.RFC1123Z), LastBuildDate: time.Now().Format(time.RFC1123Z),
Items: item, Items: item,
} }
return rss.GetXML() return rss.GetXML(), nil
} }
func parseTime(u string) (date time.Time, err error) { func parseTime(u string) (date time.Time, err error) {
@ -46,7 +56,7 @@ func parseTime(u string) (date time.Time, err error) {
return return
} }
func dateFilter(u string, recentDay int) (r bool) { func dateFilter(u string, recentDay int) (r bool, err error) {
date, err := parseTime(u) date, err := parseTime(u)
if err != nil { if err != nil {
return return
@ -59,7 +69,7 @@ func dateFilter(u string, recentDay int) (r bool) {
return return
} }
func fetch(u string) (r rss2.Item) { func fetch(u string) (r rss2.Item, err error) {
res, err := http.Get(u) res, err := http.Get(u)
if err != nil { if err != nil {
return return
@ -111,11 +121,13 @@ func downAndSendMail(doc *goquery.Document, title string) {
if ok { if ok {
response, err := http.Get(uu) response, err := http.Get(uu)
if err != nil { if err != nil {
log.Println(err)
continue continue
} }
name := filepath.Base(uu) name := filepath.Base(uu)
file, err := os.OpenFile(name, os.O_CREATE|os.O_WRONLY, 0755) file, err := os.OpenFile(name, os.O_CREATE|os.O_WRONLY, 0755)
if err != nil { if err != nil {
log.Println(err)
continue continue
} }
fn = append(fn, func() { fn = append(fn, func() {
@ -124,6 +136,7 @@ func downAndSendMail(doc *goquery.Document, title string) {
}) })
_, err = io.Copy(file, response.Body) _, err = io.Copy(file, response.Body)
if err != nil { if err != nil {
log.Println(err)
continue continue
} }
mm.f = append(mm.f, name) mm.f = append(mm.f, name)
@ -151,26 +164,36 @@ func downAndSendMail(doc *goquery.Document, title string) {
} }
} }
func full(doc *goquery.Document, recentDay int) (r rss2.Item) { func full(doc *goquery.Document, recentDay int) (r rss2.Item, err error) {
a := doc.Find("#bbcle-content .widget-container-full a") a := doc.Find("#bbcle-content .widget-container-full a")
u, ok := a.Attr("href") u, ok := a.Attr("href")
if !ok { if !ok {
return return
} }
if !dateFilter(u, recentDay) { if ok, er := dateFilter(u, recentDay); !ok || er != nil {
err = er
return return
} }
r = fetch(u) r, err = fetch(u)
return return
} }
func items(doc *goquery.Document, recentDay int) (r []rss2.Item) { func items(doc *goquery.Document, recentDay int) (r []rss2.Item, err error) {
doc.Find("#bbcle-content > div > div.widget-container.widget-container-full > div.widget.widget-image.widget-image-two_column > div a").Each(func(i int, s *goquery.Selection) { doc.Find(`div[data-widget-index="5"] div.items >div> a`).Each(func(i int, s *goquery.Selection) {
u, ok := s.Attr("href") u, ok := s.Attr("href")
if !ok || !dateFilter(u, recentDay) { if !ok {
ok, err = dateFilter(u, recentDay)
if !ok || err != nil {
return return
} }
r = append(r, fetch(u))
}
rr, er := fetch(u)
if er != nil {
err = er
return
}
r = append(r, rr)
}) })
return return
} }

View File

@ -75,7 +75,11 @@ func tjxz(w http.ResponseWriter, r *http.Request) {
} }
func bbcLearn(w http.ResponseWriter, _ *http.Request) { func bbcLearn(w http.ResponseWriter, _ *http.Request) {
io.WriteString(w, fetch("https://www.bbc.co.uk/learningenglish/chinese", func(s string) string { io.WriteString(w, fetch("https://www.bbc.co.uk/learningenglish/chinese", func(s string) string {
return bbclearn.LearnParse(s, recentDay) xm, err := bbclearn.LearnParse(s, recentDay)
if err != nil {
log.Println(err)
}
return xm
})) }))
} }
@ -96,7 +100,7 @@ var recentDay = 1
func main() { func main() {
port := os.Getenv("port") port := os.Getenv("port")
if port == "" { if port == "" {
port = ":80" port = "127.0.0.1:8081"
} }
day := os.Getenv("rss_recent_day") day := os.Getenv("rss_recent_day")
if day != "" { if day != "" {