diff --git a/README.md b/README.md index 9da690b..b1135bd 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,7 @@ CREATE TABLE sign |---------|-----------------|--------| | 工学云签到 | 模拟登录并完成每日签到任务 | 已完成 ✅ | | 滑块验证破解 | 自动处理工学云最新版滑块验证 | 已完成 ✅ | +| 工学云定时上报 | 自动完成上报周报月报 | 开发中🚧 | | 超星学习通 | 自动刷课、考试、答题 | 开发中 🚧 | | 用户管理 | 基于数据库管理用户信息 | 已完成 ✅ | | 日志记录 | 自动记录签到状态和错误信息 | 已完成 ✅ | @@ -140,6 +141,7 @@ CREATE TABLE sign * ✅工学云平台自动签到 * ✅解决工学云最新版滑块验证 * ✅完成对邮箱发送的支持 +* 🚧工学云平台自动周报月报 * ⬜超星学习通自动刷课 * ⬜添加 Docker 支持 * ⬜增强错误处理和日志记录 @@ -159,8 +161,6 @@ Star 趋势图 让 BronyaBot 成为你学习路上的得力助手!🎉 签到从此无忧! ![GitHub Stars](https://img.shields.io/github/stars/mirai-MIC/BronyaBot?style=flat&label=Stars) - -[//]: # ([![Star History Chart](https://api.star-history.com/svg?repos=mirai-MIC/BronyaBot&type=Date)](https://star-history.com/#mirai-MIC/BronyaBot&Date)) [![Star History Chart](https://starchart.cc/mirai-MIC/BronyaBot.svg?variant=adaptive)](https://starchart.cc/mirai-MIC/BronyaBot) --- diff --git a/internal/api/gongxueapi.go b/internal/api/gongxueapi.go index b6e38e0..f1f7b89 100644 --- a/internal/api/gongxueapi.go +++ b/internal/api/gongxueapi.go @@ -3,12 +3,13 @@ package api var BaseApi = "https://api.moguding.net:9000" const ( - BlockPuzzle = "/session/captcha/v1/get" - CHECK = "/session/captcha/v1/check" - LoginAPI = "/session/user/v6/login" - GetPlanIDAPI = "/practice/plan/v3/getPlanByStu" - SignAPI = "/attendence/clock/v4/save" - GetWeekCountAPI = "/practice/paper/v2/listByStu" - GetWeeks = "/practice/paper/v1/getWeeks1" - SubmitWeeklyOrDailyAPI = "/practice/paper/v2/save" + BlockPuzzle = "/session/captcha/v1/get" + CHECK = "/session/captcha/v1/check" + LoginAPI = "/session/user/v6/login" + GetPlanIDAPI = "/practice/plan/v3/getPlanByStu" + SignAPI = "/attendence/clock/v4/save" + GetWeekCountAPI = "/practice/paper/v2/listByStu" + GetWeeks = "/practice/paper/v3/getWeeks1" + SubmitAReport = "/practice/paper/v5/save" + getUploadToken = "session/upload/v1/token" ) diff --git a/internal/service/gongxueyun_service/data/ReportsData.go b/internal/service/gongxueyun_service/data/ReportsData.go new file mode 100644 index 0000000..2a610b7 --- /dev/null +++ b/internal/service/gongxueyun_service/data/ReportsData.go @@ -0,0 +1,8 @@ +package data + +type ReportsInfo struct { + Code int `json:"code"` + Msg string `json:"msg"` + Data []interface{} `json:"data"` + Flag int `json:"flag"` +} diff --git a/internal/service/gongxueyun_service/logic.go b/internal/service/gongxueyun_service/logic.go index 9a72218..7d8e859 100644 --- a/internal/service/gongxueyun_service/logic.go +++ b/internal/service/gongxueyun_service/logic.go @@ -46,6 +46,7 @@ func (m *MoguDing) Run() { } m.GetPlanId() m.SignIn() + //m.getSubmittedReportsInfo("week") } type SignStruct struct { @@ -120,7 +121,7 @@ func (mo *MoguDing) GetBlock() error { } func (mo *MoguDing) processBlock() error { // 获取验证码数据 - requestData := map[string]string{ + requestData := map[string]interface{}{ "clientUid": clientUid, "captchaType": "blockPuzzle", } @@ -151,7 +152,7 @@ func (mo *MoguDing) processBlock() error { comm.secretKey = blockData.Data.SecretKey cipher, _ := utils.NewAESECBPKCS5Padding(comm.secretKey, "base64") encrypt, _ := cipher.Encrypt(comm.xY) - requestData = map[string]string{ + requestData = map[string]interface{}{ "pointJson": encrypt, "token": blockData.Data.Token, "captchaType": "blockPuzzle", @@ -183,9 +184,7 @@ func (mogu *MoguDing) Login() error { encryptPhone, _ := padding.Encrypt(mogu.PhoneNumber) encryptPassword, _ := padding.Encrypt(mogu.Password) timestamp, _ := encryptTimestamp(time.Now().UnixMilli()) - - global.Log.Info("Login") - requestData := map[string]string{ + requestData := map[string]interface{}{ "phone": encryptPhone, "password": encryptPassword, "captcha": comm.captcha, @@ -222,15 +221,13 @@ func (mogu *MoguDing) Login() error { return nil } func (mogu *MoguDing) GetPlanId() { - var planData = &data.PlanByStuData{} + planData := &data.PlanByStuData{} timestamp, _ := encryptTimestamp(time.Now().UnixMilli()) - sign := utils.CreateSign(mogu.UserId, mogu.RoleKey) - addHeader("rolekey", mogu.RoleKey) addHeader("sign", sign) addHeader("authorization", mogu.Authorization) - body := map[string]string{ + body := map[string]interface{}{ "pageSize": strconv.Itoa(999999), "t": timestamp, } @@ -247,13 +244,12 @@ func (mogu *MoguDing) GetPlanId() { global.Log.Info(mogu.PlanID) global.Log.Info(mogu.PlanName) global.Log.Info("================") - global.Log.Info(fmt.Sprintf("Get plan id successful")) } func (mogu *MoguDing) SignIn() { - var resdata = &data.SaveData{} + resdata := &data.SaveData{} filling := dataStructureFilling(mogu) - sign := utils.CreateSign(filling["device"], filling["type"], mogu.PlanID, mogu.UserId, filling["address"]) - addHeader("rolekey", mogu.UserId) + sign := utils.CreateSign(filling["device"].(string), filling["type"].(string), mogu.PlanID, mogu.UserId, filling["address"].(string)) + addHeader("rolekey", mogu.RoleKey) addHeader("sign", sign) addHeader("authorization", mogu.Authorization) request, err := utils.SendRequest("POST", api.BaseApi+api.SignAPI, filling, headers) @@ -270,7 +266,6 @@ func (mogu *MoguDing) SignIn() { } else { mogu.updateSignState(0) } - utils.SendMail(mogu.Email, "检查是否打卡完成", resdata.Msg+"\n如果未成功请联系管理员") } @@ -284,17 +279,35 @@ func (mogu *MoguDing) updateSignState(state int) { } } -func (mogu *MoguDing) weeklyNewspaper() { - +// 获取已经提交的日报、周报或月报的数量。 +func (mogu *MoguDing) getSubmittedReportsInfo(reportType string) { + report := &data.ReportsInfo{} + sign := utils.CreateSign(mogu.UserId, mogu.RoleKey, reportType) + addHeader("rolekey", mogu.RoleKey) + addHeader("userid", mogu.UserId) + addHeader("sign", sign) + timestamp, _ := encryptTimestamp(time.Now().UnixMilli()) + body := map[string]interface{}{ + "currPage": 1, + "pageSize": 10, + "reportType": reportType, + "planId": mogu.PlanID, + "t": timestamp, + } + request, err := utils.SendRequest("POST", api.BaseApi+api.GetWeekCountAPI, body, headers) + if err != nil { + global.Log.Info(fmt.Sprintf("Failed to send request: %v", err)) + } + json.Unmarshal(request, &report) + global.Log.Info(report) } -func dataStructureFilling(mogu *MoguDing) map[string]string { +func dataStructureFilling(mogu *MoguDing) map[string]interface{} { // 加载中国时区 loc, err := time.LoadLocation("Asia/Shanghai") if err != nil { global.Log.Error("Failed to load location: ", err) return nil } - // 获取当前时间并格式化 now := time.Now().In(loc) formattedTime := now.Format("2006-01-02 15:04:05") @@ -304,16 +317,14 @@ func dataStructureFilling(mogu *MoguDing) map[string]string { if now.Hour() >= 12 { typeStr = "END" } - // 加密当前时间戳 encryptTime, err := encryptTimestamp(now.UnixMilli()) if err != nil { global.Log.Error("Failed to encrypt timestamp: ", err) return nil } - // 直接构造 map,而不是先构造结构体再转换为 map - return map[string]string{ + return map[string]interface{}{ "address": mogu.Sign.Address, "city": mogu.Sign.City, "area": mogu.Sign.Area, diff --git a/utils/HttpUtils.go b/utils/HttpUtils.go index ead4302..ace5ba3 100644 --- a/utils/HttpUtils.go +++ b/utils/HttpUtils.go @@ -11,7 +11,7 @@ import ( var client = &http.Client{} -func SendRequest(method, url string, payload map[string]string, header http.Header) ([]byte, error) { +func SendRequest(method, url string, payload map[string]interface{}, header http.Header) ([]byte, error) { marshal, err := json.Marshal(payload) if err != nil { return nil, fmt.Errorf("failed to marshal payload: %v", err)