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

无需用户授权,通过PHP调用YouTube API上传视频至自有账号

解决方案:使用长期刷新令牌实现服务器自动授权

你需要通过OAuth 2.0刷新令牌实现服务器自动获取有效访问令牌,无需用户交互——毕竟你是操作自己的YouTube账号,而非第三方用户账号。以下是具体步骤和代码示例:

核心原理

上传视频需要写入权限,API Key仅支持只读操作,因此必须用OAuth 2.0。通过获取offline类型授权,你能拿到长期有效的刷新令牌,服务器可自动用它换取新的短期访问令牌(access token),无需手动干预。

步骤1:创建OAuth客户端凭证

  1. 登录Google Cloud控制台,进入你的项目,找到「API和服务」→「凭据」
  2. 创建「OAuth客户端ID」,类型选桌面应用(服务器自用,无需用户网页授权)
  3. 记录生成的客户端ID和客户端密钥

步骤2:获取刷新令牌

  1. 构造授权URL,替换YOUR_CLIENT_ID:
https://accounts.google.com/o/oauth2/v2/auth?client_id=YOUR_CLIENT_ID&redirect_uri=urn:ietf:wg:oauth:2.0:oob&scope=https://www.googleapis.com/auth/youtube.upload&access_type=offline&prompt=consent
  1. 用浏览器打开该URL,登录你的YouTube账号并授权,得到授权码
  2. 用PHP发送POST请求换取令牌:
$clientId = 'YOUR_CLIENT_ID';
$clientSecret = 'YOUR_CLIENT_SECRET';
$authorizationCode = '你拿到的授权码';

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://oauth2.googleapis.com/token');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
    'code' => $authorizationCode,
    'client_id' => $clientId,
    'client_secret' => $clientSecret,
    'redirect_uri' => 'urn:ietf:wg:oauth:2.0:oob',
    'grant_type' => 'authorization_code'
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

$tokens = json_decode($response, true);
// 将$tokens['refresh_token']保存到服务器安全存储(如数据库、环境变量)

执行后会得到包含refresh_token的响应,这个令牌长期有效(除非你主动撤销授权或更改账号密码),务必妥善保存。

步骤3:PHP上传视频时自动刷新令牌

使用Google Client库处理令牌刷新逻辑,示例代码:

require __DIR__ . '/vendor/autoload.php';

$client = new Google\Client();
$client->setClientId('YOUR_CLIENT_ID');
$client->setClientSecret('YOUR_CLIENT_SECRET');
// 加载保存的刷新令牌
$client->setRefreshToken('你存储的refresh_token');
$client->addScope('https://www.googleapis.com/auth/youtube.upload');

// 自动刷新过期的access token
if ($client->isAccessTokenExpired()) {
    $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
    // 可选:若刷新令牌更新,重新保存新的refresh_token
    $newTokens = $client->getAccessToken();
    if (isset($newTokens['refresh_token'])) {
        // 更新存储的refresh_token
    }
}

// 初始化YouTube服务
$youtube = new Google\Service\YouTube($client);

// 构建视频信息
$video = new Google\Service\YouTube\Video();
$videoSnippet = new Google\Service\YouTube\VideoSnippet();
$videoSnippet->setTitle('测试自动上传视频');
$videoSnippet->setDescription('通过PHP服务器自动上传的视频');
$videoSnippet->setTags(['测试', 'YouTube API']);
$videoSnippet->setCategoryId('22'); // 分类ID,22代表人物与博客,可按需修改
$video->setSnippet($videoSnippet);

$status = new Google\Service\YouTube\VideoStatus();
$status->setPrivacyStatus('private'); // 可选:public(公开)、private(私有)、unlisted(不公开)
$video->setStatus($status);

// 上传视频文件
$media = new Google\Http\MediaFileUpload(
    $client,
    $youtube->videos->insert('snippet,status', $video),
    'video/*',
    file_get_contents('path/to/your/video.mp4')
);
$media->setChunkSize(Google\Http\MediaFileUpload::DEFAULT_CHUNK_SIZE);

$uploadStatus = false;
$handle = fopen('path/to/your/video.mp4', 'rb');
while (!$uploadStatus && !feof($handle)) {
    $chunk = fread($handle, $media->getChunkSize());
    $uploadStatus = $media->nextChunk($chunk);
}

fclose($handle);

// 输出上传结果
echo '视频上传成功,ID:' . $uploadStatus['id'];

注意事项

  • 确保服务器能访问Google的OAuth和API服务,避免被防火墙或代理拦截
  • 刷新令牌需妥善保管,泄露后他人可操作你的YouTube账号
  • 若刷新令牌失效,重新执行步骤2获取新令牌

内容的提问来源于stack exchange,提问作者Anthony

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:00:11