Files
likedream/internal/application/cpdaily/school/school_fetcher.go
T
2025-12-02 10:17:47 +08:00

123 lines
3.3 KiB
Go

package school
import (
"context"
"encoding/base64"
"encoding/json"
cryptoutil2 "likedream-goframe/internal/application/cpdaily/cryptoutil"
"likedream-goframe/internal/application/httpclient"
cst2 "likedream-goframe/internal/common/cst"
"likedream-goframe/internal/common/errors"
"likedream-goframe/internal/framework/redis"
"likedream-goframe/internal/utils"
"sync"
"time"
"github.com/bytedance/sonic"
"github.com/samber/oops"
"github.com/tidwall/gjson"
)
var lock = sync.RWMutex{}
func GetSchoolList(ctx context.Context) []CpdailySchoolBriefInfo {
response, err := httpclient.Cpdaily.Clone(ctx).R().
WithContext(ctx).
Get("https://static.campushoy.com/apicache/tenantListSort")
utils.OkOrPanic(err)
responseJSON := utils.ReadJson[BaseCpdailySchoolResponse[*json.RawMessage]](response.Body)
utils.OkOrPanic(responseJSON.GetError())
responseArray := gjson.ParseBytes(*responseJSON.Data)
if !responseArray.Exists() {
utils.OkOrPanic(errors.NewBusinessError(503, "今日校园返回学校信息为空"))
}
var ret []CpdailySchoolBriefInfo
for _, dataJSON := range responseArray.Array() {
datas := dataJSON.Get("datas").Array()
for _, schoolJson := range datas {
ret = append(ret, CpdailySchoolBriefInfo{
Id: schoolJson.Get("id").String(),
Name: schoolJson.Get("name").String(),
NamePinYin: schoolJson.Get("namePinYin").String(),
Img: schoolJson.Get("img").String(),
})
}
}
return ret
}
func GetSchoolDetail(ctx context.Context, tenantId string) SchoolDetailInfo {
lock.Lock()
defer lock.Unlock()
if !utils.IsDebug() {
client := redis.GetClient()
redisResult := client.Get(ctx, cst2.RedisSchoolInfo+tenantId)
if redisResult.Err() == nil {
var ret SchoolDetailInfo
err := sonic.Unmarshal([]byte(redisResult.Val()), &ret)
utils.OkOrPanic(err)
return parseSpecialSchool(ret)
}
}
response, err := httpclient.Cpdaily.Clone(ctx).R().
SetHeaders(map[string]string{
"deviceType": "2",
"CpdailyClientType": "CPDAILY",
"CacheTimeValue": "0",
"CpdailyStandAlone": "0",
"tenantId": tenantId,
}).
SetQueryParams(map[string]string{
"a": base64.StdEncoding.EncodeToString(cryptoutil2.AesEncrypt([]byte(tenantId))),
"b": cryptoutil2.EncryptVersion,
}).
WithContext(ctx).
Get("https://mobile.campushoy.com/v6/config/guest/tenant/info/v-8222")
utils.OkOrPanic(err)
responseJSON := utils.ReadJson[BaseCpdailySchoolResponse[string]](response.Body)
utils.OkOrPanic(responseJSON.GetError())
decodedEncryptData, err := base64.StdEncoding.DecodeString(responseJSON.Data)
utils.OkOrPanic(err)
decryptedRawJson := cryptoutil2.AesDecrypt(decodedEncryptData)
var ret []SchoolDetailInfo
err = sonic.Unmarshal(decryptedRawJson, &ret)
utils.OkOrPanic(err)
if len(ret) == 0 {
utils.OkOrPanic(oops.In("GetSchoolDetail").
With("tenantId", tenantId).
WithContext(ctx).
Wrap(errors.NewBusinessError(503, "学校ID不存在").Decorate("empty school detail")))
}
if !utils.IsDebug() {
client := redis.GetClient()
client.Set(ctx, cst2.RedisSchoolInfo+tenantId, ret[0], time.Duration(cst2.RedisSchoolInfoExpire)*time.Second)
}
return parseSpecialSchool(ret[0])
}
func parseSpecialSchool(s SchoolDetailInfo) SchoolDetailInfo {
// 甘肃农业大学
if s.Id == "gsau" {
s.WecloudUrl = "https://fdm.gsau.edu.cn"
}
return s
}