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  }