commit 420c3503c2889a610c7bddf227e7d4b9bba577bf Author: ayabusa Date: Sun Nov 3 11:40:48 2024 +0100 init commit diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..84f665b --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +bonjour: + @echo " ------------------------------------" + @echo "| you can use "make build" or "make run" |" + @echo " ------------------------------------" + @echo " \\ ^__^" + @echo " \\ (oo)\\_______" + @echo " (__)\\ )\\/\\" + @echo " ||----w |" + @echo " || ||" + +build: + go build -o bin/ecoledirecte_api src/* + +run: + go build -o bin/ecoledirecte_api src/*.go + bin/ecoledirecte_api \ No newline at end of file diff --git a/bin/ecoledirecte_api b/bin/ecoledirecte_api new file mode 100755 index 0000000..f31ca05 Binary files /dev/null and b/bin/ecoledirecte_api differ diff --git a/src/api.go b/src/api.go new file mode 100644 index 0000000..165c08f --- /dev/null +++ b/src/api.go @@ -0,0 +1,135 @@ +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "io" + "net/http" + "strings" +) + +/* +Permet d'obetenir le token et le user_id à partir du nom et du password ecoledirecte +*/ +func get_login_token(id string, psw string) (user_id string, x_token string) { + + url := "https://api.ecoledirecte.com/v3/login.awp?v=4.65.0" + fmt.Println("URL:>", url) + + var jsonStr = []byte(`data={ + "identifiant": "` + id + `", + "motdepasse": "` + psw + `", + "isReLogin": false, + "cn": "ED_UExVTUVfMDY3MTYwOUtfMV8zMTIw", + "cv": "NGE3OTU0NDc0ZTc5NzQ1NjUxNjU1MDc2NDU1YTc4NTQ3NTcyNmM0MzM1NGUzMTM3NjY1MTU4MzE=", + "uuid": "", + "fa": [ + { + "cn": "ED_UExVTUVfMDY3MTYwOUtfMV8zMTIw", + "cv": "NGE3OTU0NDc0ZTc5NzQ1NjUxNjU1MDc2NDU1YTc4NTQ3NTcyNmM0MzM1NGUzMTM3NjY1MTU4MzE=" + } + ] +}`) + fmt.Println("REQUEST DATA:\n", string(jsonStr), "\n\n\n") + req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr)) + //req.Header.Set("X-Custom-Header", "myvalue") + req.Header.Set("Content-Length", string(len(jsonStr))) + req.Header.Set("Accept-Encoding", "gzip, deflate, br, zstd") + req.Header.Set("Accept", "application/json, text/plain, */*") + req.Header.Set("Accept-Language", "en-US,en;q=0.5") + req.Header.Set("Connection", "keep-alive") + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Host", "api.ecoledirecte.com") + req.Header.Set("Origin", "https://www.ecoledirecte.com") + req.Header.Set("Referer", "https://www.ecoledirecte.com/") + req.Header.Set("Sec-Fetch-Dest", "empty") + req.Header.Set("Sec-Fetch-Mode", "cors") + req.Header.Set("Sec-Fetch-Site", "same-site") + req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:131.0) Gecko/20100101 Firefox/131.0") + //req.Header.Set("X-Token", "2d4db09a-d27f-400c-9851-9602d2878183") + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + panic(err) + } + defer resp.Body.Close() + + fmt.Println("response Status:", resp.Status) + fmt.Println("response Headers:", resp.Header) + body, _ := io.ReadAll(resp.Body) + fmt.Println("response Body:", string(body)) + + // C'est un peu hacky mais ça permet d'avoir l'id de l'utilisateur, exemple 3605 + body_str := string(body) + index := strings.Index(body_str, `"eleves":[{"id":`) + userid := "" + for i := 0; i < 8; i++ { + char := fmt.Sprintf("%c", []rune(body_str)[index+13+i]) + if char != "," { + userid = userid + char + } else { + break + } + } + + return userid, resp.Header.Get("X-Token") +} + +type Data struct { + Url string +} + +type Url_Response struct { + Code int + Token string + Host string + Data Data +} + +/* +Retourne le lien de téléchargement de l'agenda ics à partir du token et du user_id +*/ +func get_agenda_link(user_id string, x_token string) string { + url := "https://api.ecoledirecte.com/v3/ical/E/" + user_id + "/url.awp?verbe=get&v=4.65.0" + fmt.Println("URL:>", url) + + var jsonStr = []byte(`data={}`) + + fmt.Print("REQUEST DATA:\n", string(jsonStr), "\n\n\n") + req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonStr)) + //req.Header.Set("X-Custom-Header", "myvalue") + req.Header.Set("Content-Length", "7") + req.Header.Set("Accept-Encoding", "gzip, deflate, br, zstd") + req.Header.Set("Accept", "application/json, text/plain, */*") + req.Header.Set("Accept-Language", "en-US,en;q=0.5") + req.Header.Set("Connection", "keep-alive") + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Host", "api.ecoledirecte.com") + req.Header.Set("Origin", "https://www.ecoledirecte.com") + req.Header.Set("Referer", "https://www.ecoledirecte.com/") + req.Header.Set("Sec-Fetch-Dest", "empty") + req.Header.Set("Sec-Fetch-Mode", "cors") + req.Header.Set("Sec-Fetch-Site", "same-site") + req.Header.Set("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; rv:131.0) Gecko/20100101 Firefox/131.0") + req.Header.Set("X-Token", x_token) + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + panic(err) + } + defer resp.Body.Close() + + fmt.Println("response Status:", resp.Status) + fmt.Println("response Headers:", resp.Header) + body, _ := io.ReadAll(resp.Body) + fmt.Println("response Body:", string(body)) + + var jsonMap Url_Response + json.Unmarshal(body, &jsonMap) + response_url := jsonMap.Data.Url + + return "https://api.ecoledirecte.com/v3/" + response_url +} diff --git a/src/main.go b/src/main.go new file mode 100644 index 0000000..942041e --- /dev/null +++ b/src/main.go @@ -0,0 +1,42 @@ +package main + +import ( + "bufio" + "fmt" + "os" + "strings" +) + +func main() { + ascii_art() + + id := input("Quel est ton identifiant :") + psw := input("Quel est mot de passe :") + user_id, x_token := get_login_token(id, psw) + fmt.Println("X-Token is: ", x_token) + url := get_agenda_link(user_id, x_token) + fmt.Println("URL is: ", url) +} + +func input(s string) string { + reader := bufio.NewReader(os.Stdin) + fmt.Print(s) + + text, err := reader.ReadString('\n') + if err != nil { + panic(err) + } + + return strings.ReplaceAll(text, "\n", "") +} + +func ascii_art() { + fmt.Println(` + ____ __ ___ _ __ ___ ___ ____ + / __/______ / /__ / _ \(_)______ ____/ /____ / _ | / _ \/ _/ + / _// __/ _ \/ / -_) // / / __/ -_) __/ __/ -_) / __ |/ ___// / +/___/\__/\___/_/\__/____/_/_/ \__/\__/\__/\__/ /_/ |_/_/ /___/ + + - Ayabusa, 2024 +`) +}