diff --git a/function/common.php b/function/common.php
index 4e22b69..bfc27fe 100644
--- a/function/common.php
+++ b/function/common.php
@@ -17,9 +17,6 @@ function savecache($key, $value, $exp = 3300)
 function getconstStr($str)
 {
     global $constStr;
-    $constStr['language'] = $_COOKIE['language'];
-    if ($constStr['language']=='') $constStr['language'] = getConfig('language');
-    if ($constStr['language']=='') $constStr['language'] = 'en-us';
     if ($constStr[$str][$constStr['language']]!='') return $constStr[$str][$constStr['language']];
     return $constStr[$str]['en-us'];
 }
@@ -353,7 +350,11 @@ function bigfileupload($path)
 function main($path)
 {
     global $exts;
+    global $constStr;
     config_oauth();
+    $constStr['language'] = $_COOKIE['language'];
+    if ($constStr['language']=='') $constStr['language'] = getConfig('language');
+    if ($constStr['language']=='') $constStr['language'] = 'en-us';
     $_SERVER['list_path'] = getListpath($_SERVER['HTTP_HOST']);
     if ($_SERVER['list_path']=='') $_SERVER['list_path'] = '/';
     $_SERVER['is_guestup_path'] = is_guestup_path($path);
@@ -364,6 +365,19 @@ function main($path)
     $refresh_token = getConfig('refresh_token');
     if (!$refresh_token) return get_refresh_token();
 
+    if (!($_SERVER['access_token'] = getcache('access_token'))) {
+        $response = curl_request( $_SERVER['oauth_url'] . 'token', 'client_id='. $_SERVER['client_id'] .'&client_secret='. $_SERVER['client_secret'] .'&grant_type=refresh_token&requested_token_use=on_behalf_of&refresh_token=' . $refresh_token );
+        if ($response['stat']==200) $ret = json_decode($response['body'], true);
+        if (!isset($ret['access_token'])) {
+            error_log('failed to get access_token. response' . json_encode($ret));
+            throw new Exception($response['stat'].'failed to get access_token.'.$response['body']);
+        }
+        error_log('Get access token:'.json_encode($ret, JSON_PRETTY_PRINT));
+        $_SERVER['access_token'] = $ret['access_token'];
+        savecache('access_token', $_SERVER['access_token']);
+        if (time()>getConfig('token_expires')) setConfig([ 'refresh_token' => $ret['refresh_token'], 'token_expires' => time()+30*24*60*60 ]);
+    }
+
     if (getConfig('adminloginpage')=='') {
         $adminloginpage = 'admin';
     } else {
@@ -400,19 +414,6 @@ function main($path)
         }
     $_SERVER['retry'] = 0;
 
-    if (!($_SERVER['access_token'] = getcache('access_token'))) {
-        $ret = json_decode(curl_request(
-            $_SERVER['oauth_url'] . 'token',
-            'client_id='. $_SERVER['client_id'] .'&client_secret='. $_SERVER['client_secret'] .'&grant_type=refresh_token&requested_token_use=on_behalf_of&refresh_token=' . $refresh_token
-        )['body'], true);
-        if (!isset($ret['access_token'])) {
-            error_log('failed to get access_token. response' . json_encode($ret));
-            throw new Exception('failed to get access_token.');
-        }
-        $_SERVER['access_token'] = $ret['access_token'];
-        savecache('access_token', $_SERVER['access_token']);
-    }
-
     if ($_SERVER['ajax']) {
         if ($_GET['action']=='del_upload_cache'&&substr($_GET['filename'],-4)=='.tmp') {
             // del '.tmp' without login. 无需登录即可删除.tmp后缀文件
diff --git a/function/heroku.php b/function/heroku.php
index 552f6de..449204e 100644
--- a/function/heroku.php
+++ b/function/heroku.php
@@ -66,7 +66,7 @@ function get_refresh_token()
             }
             document.cookie=\'language=; path=/\';
         ';
-            setConfig([ 'refresh_token' => $tmptoken ]);
+            setConfig([ 'refresh_token' => $tmptoken, 'token_expires' => time()+30*24*60*60 ]);
             savecache('access_token', $ret['access_token'], $ret['expires_in'] - 60);
             $str .= '
             ';
diff --git a/function/normal.php b/function/normal.php
index 42a3a83..cc57894 100644
--- a/function/normal.php
+++ b/function/normal.php
@@ -65,7 +65,7 @@ function get_refresh_token()
             }
             document.cookie=\'language=; path=/\';
         ';
-            setConfig([ 'refresh_token' => $tmptoken ]);
+            setConfig([ 'refresh_token' => $tmptoken, 'token_expires' => time()+30*24*60*60 ]);
             savecache('access_token', $ret['access_token'], $ret['expires_in'] - 60);
             $str .= '
             ';
diff --git a/function/scf.php b/function/scf.php
index 3d9d09c..3d8cc51 100644
--- a/function/scf.php
+++ b/function/scf.php
@@ -23,6 +23,7 @@ function GetGlobalVariable($event)
         $pos = strpos($cookievalues,"=");
         $_COOKIE[urldecode(substr($cookievalues,0,$pos))]=urldecode(substr($cookievalues,$pos+1));
     }
+    $_SERVER['USER'] = 'qcloud';
 }
 
 function GetPathSetting($event, $context)
@@ -100,7 +101,7 @@ function get_refresh_token()
             }
             document.cookie=\'language=; path=/\';
         ';
-            setConfig([ 'refresh_token' => $tmptoken ]);
+            setConfig([ 'refresh_token' => $tmptoken, 'token_expires' => time()+30*24*60*60 ]);
             savecache('access_token', $ret['access_token'], $ret['expires_in'] - 60);
             $trynum = 0;
             while( json_decode(getfunctioninfo($_SERVER['function_name'], $_SERVER['Region'], $_SERVER['namespace'], getConfig('SecretId'), getConfig('SecretKey')),true)['Response']['Status']!='Active' ) echo '
diff --git a/theme/classic.php b/theme/classic.php
index b822682..0440827 100644
--- a/theme/classic.php
+++ b/theme/classic.php
@@ -55,17 +55,17 @@
 
-    
+