github.com/qjfoidnh/BaiduPCS-Go@v0.0.0-20231011165705-caa18a3765f3/internal/pcsconfig/maniper.go (about) 1 package pcsconfig 2 3 import ( 4 "regexp" 5 "strings" 6 7 "github.com/qjfoidnh/BaiduPCS-Go/pcsutil/converter" 8 "github.com/qjfoidnh/BaiduPCS-Go/requester" 9 ) 10 11 const ( 12 opDelete = "delete" 13 opSwitch = "switch" 14 opGet = "get" 15 ) 16 17 func (c *PCSConfig) manipUser(op string, baiduBase *BaiduBase) (*Baidu, error) { 18 // empty baiduBase 19 if baiduBase == nil || (baiduBase.UID == 0 && baiduBase.Name == "") { 20 switch op { 21 case opGet: 22 return &Baidu{}, nil 23 default: 24 return nil, ErrBaiduUserNotFound 25 } 26 } 27 if len(c.BaiduUserList) == 0 { 28 return nil, ErrNoSuchBaiduUser 29 } 30 31 for k, user := range c.BaiduUserList { 32 if user == nil { 33 continue 34 } 35 36 switch { 37 case baiduBase.UID != 0 && baiduBase.Name != "": 38 // 不区分大小写 39 if user.UID == baiduBase.UID && strings.EqualFold(user.Name, baiduBase.Name) { 40 goto handle 41 } 42 continue 43 case baiduBase.UID == 0 && baiduBase.Name != "": 44 // 不区分大小写 45 if strings.EqualFold(user.Name, baiduBase.Name) { 46 goto handle 47 } 48 continue 49 case baiduBase.UID != 0 && baiduBase.Name == "": 50 if user.UID == baiduBase.UID { 51 goto handle 52 } 53 continue 54 default: 55 continue 56 } 57 // unreachable zone 58 59 handle: 60 switch op { 61 case opSwitch: 62 c.setupNewUser(user) 63 case opDelete: 64 c.BaiduUserList = append(c.BaiduUserList[:k], c.BaiduUserList[k+1:]...) 65 66 // 修改 正在使用的 百度帐号 67 // 如果要删除的帐号为当前登录的帐号, 则设置当前登录帐号为列表中第一个帐号 68 if c.BaiduActiveUID == user.UID { 69 if len(c.BaiduUserList) != 0 { 70 c.setupNewUser(c.BaiduUserList[0]) 71 } else { 72 c.BaiduActiveUID = 0 73 } 74 } 75 case opGet: 76 // do nothing 77 default: 78 // do nothing 79 } 80 return user, nil 81 } 82 83 return nil, ErrBaiduUserNotFound 84 } 85 86 //setupNewUser 从已有用户中, 设置新的当前登录用户 87 func (c *PCSConfig) setupNewUser(user *Baidu) { 88 if user == nil { 89 return 90 } 91 c.BaiduActiveUID = user.UID 92 c.activeUser = user 93 c.pcs = user.BaiduPCS() 94 } 95 96 // SwitchUser 切换用户, 返回切换成功的用户 97 func (c *PCSConfig) SwitchUser(baiduBase *BaiduBase) (*Baidu, error) { 98 return c.manipUser(opSwitch, baiduBase) 99 } 100 101 // DeleteUser 删除用户, 返回删除成功的用户 102 func (c *PCSConfig) DeleteUser(baiduBase *BaiduBase) (*Baidu, error) { 103 return c.manipUser(opDelete, baiduBase) 104 } 105 106 // GetBaiduUser 获取百度用户信息 107 func (c *PCSConfig) GetBaiduUser(baidubase *BaiduBase) (*Baidu, error) { 108 return c.manipUser(opGet, baidubase) 109 } 110 111 // CheckBaiduUserExist 检查百度用户是否存在于已登录列表 112 func (c *PCSConfig) CheckBaiduUserExist(baidubase *BaiduBase) bool { 113 _, err := c.manipUser("", baidubase) 114 return err == nil 115 } 116 117 // SetupUserByBDUSS 设置百度 bduss, ptoken, stoken, cookies 并保存 118 func (c *PCSConfig) SetupUserByBDUSS(bduss, ptoken, stoken, cookies string) (baidu *Baidu, err error) { 119 if bduss == "" && cookies != "" { 120 re, _ := regexp.Compile(`BDUSS=(.+?);`) 121 sub := re.FindSubmatch([]byte(cookies)) 122 bduss = string(sub[1]) 123 } 124 b, err := NewUserInfoByInput(bduss, c.ForceLogin) 125 if c.ForceLogin == "" { 126 b, err = NewUserInfoByBDUSS(bduss) 127 } 128 if err != nil { 129 return nil, err 130 } 131 132 c.DeleteUser(&BaiduBase{ 133 UID: b.UID, 134 }) // 删除旧的信息 135 136 b.PTOKEN = ptoken // 实际未使用 137 b.STOKEN = stoken 138 b.COOKIES = cookies 139 140 c.BaiduUserList = append(c.BaiduUserList, b) 141 142 // 自动切换用户 143 c.setupNewUser(b) 144 return b, nil 145 } 146 147 // SetAppID 设置app_id 148 func (c *PCSConfig) SetAppID(appID int) { 149 c.AppID = appID 150 if c.pcs != nil { 151 c.pcs.SetAPPID(appID) 152 } 153 } 154 155 // SetCacheSizeByStr 设置cache_size 156 func (c *PCSConfig) SetCacheSizeByStr(sizeStr string) error { 157 size, err := converter.ParseFileSizeStr(sizeStr) 158 if err != nil { 159 return err 160 } 161 c.CacheSize = int(size) 162 return nil 163 } 164 165 // SetMaxDownloadRateByStr 设置 max_download_rate 166 func (c *PCSConfig) SetMaxDownloadRateByStr(sizeStr string) error { 167 size, err := converter.ParseFileSizeStr(stripPerSecond(sizeStr)) 168 if err != nil { 169 return err 170 } 171 c.MaxDownloadRate = size 172 return nil 173 } 174 175 // SetMaxUploadRateByStr 设置 max_upload_rate 176 func (c *PCSConfig) SetMaxUploadRateByStr(sizeStr string) error { 177 size, err := converter.ParseFileSizeStr(stripPerSecond(sizeStr)) 178 if err != nil { 179 return err 180 } 181 c.MaxUploadRate = size 182 return nil 183 } 184 185 // SetUserAgent 设置User-Agent 186 func (c *PCSConfig) SetUserAgent(userAgent string) { 187 c.UserAgent = userAgent 188 requester.UserAgent = userAgent 189 } 190 191 // SetPCSUA 设置 PCS User-Agent 192 func (c *PCSConfig) SetPCSUA(pcsUA string) { 193 c.PCSUA = pcsUA 194 if c.pcs != nil { 195 c.pcs.SetPCSUserAgent(pcsUA) 196 } 197 } 198 199 // SetPanUA 设置 Pan User-Agent 200 func (c *PCSConfig) SetPanUA(panUA string) { 201 c.PanUA = panUA 202 if c.pcs != nil { 203 c.pcs.SetPanUserAgent(panUA) 204 } 205 } 206 207 // SetPCSAddr 设置 PCS 服务器地址 208 func (c *PCSConfig) SETPCSAddr(pcsaddr string) bool { 209 match, _ := regexp.MatchString("^([cd]\\d?\\.)?pcs\\.baidu\\.com", pcsaddr) 210 if match { 211 c.PCSAddr = pcsaddr 212 if c.pcs != nil { 213 c.pcs.SetPCSAddr(pcsaddr) 214 } 215 } 216 return match 217 } 218 219 // SetEnableHTTPS 设置是否启用https 220 func (c *PCSConfig) SetEnableHTTPS(https bool) { 221 c.EnableHTTPS = https 222 if c.pcs != nil { 223 c.pcs.SetHTTPS(https) 224 } 225 } 226 227 func (c *PCSConfig) SetNoCheck(nocheck bool) { 228 c.NoCheck = nocheck 229 } 230 231 // SetUploadPolicy 设置上传文件重名时的处理策略 232 func (c *PCSConfig) SetUploadPolicy(upolicy string) { 233 c.UPolicy = upolicy 234 } 235 236 // SetProxy 设置代理 237 func (c *PCSConfig) SetProxy(proxy string) { 238 c.Proxy = proxy 239 requester.SetGlobalProxy(proxy) 240 } 241 242 // SetLocalAddrs 设置localAddrs 243 func (c *PCSConfig) SetLocalAddrs(localAddrs string) { 244 c.LocalAddrs = localAddrs 245 requester.SetLocalTCPAddrList(strings.Split(localAddrs, ",")...) 246 } 247 248 // SetIgnoreIllegal 设置忽略上传文件名非法字符 249 func (c *PCSConfig) SetIgnoreIllegal(ignore bool) { 250 c.IgnoreIllegal = ignore 251 } 252 253 // SetForceLogin 设置强制登录 254 func (c *PCSConfig) SetForceLogin(username string) { 255 c.ForceLogin = username 256 }