You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无交互在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:18:12