diff --git a/go.mod b/go.mod index 1765e87..e586833 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,11 @@ module github.com/bvp/dnevnik76-api -go 1.12 +go 1.19 require ( - github.com/PuerkitoBio/goquery v1.6.1 - github.com/andybalholm/cascadia v1.2.0 // indirect + github.com/PuerkitoBio/goquery v1.8.0 github.com/bvp/russiantime v0.1.0 - golang.org/x/net v0.0.0-20210119194325-5f4716e94777 + golang.org/x/net v0.2.0 ) + +require github.com/andybalholm/cascadia v1.3.1 // indirect diff --git a/go.sum b/go.sum index 9132c06..19934f0 100644 --- a/go.sum +++ b/go.sum @@ -1,18 +1,24 @@ -github.com/PuerkitoBio/goquery v1.6.1 h1:FgjbQZKl5HTmcn4sKBgvx8vv63nhyhIpv7lJpFGCWpk= -github.com/PuerkitoBio/goquery v1.6.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= -github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= -github.com/andybalholm/cascadia v1.2.0 h1:vuRCkM5Ozh/BfmsaTm26kbjm0mIOM3yS5Ek/F5h18aE= -github.com/andybalholm/cascadia v1.2.0/go.mod h1:YCyR8vOZT9aZ1CHEd8ap0gMVm2aFgxBp0T0eFw1RUQY= +github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U= +github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI= +github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= +github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= github.com/bvp/russiantime v0.1.0 h1:oXpuB2ooSlexQGJ+Vp0ydjQ2IPgiuqpVwxz3vBVclm0= github.com/bvp/russiantime v0.1.0/go.mod h1:jALOcp8csKwzExdl0Yn4OagrU4PZ1YqJlJIayioeyCE= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20221004154528-8021a29435af h1:wv66FM3rLZGPdxpYL+ApnDe2HzHcTFta3z5nsc13wI4= +golang.org/x/net v0.0.0-20221004154528-8021a29435af/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458 h1:MgJ6t2zo8v0tbmLCueaCbF1RM+TtB0rs3Lv8DGtOIpY= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/main.go b/main.go index 772df16..fea7a77 100644 --- a/main.go +++ b/main.go @@ -10,6 +10,7 @@ import ( "log" "regexp" "strconv" + "time" "net/http" "net/http/cookiejar" @@ -31,6 +32,9 @@ const ( urlMarksFinal = "https://my.dnevnik76.ru/marks/itog/" urlMessages = "https://my.dnevnik76.ru/messages/input" urlTeachers = "https://my.dnevnik76.ru/teachers/" + + sLoadSubjectsS = "loadSubjects('/ajax/subj/" + sLoadSubjectsE = "', true)" ) var ( @@ -88,7 +92,7 @@ func (cli *Client) Login() (err error) { return } - doc, err := goquery.NewDocumentFromResponse(resp) + doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { return } @@ -116,10 +120,10 @@ func (cli *Client) Login() (err error) { } defer resp.Body.Close() - doc, err = goquery.NewDocumentFromResponse(resp) - if err != nil { - return - } + // doc, err = goquery.NewDocumentFromReader(resp.Body) + // if err != nil { + // return + // } err = cli.getCurrentInfo() @@ -129,7 +133,13 @@ func (cli *Client) Login() (err error) { // getCurrentInfo for session func (cli *Client) getCurrentInfo() (err error) { resp, err := cli.http.Get(urlHomework) - doc, err := goquery.NewDocumentFromResponse(resp) + if err != nil { + return + } + doc, err := goquery.NewDocumentFromReader(resp.Body) + if err != nil { + return + } cli.CurrentInfo.SchoolID = cli.SchoolID classNumber, classChar, err := getClassName(doc.Find("#auth_info > #role").Text()) @@ -141,13 +151,13 @@ func (cli *Client) getCurrentInfo() (err error) { classIDText, _ := doc.Find("body").Attr("onload") if classIDText != "" { - classIDText = strings.TrimRight(strings.TrimLeft(classIDText, "loadSubjects('/ajax/subj/"), "', true)") + classIDText = strings.TrimSuffix(strings.TrimPrefix(classIDText, sLoadSubjectsS), sLoadSubjectsE) } classID, err := strconv.ParseInt(classIDText, 10, 32) cli.CurrentInfo.ClassID = classID var eys, eye int64 - eyr := strings.Split(strings.TrimRight(doc.Find("#eduyear > #curedy").Text(), " учебный год"), "-") + eyr := strings.Split(strings.TrimSuffix(doc.Find("#eduyear > #curedy").Text(), " учебный год"), "-") eys, _ = strconv.ParseInt(eyr[0], 10, 32) eye, _ = strconv.ParseInt(eyr[1], 10, 32) cli.CurrentInfo.EduYearStart = int(eys) @@ -195,7 +205,7 @@ func GetRegions() (regions []Region, err error) { return } - doc, err := goquery.NewDocumentFromResponse(resp) + doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { return } @@ -218,7 +228,7 @@ func GetSchools(region int64) (schools []School, err error) { return } - doc, err := goquery.NewDocumentFromResponse(resp) + doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { return } @@ -234,6 +244,27 @@ func GetSchools(region int64) (schools []School, err error) { return } +func dateWithinRange(date, start, end time.Time) bool { + if date.After(start) && date.Before(end) { + return true + } + return false +} + +func (cli *Client) GetCurrentQuarter() (result string) { + periods, _ := cli.GetMarksPeriods() + for _, p := range periods { + inRange := dateWithinRange(time.Now(), p.Start, p.End) + if inRange { + if strings.Contains(p.Name, "четверть") { + result = p.Period + break + } + } + } + return +} + // GetCourses to get subjects func (cli *Client) GetCourses() (courses []Course, err error) { resp, err := cli.http.Get(fmt.Sprintf("%s/subj/%d", urlAjax, cli.CurrentInfo.ClassID)) @@ -241,7 +272,7 @@ func (cli *Client) GetCourses() (courses []Course, err error) { return } - doc, err := goquery.NewDocumentFromResponse(resp) + doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { return } @@ -264,7 +295,7 @@ func (cli *Client) GetMarksPeriods() (periods []Lperiod, err error) { return } - doc, err := goquery.NewDocumentFromResponse(resp) + doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { return } @@ -279,7 +310,7 @@ func (cli *Client) GetMarksPeriods() (periods []Lperiod, err error) { return } - doc, err := goquery.NewDocumentFromResponse(resp) + doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { return } @@ -330,7 +361,7 @@ func (cli *Client) GetMarksForWithType(p string, t MarksListType) (marks []Mark, return } - doc, err := goquery.NewDocumentFromResponse(resp) + doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { return } @@ -405,7 +436,7 @@ func (cli *Client) GetMarksFinal() (marks []Mark, err error) { return } - doc, err := goquery.NewDocumentFromResponse(resp) + doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { return } @@ -481,7 +512,7 @@ func (cli *Client) GetMessages() (messages []Message, err error) { if err != nil { return } - doc, err := goquery.NewDocumentFromResponse(resp) + doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { return } @@ -529,12 +560,12 @@ func (cli *Client) GetMessage(msgID int64) (m Message, err error) { if err != nil { return } - doc, err := goquery.NewDocumentFromResponse(resp) + doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { return } - msgDate := strings.TrimLeft(doc.Find("#msgview > div.msg-meta > div.msg-props > div:nth-child(1)").First().Text(), "Дата: ") + msgDate := strings.TrimPrefix(doc.Find("#msgview > div.msg-meta > div.msg-props > div:nth-child(1)").First().Text(), "Дата: ") m.Date = russiantime.ParseDateString(msgDate) msgFrom := doc.Find("#msgview > div.msg-meta > div.msg-props > div:nth-child(2) > a:nth-child(2)").First().Text() m.From = msgFrom @@ -567,7 +598,7 @@ func (cli *Client) GetHomework() (hws []Homework, err error) { if err != nil { return } - doc, err := goquery.NewDocumentFromResponse(resp) + doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { return } @@ -579,7 +610,7 @@ func (cli *Client) GetHomework() (hws []Homework, err error) { classIDText, _ := doc.Find("body").Attr("onload") if classIDText != "" { - classIDText = strings.TrimRight(strings.TrimLeft(classIDText, "loadSubjects('/ajax/subj/"), "', true)") + classIDText = strings.TrimRight(strings.TrimPrefix(classIDText, sLoadSubjectsS), sLoadSubjectsE) } classID, err := strconv.ParseInt(classIDText, 10, 64) hwPagesFlag := doc.Find("#homework_list > div.pager > span.page_remark").Text() @@ -617,7 +648,7 @@ func (cli *Client) GetTeachers() (teachers []Teacher, err error) { if err != nil { return } - doc, err := goquery.NewDocumentFromResponse(resp) + doc, err := goquery.NewDocumentFromReader(resp.Body) if err != nil { return } diff --git a/main_test.go b/main_test.go index 1532556..09eaa9d 100644 --- a/main_test.go +++ b/main_test.go @@ -9,6 +9,7 @@ import ( "sort" "strings" "testing" + "time" ) var ( @@ -75,6 +76,12 @@ func TestClient_GetMarksPeriods(t *testing.T) { if DEBUG { for _, p := range periods { t.Logf(":: %d-%d: %s - %s (%s - %s)", p.SYear, p.EYear, p.Name, p.Period, p.Start.Format("2006.01.02"), p.End.Format("2006.01.02")) + inRange := dateWithinRange(time.Now(), p.Start, p.End) + if inRange { + if strings.Contains(p.Name, "четверть") { + t.Logf("in range - %t: %s - %s (%s - %s)", inRange, p.Name, p.Period, p.Start.Format("2006.01.02"), p.End.Format("2006.01.02")) + } + } } } } @@ -90,14 +97,21 @@ func TestClient_GetMarksNote(t *testing.T) { } func TestClient_GetMarksList(t *testing.T) { - marks, _ := client.GetMarksForWithType(Month2.String(), List) - //marks, _ := client.GetMarksForWithType("edurng7639", List) + // marks, _ := client.GetMarksForWithType(fmt.Sprintf("month%d", time.Now().Month()), List) + marks, _ := client.GetMarksForWithType(client.GetCurrentQuarter(), List) t.Logf(":: size - %d", len(marks)) if DEBUG { - //sort.Slice(marks, func(i, j int) bool { return marks[i].Date.After(marks[j].Date) }) - sort.Sort(sort.Reverse(MarksByDate(marks))) + sort.Sort(MarksByDate(marks)) + + _marks := map[string][]string{} + for _, m := range marks { t.Logf("%s: %s - %s", m.Date.Format("2006.01.02"), m.CourseName, arrayToString(m.Grade, ",")) + _marks[m.CourseName] = append(_marks[m.CourseName], arrayToString(m.Grade, ",")) + } + + for c, m := range _marks { + t.Logf("%s: %s", c, m) } } } @@ -159,25 +173,15 @@ func TestClient_GetCourses(t *testing.T) { courses, _ := client.GetCourses() t.Logf(":: size - %d", len(courses)) - client.SetCookie("edu_year", "2020") - client.GetMarksPeriods() - courses2020, _ := client.GetCourses() - courses = append(courses, courses2020...) - t.Logf(":: size for 2020 - %d", len(courses)) - - client.SetCookie("edu_year", "2019") - client.getCurrentInfo() - client.GetMarksPeriods() - courses2019, _ := client.GetCourses() - courses = append(courses, courses2019...) - t.Logf(":: size for 2019 - %d", len(courses2019)) - - client.SetCookie("edu_year", "2018") - client.getCurrentInfo() - client.GetMarksPeriods() - courses2018, _ := client.GetCourses() - courses = append(courses, courses2018...) - t.Logf(":: size for 2018 - %d", len(courses2018)) + years := []string{"2022", "2021", "2020", "2019", "2018"} + for _, y := range years { + client.SetCookie("edu_year", y) + client.getCurrentInfo() + client.GetMarksPeriods() + coursesX, _ := client.GetCourses() + courses = append(courses, coursesX...) + t.Logf(":: size for %s - %d", y, len(courses)) + } courses = unique(courses) t.Logf(":: total size - %d", len(courses)) @@ -188,19 +192,8 @@ func TestClient_GetCourses(t *testing.T) { } } -func TestClient_GetHomework2020(t *testing.T) { - client.SetCookie("edu_year", "2020") - hws, _ := client.GetHomework() - t.Logf(":: size - %d", len(hws)) - if DEBUG { - for _, hw := range hws { - t.Logf(" :: %s: %s - subject: %s, homework: %s", hw.Date.Format("2006.01.02"), hw.CourseName, hw.Subject, hw.Homework) - } - } -} - -func TestClient_GetHomework2019(t *testing.T) { - client.SetCookie("edu_year", "2019") +func TestClient_GetHomework2022(t *testing.T) { + client.SetCookie("edu_year", "2022") hws, _ := client.GetHomework() t.Logf(":: size - %d", len(hws)) if DEBUG {