Files
likedream/internal/application/smartedu/sc/login.go
T
2025-12-09 13:59:12 +08:00

96 lines
3.5 KiB
Go

package sc
import (
"context"
"likedream-goframe/internal/application/cookiejar"
"likedream-goframe/internal/application/httpclient"
"likedream-goframe/internal/application/smartedu/cryptoutil"
"likedream-goframe/internal/common/errors"
"likedream-goframe/internal/utils"
"strings"
"github.com/PuerkitoBio/goquery"
"github.com/gogf/gf/v2/container/gvar"
"github.com/samber/oops"
"resty.dev/v3"
)
const (
LoginPageUrl = "https://basic.sc.smartedu.cn/ThirdPortalService/user/otherlogin!login.ac?appkey=C56DA16ECBC56FBEEC908DA09E45C72C917A80118F057FA1F0B5BAE41CC9CC9DECD5BDB7133FE17C328C5D37B37CA8E7&pkey=5D79CA42E45C5273DF8532D09E1F158B15E25919CDB958940F84D5E63F5F53A1ECD5BDB7133FE17C328C5D37B37CA8E7&params=718F83A5347CBFDB7D1A9065FA090FE949D92330BB9A3351FE0715C5B8A3E86F37916C1004E835C7C7F964E3F301477F7D37F04485FA8707845DAAA23356236ED1D326CF5A5E3C263470516EE9B4A2ED"
LoginActionUrl = "https://basic.sc.smartedu.cn/ThirdPortalService/login!login.ac"
LoginTicketUrl = "https://basic.sc.smartedu.cn/ThirdPortalService/login!getTicket.ac"
LoginOOSUrl = "https://basic.sc.smartedu.cn/hd/teacherTraining/api/sso/oauth/token"
)
type Login struct {
Username string `json:"username"`
Password string `json:"password"`
Client *resty.Client
}
func NewLogin(username, password string) *Login {
return &Login{
Username: username,
Password: password,
Client: httpclient.NewSmartEdu(),
}
}
func (l *Login) GetCookieValue(key string) string {
cookies := l.Client.CookieJar().(*cookiejar.AllSavePersistCookieJar)
for _, cookie := range cookies.Cookies(nil) {
if cookie.Name == key {
return cookie.Value
}
}
return ""
}
func (l *Login) GetClient() *resty.Client {
return l.Client
}
func (l *Login) Login(ctx context.Context) string {
form := l.getLoginInput(ctx)
form["loginName"] = gvar.New(l.Username)
form["password"] = gvar.New(l.Password)
token := l.GetCookieValue("Client-Tocken")
data := cryptoutil.EncData(form, token)
post, err := l.Client.R().SetFormData(data).Post(LoginActionUrl)
utils.OkOrPanic(err, oops.WithContext(ctx).With("LoginActionUrl", LoginActionUrl).Wrap)
descData := cryptoutil.DescData(utils.ReadJson[map[string]interface{}](post.Body), token)
result := descData["data"].(string)
if !strings.Contains(result, `"Flag":0`) {
utils.OkOrPanic(errors.NewBusinessError(503, "登录失败"))
}
get, err := l.Client.R().Get(LoginTicketUrl)
utils.OkOrPanic(err, oops.WithContext(ctx).With("LoginTicketUrl", LoginTicketUrl).Wrap)
return get.String()
}
func (l *Login) OOSLogin(ctx context.Context, ticket string) string {
post, err := l.Client.R().SetQueryParam("ticket", ticket).Post(LoginOOSUrl)
utils.OkOrPanic(err, oops.WithContext(ctx).With("LoginOOSUrl", LoginOOSUrl).Wrap)
defer post.Body.Close()
json := utils.ReadJson[map[string]string](post.Body)
if json["returnCode"] != "200" {
utils.OkOrPanic(errors.NewBusinessError(503, json["returnMessage"]))
}
return json["returnData"]
}
func (l *Login) getLoginInput(ctx context.Context) map[string]*gvar.Var {
get, err := l.Client.R().WithContext(ctx).Get(LoginPageUrl)
utils.OkOrPanic(err, oops.WithContext(ctx).With("LoginPageUrl", LoginPageUrl).Wrap)
defer get.Body.Close()
reader, err := goquery.NewDocumentFromReader(get.Body)
utils.OkOrPanic(err, oops.WithContext(ctx).With("LoginPageUrl", LoginPageUrl).Wrap)
find := reader.Find("#loginContent input")
var inputMap = make(map[string]*gvar.Var)
find.Each(func(i int, input *goquery.Selection) {
key, exists := input.Attr("name")
if exists {
val, _ := input.Attr("value")
inputMap[key] = gvar.New(val)
}
})
return inputMap
}