96 lines
3.5 KiB
Go
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¶ms=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
|
|
}
|