fix(pikpak): error when passing the user_id field (#7117 close #7118)

This commit is contained in:
YangXu 2024-09-01 23:06:51 +08:00 committed by GitHub
parent d4f9c4b6af
commit ba716ae325
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 97 additions and 76 deletions

View File

@ -90,43 +90,36 @@ func (d *PikPak) Init(ctx context.Context) (err error) {
// 如果已经有RefreshToken直接获取AccessToken // 如果已经有RefreshToken直接获取AccessToken
if d.Addition.RefreshToken != "" { if d.Addition.RefreshToken != "" {
// 使用 oauth2 刷新令牌 if d.RefreshTokenMethod == "oauth2" {
// 初始化 oauth2Token // 使用 oauth2 刷新令牌
d.oauth2Token = oauth2.ReuseTokenSource(nil, utils.TokenSource(func() (*oauth2.Token, error) { // 初始化 oauth2Token
return oauth2Config.TokenSource(ctx, &oauth2.Token{ d.initializeOAuth2Token(ctx, oauth2Config, d.Addition.RefreshToken)
RefreshToken: d.Addition.RefreshToken, if err := d.refreshTokenByOAuth2(); err != nil {
}).Token() return err
})) }
} else {
if err := d.refreshToken(d.Addition.RefreshToken); err != nil {
return err
}
}
} else { } else {
// 如果没有填写RefreshToken尝试登录 获取 refreshToken // 如果没有填写RefreshToken尝试登录 获取 refreshToken
if err := d.login(); err != nil { if err := d.login(); err != nil {
return err return err
} }
d.oauth2Token = oauth2.ReuseTokenSource(nil, utils.TokenSource(func() (*oauth2.Token, error) { if d.RefreshTokenMethod == "oauth2" {
return oauth2Config.TokenSource(ctx, &oauth2.Token{ d.initializeOAuth2Token(ctx, oauth2Config, d.RefreshToken)
RefreshToken: d.RefreshToken, }
}).Token()
}))
}
token, err := d.oauth2Token.Token()
if err != nil {
return err
} }
d.RefreshToken = token.RefreshToken
d.AccessToken = token.AccessToken
// 获取CaptchaToken // 获取CaptchaToken
err = d.RefreshCaptchaTokenAtLogin(GetAction(http.MethodGet, "https://api-drive.mypikpak.com/drive/v1/files"), d.Username) err = d.RefreshCaptchaTokenAtLogin(GetAction(http.MethodGet, "https://api-drive.mypikpak.com/drive/v1/files"), d.Common.GetUserID())
if err != nil { if err != nil {
return err return err
} }
// 获取用户ID
userID := token.Extra("sub").(string)
if userID != "" {
d.Common.SetUserID(userID)
}
// 更新UserAgent // 更新UserAgent
if d.Platform == "android" { if d.Platform == "android" {
d.Common.UserAgent = BuildCustomUserAgent(utils.GetMD5EncodeStr(d.Username+d.Password), AndroidClientID, AndroidPackageName, AndroidSdkVersion, AndroidClientVersion, AndroidPackageName, d.Common.UserID) d.Common.UserAgent = BuildCustomUserAgent(utils.GetMD5EncodeStr(d.Username+d.Password), AndroidClientID, AndroidPackageName, AndroidSdkVersion, AndroidClientVersion, AndroidPackageName, d.Common.UserID)

View File

@ -7,13 +7,14 @@ import (
type Addition struct { type Addition struct {
driver.RootID driver.RootID
Username string `json:"username" required:"true"` Username string `json:"username" required:"true"`
Password string `json:"password" required:"true"` Password string `json:"password" required:"true"`
Platform string `json:"platform" required:"true" type:"select" options:"android,web"` Platform string `json:"platform" required:"true" type:"select" options:"android,web"`
RefreshToken string `json:"refresh_token" required:"true" default:""` RefreshToken string `json:"refresh_token" required:"true" default:""`
CaptchaToken string `json:"captcha_token" default:""` RefreshTokenMethod string `json:"refresh_token_method" required:"true" type:"select" options:"oauth2,http"`
DeviceID string `json:"device_id" required:"false" default:""` CaptchaToken string `json:"captcha_token" default:""`
DisableMediaLink bool `json:"disable_media_link" default:"true"` DeviceID string `json:"device_id" required:"false" default:""`
DisableMediaLink bool `json:"disable_media_link" default:"true"`
} }
var config = driver.Config{ var config = driver.Config{

View File

@ -2,6 +2,7 @@ package pikpak
import ( import (
"bytes" "bytes"
"context"
"crypto/md5" "crypto/md5"
"crypto/sha1" "crypto/sha1"
"encoding/hex" "encoding/hex"
@ -13,6 +14,7 @@ import (
"github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/aliyun/aliyun-oss-go-sdk/oss"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
"github.com/pkg/errors" "github.com/pkg/errors"
"golang.org/x/oauth2"
"io" "io"
"net/http" "net/http"
"path/filepath" "path/filepath"
@ -112,39 +114,63 @@ func (d *PikPak) login() error {
return nil return nil
} }
//func (d *PikPak) refreshToken() error { func (d *PikPak) refreshToken(refreshToken string) error {
// url := "https://user.mypikpak.com/v1/auth/token" url := "https://user.mypikpak.com/v1/auth/token"
// var e ErrResp var e ErrResp
// res, err := base.RestyClient.SetRetryCount(1).R().SetError(&e). res, err := base.RestyClient.SetRetryCount(1).R().SetError(&e).
// SetHeader("user-agent", "").SetBody(base.Json{ SetHeader("user-agent", "").SetBody(base.Json{
// "client_id": ClientID, "client_id": d.ClientID,
// "client_secret": ClientSecret, "client_secret": d.ClientSecret,
// "grant_type": "refresh_token", "grant_type": "refresh_token",
// "refresh_token": d.RefreshToken, "refresh_token": refreshToken,
// }).SetQueryParam("client_id", ClientID).Post(url) }).SetQueryParam("client_id", d.ClientID).Post(url)
// if err != nil { if err != nil {
// d.Status = err.Error() d.Status = err.Error()
// op.MustSaveDriverStorage(d) op.MustSaveDriverStorage(d)
// return err return err
// } }
// if e.ErrorCode != 0 { if e.ErrorCode != 0 {
// if e.ErrorCode == 4126 { if e.ErrorCode == 4126 {
// // refresh_token invalid, re-login // refresh_token invalid, re-login
// return d.login() return d.login()
// } }
// d.Status = e.Error() d.Status = e.Error()
// op.MustSaveDriverStorage(d) op.MustSaveDriverStorage(d)
// return errors.New(e.Error()) return errors.New(e.Error())
// } }
// data := res.Body() data := res.Body()
// d.Status = "work" d.Status = "work"
// d.RefreshToken = jsoniter.Get(data, "refresh_token").ToString() d.RefreshToken = jsoniter.Get(data, "refresh_token").ToString()
// d.AccessToken = jsoniter.Get(data, "access_token").ToString() d.AccessToken = jsoniter.Get(data, "access_token").ToString()
// d.Common.SetUserID(jsoniter.Get(data, "sub").ToString()) d.Common.SetUserID(jsoniter.Get(data, "sub").ToString())
// d.Addition.RefreshToken = d.RefreshToken d.Addition.RefreshToken = d.RefreshToken
// op.MustSaveDriverStorage(d) op.MustSaveDriverStorage(d)
// return nil return nil
//} }
func (d *PikPak) initializeOAuth2Token(ctx context.Context, oauth2Config *oauth2.Config, refreshToken string) {
d.oauth2Token = oauth2.ReuseTokenSource(nil, utils.TokenSource(func() (*oauth2.Token, error) {
return oauth2Config.TokenSource(ctx, &oauth2.Token{
RefreshToken: refreshToken,
}).Token()
}))
}
func (d *PikPak) refreshTokenByOAuth2() error {
token, err := d.oauth2Token.Token()
if err != nil {
return err
}
d.Status = "work"
d.RefreshToken = token.RefreshToken
d.AccessToken = token.AccessToken
// 获取用户ID
userID := token.Extra("sub").(string)
d.Common.SetUserID(userID)
d.Addition.RefreshToken = d.RefreshToken
op.MustSaveDriverStorage(d)
return nil
}
func (d *PikPak) request(url string, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) { func (d *PikPak) request(url string, method string, callback base.ReqCallback, resp interface{}) ([]byte, error) {
req := base.RestyClient.R() req := base.RestyClient.R()
@ -181,22 +207,19 @@ func (d *PikPak) request(url string, method string, callback base.ReqCallback, r
return res.Body(), nil return res.Body(), nil
case 4122, 4121, 16: case 4122, 4121, 16:
// access_token 过期 // access_token 过期
if d.RefreshTokenMethod == "oauth2" {
//if err1 := d.refreshToken(); err1 != nil { if err1 := d.refreshTokenByOAuth2(); err1 != nil {
// return nil, err1 return nil, err1
//} }
t, err := d.oauth2Token.Token() } else {
if err != nil { if err1 := d.refreshToken(d.RefreshToken); err1 != nil {
return nil, err return nil, err1
}
} }
d.AccessToken = t.AccessToken
d.RefreshToken = t.RefreshToken
d.Addition.RefreshToken = t.RefreshToken
op.MustSaveDriverStorage(d)
return d.request(url, method, callback, resp) return d.request(url, method, callback, resp)
case 9: // 验证码token过期 case 9: // 验证码token过期
if err = d.RefreshCaptchaTokenAtLogin(GetAction(method, url), d.Common.UserID); err != nil { if err = d.RefreshCaptchaTokenAtLogin(GetAction(method, url), d.GetUserID()); err != nil {
return nil, err return nil, err
} }
return d.request(url, method, callback, resp) return d.request(url, method, callback, resp)
@ -337,6 +360,10 @@ func (c *Common) GetDeviceID() string {
return c.DeviceID return c.DeviceID
} }
func (c *Common) GetUserID() string {
return c.UserID
}
// RefreshCaptchaTokenAtLogin 刷新验证码token(登录后) // RefreshCaptchaTokenAtLogin 刷新验证码token(登录后)
func (d *PikPak) RefreshCaptchaTokenAtLogin(action, userID string) error { func (d *PikPak) RefreshCaptchaTokenAtLogin(action, userID string) error {
metas := map[string]string{ metas := map[string]string{