如何无交互在Cron Job中运行带OAuth2.0的YouTube API PHP脚本
解决方案:使用OAuth2.0离线授权实现无交互Cron任务
核心逻辑
YouTube API不支持服务账号,但支持OAuth2.0的离线访问模式——只需一次手动授权获取refresh_token,后续脚本就能用这个令牌自动刷新access_token,完全无需用户交互,适配Cron Job场景。
具体实现步骤
1. 修改授权请求,强制获取refresh_token
在发起OAuth2授权的代码中,必须添加access_type=offline和prompt=consent参数,确保能拿到持久化的refresh_token(如果之前授权过同一应用,需清除账号授权记录或用prompt=consent强制重新授权,才能获取新的refresh token)。
示例授权代码片段:
$client = new Google_Client(); $client->setClientId('你的客户端ID'); $client->setClientSecret('你的客户端密钥'); $client->setRedirectUri('你的回调URL'); $client->addScope('https://www.googleapis.com/auth/youtube.readonly'); // 按需调整权限 // 关键参数:开启离线访问,强制返回refresh_token $client->setAccessType('offline'); $client->setPrompt('consent'); $authUrl = $client->createAuthUrl(); header('Location: ' . filter_var($authUrl, FILTER_SANITIZE_URL));
2. 持久化存储refresh_token
在oauth2callback.php中,用户完成授权后会返回授权码,用它交换access_token和refresh_token,将refresh_token保存到本地文件或数据库(不要每次都重新获取)。
示例回调代码修改:
$client = new Google_Client(); $client->setClientId('你的客户端ID'); $client->setClientSecret('你的客户端密钥'); $client->setRedirectUri('你的回调URL'); $client->addScope('https://www.googleapis.com/auth/youtube.readonly'); if (isset($_GET['code'])) { $token = $client->fetchAccessTokenWithAuthCode($_GET['code']); // 提取并保存refresh_token if (isset($token['refresh_token'])) { // 写入本地文件示例 file_put_contents('youtube_refresh_token.json', json_encode($token)); } // 可在此做一次数据获取测试,之后即可关闭浏览器 }
3. Cron脚本自动刷新access_token
核心业务脚本中,直接读取保存的refresh_token,自动刷新过期的access_token,无需用户交互即可调用API。
示例核心脚本修改:
$client = new Google_Client(); $client->setClientId('你的客户端ID'); $client->setClientSecret('你的客户端密钥'); $client->addScope('https://www.googleapis.com/auth/youtube.readonly'); // 读取保存的refresh token $tokenData = json_decode(file_get_contents('youtube_refresh_token.json'), true); $client->setAccessToken($tokenData); // 自动刷新过期的access token if ($client->isAccessTokenExpired()) { if ($client->getRefreshToken()) { $newToken = $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); // 更新保存的token(refresh token可能会变更,建议每次刷新后重新保存) file_put_contents('youtube_refresh_token.json', json_encode($newToken)); $client->setAccessToken($newToken); } else { die('缺少refresh token,请重新手动授权'); } } // 正常调用YouTube API获取数据(含未公开视频) $youtube = new Google_Service_YouTube($client); $response = $youtube->channels->listChannels('contentDetails', ['mine' => true]); // 处理返回数据...
4. 注意事项
- 确保申请的OAuth2权限足够:比如
youtube.readonly可读取当前授权账号的所有视频(包括未公开内容)。 - 敏感信息(客户端密钥、refresh token)不要硬编码,建议用环境变量或加密配置文件管理。
- Cron任务配置示例:
# 每天凌晨1点执行脚本 0 1 * * * /usr/bin/php /path/to/your/youtube_cron_script.php
内容的提问来源于stack exchange,提问作者aiman mehtab
相关产品推荐
相关产品推荐

