github.com/qjfoidnh/BaiduPCS-Go@v0.0.0-20231011165705-caa18a3765f3/baidupcs/share.go (about) 1 package baidupcs 2 3 import ( 4 "errors" 5 "strings" 6 7 "github.com/qjfoidnh/BaiduPCS-Go/baidupcs/pcserror" 8 ) 9 10 type ( 11 // ShareOption 分享可选项 12 ShareOption struct { 13 Password string // 密码 14 Period int // 有效期 15 IsCombined bool // 是否将密码输出到分享链接 16 } 17 18 // Shared 分享信息 19 Shared struct { 20 Link string `json:"link"` 21 Pwd string `json:"pwd"` 22 ShareID int64 `json:"shareid"` 23 } 24 25 // ShareRecordInfo 分享信息 26 ShareRecordInfo struct { 27 ShareID int64 `json:"shareId"` 28 FsIds []int64 `json:"fsIds"` 29 Passwd string `json:"-"` // 这个字段已经没有用了, 需要从ShareSURLInfo中获取 30 Shortlink string `json:"shortlink"` 31 Status int `json:"status"` // 状态 32 Public int `json:"public"` // 是否为公开分享 33 TypicalCategory int `json:"typicalCategory"` // 文件类型 34 TypicalPath string `json:"typicalPath"` // 路径 35 ExpireType int `json:"expiredType"` // 过期类型 36 ExpireTime int64 `json:"expiredTime"` // 过期时间 37 ViewCount int `json:"vCnt"` // 浏览次数 38 Valid string // 是否过期 39 } 40 41 shareSURLInfo struct { 42 *pcserror.PanErrorInfo 43 *ShareSURLInfo 44 } 45 46 // ShareSURLInfo 分享的子信息 47 ShareSURLInfo struct { 48 Pwd string `json:"pwd"` // 新密码 49 ShortURL string `json:"shorturl"` 50 } 51 52 // ShareRecordInfoList 分享信息列表 53 ShareRecordInfoList []*ShareRecordInfo 54 55 sharePSetJSON struct { 56 *Shared 57 *pcserror.PanErrorInfo 58 } 59 60 shareListJSON struct { 61 List ShareRecordInfoList `json:"list"` 62 *pcserror.PanErrorInfo 63 } 64 ) 65 66 var ( 67 // ErrShareLinkNotFound 未找到分享链接 68 ErrShareLinkNotFound = errors.New("未找到分享链接") 69 ) 70 71 // ShareSet 分享文件 72 func (pcs *BaiduPCS) ShareSet(paths []string, option *ShareOption) (s *Shared, pcsError pcserror.Error) { 73 if option.Password == "" || len(option.Password) != 4 { 74 option = &ShareOption{CreatePasswd(), option.Period, option.IsCombined} 75 } 76 77 dataReadCloser, pcsError := pcs.PrepareSharePSet(paths, option.Password, option.Period) 78 if pcsError != nil { 79 return 80 } 81 82 defer dataReadCloser.Close() 83 84 errInfo := pcserror.NewPanErrorInfo(OperationShareSet) 85 jsonData := sharePSetJSON{ 86 Shared: &Shared{}, 87 PanErrorInfo: errInfo, 88 } 89 90 pcsError = pcserror.HandleJSONParse(OperationShareSet, dataReadCloser, &jsonData) 91 if pcsError != nil { 92 return 93 } 94 95 if jsonData.Link == "" { 96 errInfo.ErrType = pcserror.ErrTypeOthers 97 errInfo.Err = ErrShareLinkNotFound 98 return nil, errInfo 99 } 100 jsonData.Pwd = option.Password 101 102 return jsonData.Shared, nil 103 } 104 105 // ShareCancel 取消分享 106 func (pcs *BaiduPCS) ShareCancel(shareIDs []int64) (pcsError pcserror.Error) { 107 dataReadCloser, pcsError := pcs.PrepareShareCancel(shareIDs) 108 if pcsError != nil { 109 return 110 } 111 112 defer dataReadCloser.Close() 113 114 pcsError = pcserror.DecodePanJSONError(OperationShareCancel, dataReadCloser) 115 return 116 } 117 118 // ShareList 列出分享列表 119 func (pcs *BaiduPCS) ShareList(page int) (records ShareRecordInfoList, pcsError pcserror.Error) { 120 dataReadCloser, pcsError := pcs.PrepareShareList(page) 121 if pcsError != nil { 122 return 123 } 124 125 defer dataReadCloser.Close() 126 127 errInfo := pcserror.NewPanErrorInfo(OperationShareList) 128 jsonData := shareListJSON{ 129 List: records, 130 PanErrorInfo: errInfo, 131 } 132 133 pcsError = pcserror.HandleJSONParse(OperationShareList, dataReadCloser, &jsonData) 134 if pcsError != nil { 135 // json解析错误 136 if pcsError.GetErrType() == pcserror.ErrTypeJSONParseError { 137 // 服务器更改, List为空时变成{}, 导致解析错误 138 if strings.Contains(pcsError.GetError().Error(), `"list":{}`) { 139 // 返回空列表 140 return jsonData.List, nil 141 } 142 } 143 return 144 } 145 146 if jsonData.List == nil { 147 errInfo.ErrType = pcserror.ErrTypeOthers 148 errInfo.Err = errors.New("shared list is nil") 149 return nil, errInfo 150 } 151 152 return jsonData.List, nil 153 } 154 155 //ShareSURLInfo 获取分享的详细信息, 包含密码 156 func (pcs *BaiduPCS) ShareSURLInfo(shareID int64) (info *ShareSURLInfo, pcsError pcserror.Error) { 157 dataReadCloser, pcsError := pcs.PrepareShareSURLInfo(shareID) 158 if pcsError != nil { 159 return 160 } 161 162 defer dataReadCloser.Close() 163 164 errInfo := pcserror.NewPanErrorInfo(OperationShareSURLInfo) 165 166 jsonData := shareSURLInfo{ 167 PanErrorInfo: errInfo, 168 } 169 170 pcsError = pcserror.HandleJSONParse(OperationShareList, dataReadCloser, &jsonData) 171 if pcsError != nil { 172 // json解析错误 173 return 174 } 175 176 // 去掉0 177 if jsonData.Pwd == "0" { 178 jsonData.Pwd = "" 179 } 180 181 return jsonData.ShareSURLInfo, nil 182 }