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 }