Skip to content

Commit

Permalink
v0.1.3
Browse files Browse the repository at this point in the history
  • Loading branch information
bvp committed Nov 17, 2022
1 parent 1855e29 commit 6cc17d8
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 74 deletions.
9 changes: 5 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
@@ -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
32 changes: 19 additions & 13 deletions go.sum
Original file line number Diff line number Diff line change
@@ -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=
73 changes: 52 additions & 21 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"log"
"regexp"
"strconv"
"time"

"net/http"
"net/http/cookiejar"
Expand All @@ -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 (
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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()

Expand All @@ -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())
Expand All @@ -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)
Expand Down Expand Up @@ -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
}
Expand All @@ -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
}
Expand All @@ -234,14 +244,35 @@ 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))
if err != nil {
return
}

doc, err := goquery.NewDocumentFromResponse(resp)
doc, err := goquery.NewDocumentFromReader(resp.Body)
if err != nil {
return
}
Expand All @@ -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
}
Expand All @@ -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
}
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
}
Expand All @@ -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()
Expand Down Expand Up @@ -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
}
Expand Down
65 changes: 29 additions & 36 deletions main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"sort"
"strings"
"testing"
"time"
)

var (
Expand Down Expand Up @@ -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"))
}
}
}
}
}
Expand All @@ -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)
}
}
}
Expand Down Expand Up @@ -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))
Expand All @@ -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 {
Expand Down

0 comments on commit 6cc17d8

Please sign in to comment.