YouTube视频上传Bot授权问题:如何无需手动登录获取持久Access Token?
解决YouTube上传Bot的自动授权问题
核心方案
要摆脱手动重复登录的困境,关键是获取长期有效的Refresh Token,通过它自动刷新短期的Access Token,实现Bot的无人值守运行。
步骤1:获取包含Refresh Token的初始凭据
你需要先手动完成一次授权流程,拿到带Refresh Token的完整凭据:
- 为Google_Client配置YouTube上传所需的权限范围(
https://www.googleapis.com/auth/youtube.upload) - 开启离线访问模式(
setAccessType('offline')),这是获取Refresh Token的必要设置 - 生成授权URL,手动登录账户获取授权码,再用授权码交换出包含Access Token和Refresh Token的JSON凭据
示例代码:
$client = new Google_Client(); $client->setClientId(YOUTUBE_CLIENT_ID); $client->setClientSecret(YOUTUBE_CLIENT_SECRET); $client->setScopes(['https://www.googleapis.com/auth/youtube.upload']); $client->setAccessType('offline'); // 必须开启才能拿到Refresh Token $client->setPrompt('consent'); // 确保首次授权返回Refresh Token // 生成授权URL,复制到浏览器完成登录授权 $authUrl = $client->createAuthUrl(); echo "请访问此URL授权: $authUrl\n"; // 输入从浏览器获取的授权码,交换凭据 $authCode = '你拿到的授权码'; $token = $client->fetchAccessTokenWithAuthCode($authCode); // 将凭据保存到本地文件,后续Bot直接读取 file_put_contents('youtube-token.json', json_encode($token));
步骤2:自动刷新Access Token
后续Bot启动时,加载保存的凭据,Google_Client会自动处理Token过期问题:
$client = new Google_Client(); $client->setClientId(YOUTUBE_CLIENT_ID); $client->setClientSecret(YOUTUBE_CLIENT_SECRET); $client->setScopes(['https://www.googleapis.com/auth/youtube.upload']); // 加载本地保存的凭据 $token = json_decode(file_get_contents('youtube-token.json'), true); $client->setAccessToken($token); // 检查Token是否过期,自动刷新 if ($client->isAccessTokenExpired()) { if ($client->getRefreshToken()) { // 用Refresh Token获取新的Access Token $newToken = $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); // 更新本地保存的凭据 $token = array_merge($token, $newToken); file_put_contents('youtube-token.json', json_encode($token)); $client->setAccessToken($token); } else { die('无有效Refresh Token,请重新完成授权'); } } // 现在可以正常调用API上传视频了
关键注意事项
- 首次授权时,确保Google账户允许应用的离线访问权限
- 保存凭据的
youtube-token.json要做好权限保护,避免泄露 - 若长期未使用,Refresh Token可能失效,需重新执行一次授权流程
内容的提问来源于stack exchange,提问作者Ahmed
相关产品推荐
相关产品推荐

