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  }