github.com/qjfoidnh/BaiduPCS-Go@v0.0.0-20231011165705-caa18a3765f3/internal/pcsconfig/baidu.go (about)

     1  package pcsconfig
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"path"
     7  	"path/filepath"
     8  	"strconv"
     9  	"strings"
    10  
    11  	"github.com/olekukonko/tablewriter"
    12  	"github.com/qjfoidnh/BaiduPCS-Go/baidupcs"
    13  	"github.com/qjfoidnh/BaiduPCS-Go/pcstable"
    14  	"github.com/qjfoidnh/BaiduPCS-Go/pcsutil/converter"
    15  	"github.com/qjfoidnh/baidu-tools/tieba"
    16  )
    17  
    18  var (
    19  	//ErrNoSuchBaiduUser 未登录任何百度帐号
    20  	ErrNoSuchBaiduUser = errors.New("no such baidu user")
    21  	//ErrBaiduUserNotFound 未找到百度帐号
    22  	ErrBaiduUserNotFound = errors.New("baidu user not found")
    23  )
    24  
    25  //BaiduBase Baidu基
    26  type BaiduBase struct {
    27  	UID  uint64 `json:"uid"`  // 百度ID对应的uid
    28  	Name string `json:"name"` // 真实ID
    29  }
    30  
    31  // Baidu 百度帐号对象
    32  type Baidu struct {
    33  	BaiduBase
    34  	Sex string  `json:"sex"` // 性别
    35  	Age float64 `json:"age"` // 帐号年龄
    36  
    37  	BDUSS   string `json:"bduss"`
    38  	PTOKEN  string `json:"ptoken"`
    39  	STOKEN  string `json:"stoken"`
    40  	BAIDUID string `json:"baiduid"`
    41  	SBOXTKN string `json:"sboxtkn"`
    42  	COOKIES string `json:"cookies"`
    43  
    44  	AccessToken string `json:"accesstoken"`
    45  
    46  	Workdir string `json:"workdir"` // 工作目录
    47  }
    48  
    49  // BaiduPCS 初始化*baidupcs.BaiduPCS
    50  func (baidu *Baidu) BaiduPCS() *baidupcs.BaiduPCS {
    51  	pcs := baidupcs.NewPCS(Config.AppID, baidu.BDUSS)
    52  	pcs.SetStoken(baidu.STOKEN)
    53  	if baidu.SBOXTKN != "" {
    54  		pcs.SetSboxtkn(baidu.SBOXTKN)
    55  	}
    56  	if strings.Contains(baidu.COOKIES, "STOKEN=") && baidu.STOKEN == "" {
    57  		// 未显式指定stoken则从cookies中读取
    58  		pcs = baidupcs.NewPCSWithCookieStr(Config.AppID, baidu.COOKIES)
    59  	}
    60  	pcs.SetHTTPS(Config.EnableHTTPS)
    61  	pcs.SetPCSUserAgent(Config.PCSUA)
    62  	pcs.SetPanUserAgent(Config.PanUA)
    63  	pcs.SetUID(baidu.UID)
    64  	pcs.SetaccessToken(baidu.AccessToken)
    65  	return pcs
    66  }
    67  
    68  // GetSavePath 根据提供的网盘文件路径 pcspath, 返回本地储存路径,
    69  // 返回绝对路径, 获取绝对路径出错时才返回相对路径...
    70  func (baidu *Baidu) GetSavePath(pcspath string) string {
    71  	dirStr := filepath.Join(Config.SaveDir, fmt.Sprintf("%d_%s", baidu.UID, converter.TrimPathInvalidChars(baidu.Name)), pcspath)
    72  	dir, err := filepath.Abs(dirStr)
    73  	if err != nil {
    74  		dir = filepath.Clean(dirStr)
    75  	}
    76  	return dir
    77  }
    78  
    79  // PathJoin 合并工作目录和相对路径p, 若p为绝对路径则忽略
    80  func (baidu *Baidu) PathJoin(p string) string {
    81  	if path.IsAbs(p) {
    82  		return p
    83  	}
    84  	return path.Join(baidu.Workdir, p)
    85  }
    86  
    87  // BaiduUserList 百度帐号列表
    88  type BaiduUserList []*Baidu
    89  
    90  // NewUserInfoByBDUSS 检测BDUSS有效性, 同时获取百度详细信息 (无法获取 ptoken 和 stoken)
    91  func NewUserInfoByBDUSS(bduss string) (b *Baidu, err error) {
    92  	t, err := tieba.NewUserInfoByBDUSS(bduss)
    93  	if err != nil {
    94  		return nil, err
    95  	}
    96  
    97  	b = &Baidu{
    98  		BaiduBase: BaiduBase{
    99  			UID:  t.Baidu.UID,
   100  			Name: t.Baidu.Name,
   101  		},
   102  		Sex:     t.Baidu.Sex,
   103  		Age:     t.Baidu.Age,
   104  		BDUSS:   bduss,
   105  		Workdir: "/",
   106  	}
   107  	return b, nil
   108  }
   109  
   110  // NewUserInfoByInput 不检测BDUSS有效性, 手动设置百度详细信息 (只适用tieba.baidu.com用户信息接口不可用的情况)
   111  func NewUserInfoByInput(bduss, name string) (b *Baidu, err error) {
   112  	b = &Baidu{
   113  		BaiduBase: BaiduBase{
   114  			UID:  24,
   115  			Name: name,
   116  		},
   117  		Sex:     "default",
   118  		Age:     24,
   119  		BDUSS:   bduss,
   120  		Workdir: "/",
   121  	}
   122  	return b, nil
   123  }
   124  
   125  // String 格式输出百度帐号列表
   126  func (bl *BaiduUserList) String() string {
   127  	builder := &strings.Builder{}
   128  
   129  	tb := pcstable.NewTable(builder)
   130  	tb.SetColumnAlignment([]int{tablewriter.ALIGN_DEFAULT, tablewriter.ALIGN_RIGHT, tablewriter.ALIGN_CENTER, tablewriter.ALIGN_CENTER, tablewriter.ALIGN_CENTER})
   131  	tb.SetHeader([]string{"#", "uid", "用户名", "性别", "age"})
   132  
   133  	for k, baiduInfo := range *bl {
   134  		tb.Append([]string{strconv.Itoa(k), strconv.FormatUint(baiduInfo.UID, 10), baiduInfo.Name, baiduInfo.Sex, fmt.Sprint(baiduInfo.Age)})
   135  	}
   136  
   137  	tb.Render()
   138  
   139  	return builder.String()
   140  }