mirror of https://github.com/Xhofe/alist
				
				
				
			✨ api proxy
							parent
							
								
									3d3a97288a
								
							
						
					
					
						commit
						8e7b2c5837
					
				| 
						 | 
				
			
			@ -84,13 +84,18 @@ func GetDrivers() map[string][]Item {
 | 
			
		|||
				},
 | 
			
		||||
			}, v.Items()...)
 | 
			
		||||
		}
 | 
			
		||||
		res[k] = append(res[k], Item{
 | 
			
		||||
			Name:        "proxy_url",
 | 
			
		||||
			Label:       "proxy_url",
 | 
			
		||||
			Type:        TypeString,
 | 
			
		||||
			Required:    false,
 | 
			
		||||
			Description: "proxy url",
 | 
			
		||||
		})
 | 
			
		||||
		res[k] = append([]Item{
 | 
			
		||||
			{
 | 
			
		||||
				Name:  "down_proxy_url",
 | 
			
		||||
				Label: "down_proxy_url",
 | 
			
		||||
				Type:  TypeString,
 | 
			
		||||
			},
 | 
			
		||||
			{
 | 
			
		||||
				Name:  "api_proxy_url",
 | 
			
		||||
				Label: "api_proxy_url",
 | 
			
		||||
				Type:  TypeString,
 | 
			
		||||
			},
 | 
			
		||||
		}, res[k]...)
 | 
			
		||||
	}
 | 
			
		||||
	return res
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,6 +2,7 @@ package pikpak
 | 
			
		|||
 | 
			
		||||
import (
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"github.com/Xhofe/alist/conf"
 | 
			
		||||
	"github.com/Xhofe/alist/drivers/base"
 | 
			
		||||
	"github.com/Xhofe/alist/model"
 | 
			
		||||
| 
						 | 
				
			
			@ -20,6 +21,10 @@ type RespErr struct {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (driver PikPak) Login(account *model.Account) error {
 | 
			
		||||
	url := "https://user.mypikpak.com/v1/auth/signin"
 | 
			
		||||
	if account.APIProxyUrl != "" {
 | 
			
		||||
		url = fmt.Sprintf("%s/%s", account.APIProxyUrl, url)
 | 
			
		||||
	}
 | 
			
		||||
	var e RespErr
 | 
			
		||||
	res, err := base.RestyClient.R().SetError(&e).SetBody(base.Json{
 | 
			
		||||
		"captcha_token": "",
 | 
			
		||||
| 
						 | 
				
			
			@ -27,11 +32,12 @@ func (driver PikPak) Login(account *model.Account) error {
 | 
			
		|||
		"client_secret": "dbw2OtmVEeuUvIptb1Coyg",
 | 
			
		||||
		"username":      account.Username,
 | 
			
		||||
		"password":      account.Password,
 | 
			
		||||
	}).Post("https://user.mypikpak.com/v1/auth/signin")
 | 
			
		||||
	}).Post(url)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		account.Status = err.Error()
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	log.Debug(res.String())
 | 
			
		||||
	if e.ErrorCode != 0 {
 | 
			
		||||
		account.Status = e.Error
 | 
			
		||||
		return errors.New(e.Error)
 | 
			
		||||
| 
						 | 
				
			
			@ -44,13 +50,17 @@ func (driver PikPak) Login(account *model.Account) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (driver PikPak) RefreshToken(account *model.Account) error {
 | 
			
		||||
	url := "https://user.mypikpak.com/v1/auth/token"
 | 
			
		||||
	if account.APIProxyUrl != "" {
 | 
			
		||||
		url = fmt.Sprintf("%s/%s", account.APIProxyUrl, url)
 | 
			
		||||
	}
 | 
			
		||||
	var e RespErr
 | 
			
		||||
	res, err := base.RestyClient.R().SetError(&e).SetBody(base.Json{
 | 
			
		||||
		"client_id":     "YNxT9w7GMdWvEOKa",
 | 
			
		||||
		"client_secret": "dbw2OtmVEeuUvIptb1Coyg",
 | 
			
		||||
		"grant_type":    "refresh_token",
 | 
			
		||||
		"refresh_token": account.RefreshToken,
 | 
			
		||||
	}).Post("https://user.mypikpak.com/v1/auth/token")
 | 
			
		||||
	}).Post(url)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		account.Status = err.Error()
 | 
			
		||||
		return err
 | 
			
		||||
| 
						 | 
				
			
			@ -69,6 +79,9 @@ func (driver PikPak) RefreshToken(account *model.Account) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
func (driver PikPak) Request(url string, method int, query map[string]string, data *base.Json, resp interface{}, account *model.Account) ([]byte, error) {
 | 
			
		||||
	if account.APIProxyUrl != "" {
 | 
			
		||||
		url = fmt.Sprintf("%s/%s", account.APIProxyUrl, url)
 | 
			
		||||
	}
 | 
			
		||||
	req := base.RestyClient.R()
 | 
			
		||||
	req.SetHeader("Authorization", "Bearer "+account.AccessToken)
 | 
			
		||||
	if query != nil {
 | 
			
		||||
| 
						 | 
				
			
			@ -97,6 +110,7 @@ func (driver PikPak) Request(url string, method int, query map[string]string, da
 | 
			
		|||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	log.Debug(res.String())
 | 
			
		||||
	if e.ErrorCode != 0 {
 | 
			
		||||
		if e.ErrorCode == 16 {
 | 
			
		||||
			// login / refresh token
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,10 +31,11 @@ type Account struct {
 | 
			
		|||
	SiteUrl        string     `json:"site_url"`
 | 
			
		||||
	SiteId         string     `json:"site_id"`
 | 
			
		||||
	InternalType   string     `json:"internal_type"`
 | 
			
		||||
	WebdavProxy    bool       `json:"webdav_proxy"`
 | 
			
		||||
	Proxy          bool       `json:"proxy"`       // 是否中转
 | 
			
		||||
	WebdavProxy    bool       `json:"webdav_proxy"` // 开启之后只会webdav走中转
 | 
			
		||||
	Proxy          bool       `json:"proxy"`        // 是否中转,开启之后web和webdav都会走中转
 | 
			
		||||
	//AllowProxy     bool       `json:"allow_proxy"` // 是否允许中转下载
 | 
			
		||||
	ProxyUrl       string     `json:"proxy_url"`   // 用于中转下载服务的URL
 | 
			
		||||
	DownProxyUrl string `json:"down_proxy_url"` // 用于中转下载服务的URL 两处 1. path请求中返回的链接 2. down下载时进行302
 | 
			
		||||
	APIProxyUrl  string `json:"api_proxy_url"`  // 用于中转api的地址
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var accountsMap = map[string]Account{}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -48,18 +48,26 @@ func Proxy(c *gin.Context) {
 | 
			
		|||
		common.ErrorResp(c, err, 500)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	// 只有三种情况允许中转:
 | 
			
		||||
	// 只有以下几种情况允许中转:
 | 
			
		||||
	// 1. 账号开启中转
 | 
			
		||||
	// 2. driver只能中转
 | 
			
		||||
	// 3. 是文本类型文件
 | 
			
		||||
	// 4. 开启webdav中转(需要验证sign)
 | 
			
		||||
	if !account.Proxy && !driver.Config().OnlyProxy && utils.GetFileType(filepath.Ext(rawPath)) != conf.TEXT {
 | 
			
		||||
		common.ErrorResp(c, fmt.Errorf("[%s] not allowed proxy", account.Name), 403)
 | 
			
		||||
		return
 | 
			
		||||
		// 只开启了webdav中转,验证sign
 | 
			
		||||
		ok := false
 | 
			
		||||
		if account.WebdavProxy {
 | 
			
		||||
			_, ok = c.Get("sign")
 | 
			
		||||
		}
 | 
			
		||||
		if !ok {
 | 
			
		||||
			common.ErrorResp(c, fmt.Errorf("[%s] not allowed proxy", account.Name), 403)
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// 中转时有中转机器使用中转机器,若携带标志位则表明不能再走中转机器了
 | 
			
		||||
	if account.ProxyUrl != "" && c.Param("d") != "1" {
 | 
			
		||||
	if account.DownProxyUrl != "" && c.Param("d") != "1" {
 | 
			
		||||
		name := utils.Base(rawPath)
 | 
			
		||||
		link := fmt.Sprintf("%s%s?sign=%s", account.ProxyUrl, rawPath, utils.SignWithToken(name, conf.Token))
 | 
			
		||||
		link := fmt.Sprintf("%s%s?sign=%s", account.DownProxyUrl, rawPath, utils.SignWithToken(name, conf.Token))
 | 
			
		||||
		c.Redirect(302, link)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,8 +41,8 @@ func Path(c *gin.Context) {
 | 
			
		|||
	if file != nil {
 | 
			
		||||
		// 对于中转文件或只能中转,将链接修改为中转链接
 | 
			
		||||
		if driver.Config().OnlyProxy || account.Proxy {
 | 
			
		||||
			if account.ProxyUrl != "" {
 | 
			
		||||
				file.Url = fmt.Sprintf("%s%s?sign=%s", account.ProxyUrl, req.Path, utils.SignWithToken(file.Name, conf.Token))
 | 
			
		||||
			if account.DownProxyUrl != "" {
 | 
			
		||||
				file.Url = fmt.Sprintf("%s%s?sign=%s", account.DownProxyUrl, req.Path, utils.SignWithToken(file.Name, conf.Token))
 | 
			
		||||
			} else {
 | 
			
		||||
				file.Url = fmt.Sprintf("//%s/d%s", c.Request.Host, req.Path)
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,6 +14,7 @@ func DownCheck(c *gin.Context) {
 | 
			
		|||
	rawPath = utils.ParsePath(rawPath)
 | 
			
		||||
	name := utils.Base(rawPath)
 | 
			
		||||
	if sign == utils.SignWithToken(name, conf.Token) {
 | 
			
		||||
		c.Set("sign", true)
 | 
			
		||||
		c.Next()
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -24,4 +25,4 @@ func DownCheck(c *gin.Context) {
 | 
			
		|||
		return
 | 
			
		||||
	}
 | 
			
		||||
	c.Next()
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue