package _189pc import ( "encoding/xml" "fmt" "sort" "strings" "time" "github.com/alist-org/alist/v3/pkg/utils" ) // 居然有四种返回方式 type RespErr struct { ResCode any `json:"res_code"` // int or string ResMessage string `json:"res_message"` Error_ string `json:"error"` XMLName xml.Name `xml:"error"` Code string `json:"code" xml:"code"` Message string `json:"message" xml:"message"` Msg string `json:"msg"` ErrorCode string `json:"errorCode"` ErrorMsg string `json:"errorMsg"` } func (e *RespErr) HasError() bool { switch v := e.ResCode.(type) { case int, int64, int32: return v != 0 case string: return e.ResCode != "" } return (e.Code != "" && e.Code != "SUCCESS") || e.ErrorCode != "" || e.Error_ != "" } func (e *RespErr) Error() string { switch v := e.ResCode.(type) { case int, int64, int32: if v != 0 { return fmt.Sprintf("res_code: %d ,res_msg: %s", v, e.ResMessage) } case string: if e.ResCode != "" { return fmt.Sprintf("res_code: %s ,res_msg: %s", e.ResCode, e.ResMessage) } } if e.Code != "" && e.Code != "SUCCESS" { if e.Msg != "" { return fmt.Sprintf("code: %s ,msg: %s", e.Code, e.Msg) } if e.Message != "" { return fmt.Sprintf("code: %s ,msg: %s", e.Code, e.Message) } return "code: " + e.Code } if e.ErrorCode != "" { return fmt.Sprintf("err_code: %s ,err_msg: %s", e.ErrorCode, e.ErrorMsg) } if e.Error_ != "" { return fmt.Sprintf("error: %s ,message: %s", e.ErrorCode, e.Message) } return "" } // 登陆需要的参数 type LoginParam struct { // 加密后的用户名和密码 RsaUsername string RsaPassword string // rsa密钥 jRsaKey string // 请求头参数 Lt string ReqId string // 表单参数 ParamId string // 验证码 CaptchaToken string } // 登陆加密相关 type EncryptConfResp struct { Result int `json:"result"` Data struct { UpSmsOn string `json:"upSmsOn"` Pre string `json:"pre"` PreDomain string `json:"preDomain"` PubKey string `json:"pubKey"` } `json:"data"` } type LoginResp struct { Msg string `json:"msg"` Result int `json:"result"` ToUrl string `json:"toUrl"` } // 刷新session返回 type UserSessionResp struct { ResCode int `json:"res_code"` ResMessage string `json:"res_message"` LoginName string `json:"loginName"` KeepAlive int `json:"keepAlive"` GetFileDiffSpan int `json:"getFileDiffSpan"` GetUserInfoSpan int `json:"getUserInfoSpan"` // 个人云 SessionKey string `json:"sessionKey"` SessionSecret string `json:"sessionSecret"` // 家庭云 FamilySessionKey string `json:"familySessionKey"` FamilySessionSecret string `json:"familySessionSecret"` } // 登录返回 type AppSessionResp struct { UserSessionResp IsSaveName string `json:"isSaveName"` // 会话刷新Token AccessToken string `json:"accessToken"` //Token刷新 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 { ID String `json:"id"` Name string `json:"name"` Size int64 `json:"size"` Md5 string `json:"md5"` LastOpTime Time `json:"lastOpTime"` CreateDate Time `json:"createDate"` Icon struct { //iconOption 5 SmallUrl string `json:"smallUrl"` LargeUrl string `json:"largeUrl"` // iconOption 10 Max600 string `json:"max600"` MediumURL string `json:"mediumUrl"` } `json:"icon"` // Orientation int64 `json:"orientation"` // FileCata int64 `json:"fileCata"` // MediaType int `json:"mediaType"` // Rev string `json:"rev"` // StarLabel int64 `json:"starLabel"` } func (c *Cloud189File) CreateTime() time.Time { return time.Time(c.CreateDate) } func (c *Cloud189File) GetHash() utils.HashInfo { return utils.NewHashInfo(utils.MD5, c.Md5) } func (c *Cloud189File) GetSize() int64 { return c.Size } func (c *Cloud189File) GetName() string { return c.Name } func (c *Cloud189File) ModTime() time.Time { return time.Time(c.LastOpTime) } func (c *Cloud189File) IsDir() bool { return false } func (c *Cloud189File) GetID() string { return string(c.ID) } func (c *Cloud189File) GetPath() string { return "" } func (c *Cloud189File) Thumb() string { return c.Icon.SmallUrl } // 文件夹 type Cloud189Folder struct { ID String `json:"id"` ParentID int64 `json:"parentId"` Name string `json:"name"` LastOpTime Time `json:"lastOpTime"` CreateDate Time `json:"createDate"` // FileListSize int64 `json:"fileListSize"` // FileCount int64 `json:"fileCount"` // FileCata int64 `json:"fileCata"` // Rev string `json:"rev"` // StarLabel int64 `json:"starLabel"` } func (c *Cloud189Folder) CreateTime() time.Time { return time.Time(c.CreateDate) } func (c *Cloud189Folder) GetHash() utils.HashInfo { return utils.HashInfo{} } func (c *Cloud189Folder) GetSize() int64 { return 0 } func (c *Cloud189Folder) GetName() string { return c.Name } func (c *Cloud189Folder) ModTime() time.Time { return time.Time(c.LastOpTime) } func (c *Cloud189Folder) IsDir() bool { return true } func (c *Cloud189Folder) GetID() string { return string(c.ID) } func (c *Cloud189Folder) GetPath() string { return "" } type Cloud189FilesResp struct { //ResCode int `json:"res_code"` //ResMessage string `json:"res_message"` FileListAO struct { Count int `json:"count"` FileList []Cloud189File `json:"fileList"` FolderList []Cloud189Folder `json:"folderList"` } `json:"fileListAO"` } // TaskInfo 任务信息 type BatchTaskInfo struct { // FileId 文件ID FileId string `json:"fileId"` // FileName 文件名 FileName string `json:"fileName"` // IsFolder 是否是文件夹,0-否,1-是 IsFolder int `json:"isFolder"` // SrcParentId 文件所在父目录ID SrcParentId string `json:"srcParentId,omitempty"` /* 冲突管理 */ // 1 -> 跳过 2 -> 保留 3 -> 覆盖 DealWay int `json:"dealWay,omitempty"` IsConflict int `json:"isConflict,omitempty"` } /* 上传部分 */ type InitMultiUploadResp struct { //Code string `json:"code"` Data struct { UploadType int `json:"uploadType"` UploadHost string `json:"uploadHost"` UploadFileID string `json:"uploadFileId"` FileDataExists int `json:"fileDataExists"` } `json:"data"` } type UploadUrlsResp struct { Code string `json:"code"` Data map[string]UploadUrlsData `json:"uploadUrls"` } type UploadUrlsData struct { RequestURL string `json:"requestURL"` RequestHeader string `json:"requestHeader"` } type UploadUrlInfo struct { PartNumber int Headers map[string]string UploadUrlsData } type UploadProgress struct { UploadInfo InitMultiUploadResp UploadParts []string } /* 第二种上传方式 */ type CreateUploadFileResp struct { // 上传文件请求ID UploadFileId int64 `json:"uploadFileId"` // 上传文件数据的URL路径 FileUploadUrl string `json:"fileUploadUrl"` // 上传文件完成后确认路径 FileCommitUrl string `json:"fileCommitUrl"` // 文件是否已存在云盘中,0-未存在,1-已存在 FileDataExists int `json:"fileDataExists"` } type GetUploadFileStatusResp struct { CreateUploadFileResp // 已上传的大小 DataSize int64 `json:"dataSize"` Size int64 `json:"size"` } func (r *GetUploadFileStatusResp) GetSize() int64 { return r.DataSize + r.Size } type CommitMultiUploadFileResp struct { File struct { UserFileID String `json:"userFileId"` FileName string `json:"fileName"` FileSize int64 `json:"fileSize"` FileMd5 string `json:"fileMd5"` CreateDate Time `json:"createDate"` } `json:"file"` } func (f *CommitMultiUploadFileResp) toFile() *Cloud189File { return &Cloud189File{ ID: f.File.UserFileID, Name: f.File.FileName, Size: f.File.FileSize, Md5: f.File.FileMd5, LastOpTime: f.File.CreateDate, CreateDate: f.File.CreateDate, } } type OldCommitUploadFileResp struct { XMLName xml.Name `xml:"file"` ID String `xml:"id"` Name string `xml:"name"` Size int64 `xml:"size"` Md5 string `xml:"md5"` CreateDate Time `xml:"createDate"` } func (f *OldCommitUploadFileResp) toFile() *Cloud189File { return &Cloud189File{ ID: f.ID, Name: f.Name, Size: f.Size, Md5: f.Md5, CreateDate: f.CreateDate, LastOpTime: f.CreateDate, } } type CreateBatchTaskResp struct { TaskID string `json:"taskId"` } type BatchTaskStateResp struct { FailedCount int `json:"failedCount"` Process int `json:"process"` SkipCount int `json:"skipCount"` SubTaskCount int `json:"subTaskCount"` SuccessedCount int `json:"successedCount"` SuccessedFileIDList []int64 `json:"successedFileIdList"` TaskID string `json:"taskId"` TaskStatus int `json:"taskStatus"` //1 初始化 2 存在冲突 3 执行中,4 完成 } type BatchTaskConflictTaskInfoResp struct { SessionKey string `json:"sessionKey"` TargetFolderID int `json:"targetFolderId"` TaskID string `json:"taskId"` TaskInfos []BatchTaskInfo TaskType int `json:"taskType"` } /* query 加密参数*/ type Params map[string]string func (p Params) Set(k, v string) { p[k] = v } func (p Params) Encode() string { if p == nil { return "" } var buf strings.Builder keys := make([]string, 0, len(p)) for k := range p { keys = append(keys, k) } sort.Strings(keys) for i := range keys { if buf.Len() > 0 { buf.WriteByte('&') } buf.WriteString(keys[i]) buf.WriteByte('=') buf.WriteString(p[keys[i]]) } return buf.String() }