diff --git a/drivers/189pc/189.go b/drivers/189pc/189.go index e14d0081..9dcf1c68 100644 --- a/drivers/189pc/189.go +++ b/drivers/189pc/189.go @@ -16,7 +16,6 @@ import ( "github.com/Xhofe/alist/utils" "github.com/go-resty/resty/v2" "github.com/google/uuid" - jsoniter "github.com/json-iterator/go" log "github.com/sirupsen/logrus" ) @@ -110,7 +109,7 @@ func (s *State) login(account *model.Account) error { if err != nil { return err } - toUrl := jsoniter.Get(res.Body(), "toUrl").ToString() + toUrl := utils.Json.Get(res.Body(), "toUrl").ToString() if toUrl == "" { log.Error(res.String()) return fmt.Errorf(res.String()) @@ -179,10 +178,10 @@ func (s *State) getLoginParam() (*LoginParam, error) { if err != nil { return nil, err } - if jsoniter.Get(vRes.Body(), "status").ToInt() != 200 { - return nil, errors.New("ocr error:" + jsoniter.Get(vRes.Body(), "msg").ToString()) + if utils.Json.Get(vRes.Body(), "status").ToInt() != 200 { + return nil, errors.New("ocr error:" + utils.Json.Get(vRes.Body(), "msg").ToString()) } - param.vCodeRS = jsoniter.Get(vRes.Body(), "result").ToString() + param.vCodeRS = utils.Json.Get(vRes.Body(), "result").ToString() log.Debugln("code: ", param.vCodeRS) } return param, nil @@ -308,9 +307,9 @@ func (s *State) Request(method string, fullUrl string, params url.Values, callba } if account != nil { - switch jsoniter.Get(res.Body(), "res_code").ToInt64() { + switch utils.Json.Get(res.Body(), "res_code").ToInt64() { case 11, 18: - if err := s.refreshSession(account); err != nil { + if err := s.RefreshSession(account); err != nil { return nil, err } return s.Request(method, fullUrl, params, callback, account) @@ -324,8 +323,8 @@ func (s *State) Request(method string, fullUrl string, params url.Values, callba } } - if jsoniter.Get(res.Body(), "res_code").ToInt64() != 0 { - return res, fmt.Errorf(jsoniter.Get(res.Body(), "res_message").ToString()) + if utils.Json.Get(res.Body(), "res_code").ToInt64() != 0 { + return res, fmt.Errorf(utils.Json.Get(res.Body(), "res_message").ToString()) } return res, nil } diff --git a/drivers/189pc/driver.go b/drivers/189pc/driver.go index bb01775b..1faf28d4 100644 --- a/drivers/189pc/driver.go +++ b/drivers/189pc/driver.go @@ -3,7 +3,6 @@ package _189 import ( "crypto/md5" "encoding/hex" - "encoding/json" "fmt" "io" "io/ioutil" @@ -64,9 +63,10 @@ func (driver Cloud189) Items() []base.Item { Values: "Personal,Family", }, { - Name: "site_id", - Label: "family id", - Type: base.TypeString, + Name: "site_id", + Label: "family id", + Type: base.TypeString, + Required: true, }, { Name: "order_by", @@ -96,13 +96,41 @@ func (driver Cloud189) Save(account *model.Account, old *model.Account) error { state := GetState(account) if !state.IsLogin() { - return state.Login(account) + if err := state.Login(account); err != nil { + return err + } } + + if isFamily(account) { + list, err := driver.getFamilyInfoList(account) + if err != nil { + return err + } + for _, l := range list { + if account.SiteId == "" { + account.SiteId = fmt.Sprint(l.FamilyID) + } + log.Infof("天翼家庭云 用户名:%s FamilyID %d\n", l.RemarkName, l.FamilyID) + } + } + account.Status = "work" model.SaveAccount(account) return nil } +func (driver Cloud189) getFamilyInfoList(account *model.Account) ([]FamilyInfoResp, error) { + var resp FamilyInfoListResp + _, err := GetState(account).Request("GET", API_URL+"/family/manage/getFamilyList.action", nil, func(r *resty.Request) { + r.SetQueryParams(clientSuffix()) + r.SetResult(&resp) + }, account) + if err != nil { + return nil, err + } + return resp.FamilyInfoResp, nil +} + func (driver Cloud189) File(path string, account *model.Account) (*model.File, error) { path = utils.ParsePath(path) if path == "/" { @@ -329,7 +357,7 @@ func (driver Cloud189) Move(src string, dst string, account *model.Account) erro _, err = GetState(account).Request("POST", API_URL+"/batch/createBatchTask.action", nil, func(r *resty.Request) { r.SetFormData(clientSuffix()).SetFormData(map[string]string{ "type": "MOVE", - "taskInfos": string(MustToBytes(json.Marshal( + "taskInfos": string(MustToBytes(utils.Json.Marshal( []*BatchTaskInfo{ { FileId: srcFile.Id, @@ -445,7 +473,7 @@ func (driver Cloud189) Copy(src string, dst string, account *model.Account) erro _, err = GetState(account).Request("POST", API_URL+"/batch/createBatchTask.action", nil, func(r *resty.Request) { r.SetFormData(clientSuffix()).SetFormData(map[string]string{ "type": "COPY", - "taskInfos": string(MustToBytes(json.Marshal( + "taskInfos": string(MustToBytes(utils.Json.Marshal( []*BatchTaskInfo{ { FileId: srcFile.Id, @@ -475,7 +503,7 @@ func (driver Cloud189) Delete(path string, account *model.Account) error { _, err = GetState(account).Request("POST", API_URL+"/batch/createBatchTask.action", nil, func(r *resty.Request) { r.SetFormData(clientSuffix()).SetFormData(map[string]string{ "type": "DELETE", - "taskInfos": string(MustToBytes(json.Marshal( + "taskInfos": string(MustToBytes(utils.Json.Marshal( []*BatchTaskInfo{ { FileId: srcFile.Id, @@ -546,7 +574,7 @@ func (driver Cloud189) uploadFamily(file *model.FileStream, parentFile *model.Fi } if createUpload.FileDataExists != 1 { - if err = driver.uploadFileData(file, tempFile, createUpload, account); err != nil { + if createUpload.UploadFileId, err = driver.uploadFileData(file, tempFile, createUpload, account); err != nil { return err } } @@ -601,7 +629,7 @@ func (driver Cloud189) uploadPerson(file *model.FileStream, parentFile *model.Fi } if createUpload.FileDataExists != 1 { - if err = driver.uploadFileData(file, tempFile, createUpload, account); err != nil { + if createUpload.UploadFileId, err = driver.uploadFileData(file, tempFile, createUpload, account); err != nil { return err } } @@ -618,40 +646,39 @@ func (driver Cloud189) uploadPerson(file *model.FileStream, parentFile *model.Fi return err } -func (driver Cloud189) uploadFileData(file *model.FileStream, tempFile *os.File, createUpload CreateUploadFileResult, account *model.Account) error { - var uploadFileState *UploadFileStatusResult - var err error - for i := 0; i < 10; i++ { - if uploadFileState, err = driver.getUploadFileState(createUpload.UploadFileId, account); err != nil { - return err - } - - if uploadFileState.FileDataExists == 1 || uploadFileState.DataSize == int64(file.Size) { - return nil - } - - if _, err = tempFile.Seek(uploadFileState.DataSize, io.SeekStart); err != nil { - return err - } - - _, err = GetState(account).Request("PUT", uploadFileState.FileUploadUrl, nil, func(r *resty.Request) { - r.SetQueryParams(clientSuffix()) - r.SetHeaders(map[string]string{ - "ResumePolicy": "1", - "Edrive-UploadFileId": fmt.Sprint(createUpload.UploadFileId), - "Edrive-UploadFileRange": fmt.Sprintf("bytes=%d-%d", uploadFileState.DataSize, file.Size), - "Expect": "100-continue", - }) - if isFamily(account) { - r.SetHeader("FamilyId", account.SiteId) - } - r.SetBody(tempFile) - }, account) - if err == nil { - break - } +func (driver Cloud189) uploadFileData(file *model.FileStream, tempFile *os.File, createUpload CreateUploadFileResult, account *model.Account) (int64, error) { + uploadFileState, err := driver.getUploadFileState(createUpload.UploadFileId, account) + if err != nil { + return 0, err } - return err + + if uploadFileState.FileDataExists == 1 || uploadFileState.DataSize == int64(file.Size) { + return uploadFileState.UploadFileId, nil + } + + if _, err = tempFile.Seek(uploadFileState.DataSize, io.SeekStart); err != nil { + return 0, err + } + + _, err = GetState(account).Request("PUT", uploadFileState.FileUploadUrl, nil, func(r *resty.Request) { + r.SetQueryParams(clientSuffix()) + r.SetHeaders(map[string]string{ + "Content-Type": "application/octet-stream", + "ResumePolicy": "1", + "Edrive-UploadFileRange": fmt.Sprintf("bytes=%d-%d", uploadFileState.DataSize, file.Size), + "Expect": "100-continue", + }) + if isFamily(account) { + r.SetHeaders(map[string]string{ + "familyId": account.SiteId, + "UploadFileId": fmt.Sprint(uploadFileState.UploadFileId), + }) + } else { + r.SetHeader("Edrive-UploadFileId", fmt.Sprint(uploadFileState.UploadFileId)) + } + r.SetBody(tempFile) + }, account) + return uploadFileState.UploadFileId, err } func (driver Cloud189) getUploadFileState(uploadFileId int64, account *model.Account) (*UploadFileStatusResult, error) { diff --git a/drivers/189pc/type.go b/drivers/189pc/type.go index d1557444..12e54087 100644 --- a/drivers/189pc/type.go +++ b/drivers/189pc/type.go @@ -60,6 +60,19 @@ type appSessionResp struct { RefreshToken string `json:"refreshToken"` } +type FamilyInfoListResp struct { + FamilyInfoResp []FamilyInfoResp `json:"familyInfoResp"` +} +type FamilyInfoResp struct { + Count int `json:"count"` + CreateTime string `json:"createTime"` + FamilyID int `json:"familyId"` + RemarkName string `json:"remarkName"` + Type int `json:"type"` + UseFlag int `json:"useFlag"` + UserRole int `json:"userRole"` +} + /*文件部分*/ // 文件 type Cloud189File struct {