diff --git a/internal/command/utils.go b/internal/command/utils.go index c6846cc..ae31282 100644 --- a/internal/command/utils.go +++ b/internal/command/utils.go @@ -122,7 +122,7 @@ func RefreshTokenInNeed(activeUser *config.PanUser) bool { cz := time.FixedZone("CST", 8*3600) // 东8区 expiredTime, _ := time.ParseInLocation("2006-01-02 15:04:05", activeUser.WebToken.ExpireTime, cz) now := time.Now() - if (expiredTime.Unix() - now.Unix()) <= (10 * 60) { // 10min + if (expiredTime.Unix() - now.Unix()) <= (20 * 60) { // 20min // need update refresh token logger.Verboseln("access token expired, get new from refresh token") if wt, er := aliyunpan.GetAccessTokenFromRefreshToken(activeUser.RefreshToken); er == nil { @@ -136,3 +136,28 @@ func RefreshTokenInNeed(activeUser *config.PanUser) bool { } return false } + +// ReloadRefreshTokenInNeed 从配置文件加载最新token +func ReloadRefreshTokenInNeed(activeUser *config.PanUser) bool { + if activeUser == nil { + return false + } + + // refresh expired token + if activeUser.PanClient() != nil { + if len(activeUser.WebToken.RefreshToken) > 0 { + cz := time.FixedZone("CST", 8*3600) // 东8区 + expiredTime, _ := time.ParseInLocation("2006-01-02 15:04:05", activeUser.WebToken.ExpireTime, cz) + now := time.Now() + if (expiredTime.Unix() - now.Unix()) <= (10 * 60) { // 10min + // reload refresh token from config file + u := config.Config.ActiveUser() + activeUser.WebToken = u.WebToken + activeUser.PanClient().UpdateToken(u.WebToken) + logger.Verboseln("reload access token from config file") + return true + } + } + } + return false +} diff --git a/internal/command/webdav.go b/internal/command/webdav.go index 451a429..e7e6cf9 100644 --- a/internal/command/webdav.go +++ b/internal/command/webdav.go @@ -18,8 +18,10 @@ import ( "github.com/tickstep/aliyunpan/cmder" "github.com/tickstep/aliyunpan/internal/config" "github.com/tickstep/aliyunpan/internal/webdav" + "github.com/tickstep/library-go/logger" "github.com/urfave/cli" "strings" + "time" ) func CmdWebdav() cli.Command { @@ -69,6 +71,17 @@ aliyunpan webdav start -h fmt.Println("未登录账号,请先登录") return nil } + activeUser := GetActiveUser() + go func() { + for { + time.Sleep(time.Duration(1) * time.Minute) + //time.Sleep(time.Duration(5) * time.Second) + if ReloadRefreshTokenInNeed(activeUser) { + logger.Verboseln("reload new access token for webdav") + } + } + }() + webdavServ := &webdav.WebdavConfig{ PanDriveId: "", PanUserId: "", @@ -87,8 +100,7 @@ aliyunpan webdav start -h } // pan user - panUserId := config.Config.ActiveUID - activeUser := GetActiveUser() + panUserId := activeUser.UserId webdavServ.PanUserId = panUserId webdavServ.PanUser = activeUser diff --git a/main.go b/main.go index 32cc8c9..7b258aa 100644 --- a/main.go +++ b/main.go @@ -81,7 +81,7 @@ func checkLoginExpiredAndRelogin() { // maybe expired, try to login cmder.TryLogin() } else { - // refresh expired token + // 刷新过期Token并保存到配置文件 command.RefreshTokenInNeed(activeUser) } cmder.SaveConfigFunc(nil) @@ -96,6 +96,7 @@ func main() { // check token expired task go func() { for { + // Token刷新进程,不管是CLI命令行模式,还是直接命令模式,本刷新任务都会执行 time.Sleep(time.Duration(5) * time.Minute) //time.Sleep(time.Duration(5) * time.Second) checkLoginExpiredAndRelogin()