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

如何用PHP通过YouTube Data API v3实现后台无交互上传YouTube视频?

关于PHP+YouTube Data API v3无交互后台上传的实现说明

需求可实现,核心逻辑是使用OAuth 2.0离线访问凭证

官方默认示例采用的是OAuth 2.0授权码流程,面向前端用户授权场景,所以内置了跳转登录逻辑。你只需要调整授权流程拿到长期有效的刷新令牌(refresh token),后续后台上传时直接用刷新令牌换取短期有效的访问令牌(access token)即可,全程不需要任何用户交互。


具体实现步骤

  • 第一步:在Google Cloud控制台创建项目,启用YouTube Data API v3,创建OAuth 2.0桌面应用凭证(不要选择Web应用类型,Web应用的刷新令牌有效期存在限制,桌面应用的刷新令牌只要用户不主动撤销就长期有效)
  • 第二步:首次手动走一次授权流程,申请https://www.googleapis.com/auth/youtube.upload权限,拿到授权码后兑换得到access token和refresh token,将refresh token保存在后台服务的加密配置中
  • 第三步:后台上传逻辑中,每次上传前先用保存的refresh token请求OAuth接口换取新的access token(access token有效期仅1小时,刷新操作完全无用户交互),再用有效access token调用YouTube Data API的上传接口即可
  • 注意:用于授权的Google账号需要先完成YouTube频道创建,否则会触发无权限报错

核心代码参考(PHP)

首先安装Google官方PHP客户端库:
composer require google/apiclient:^2.0

简化上传逻辑示例:

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

// 初始化客户端
$client = new Google\Client();
$client->setClientId('你的OAuth客户端ID');
$client->setClientSecret('你的OAuth客户端密钥');
$client->refreshToken('你提前获取的refresh_token');
$client->addScope('https://www.googleapis.com/auth/youtube.upload');

// 自动刷新获取有效access token
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
$youtube = new Google\Service\YouTube($client);

// 构造视频基础信息
$video = new Google\Service\YouTube\Video();
$snippet = new Google\Service\YouTube\VideoSnippet();
$snippet->setTitle('自动上传测试视频');
$snippet->setDescription('后台无交互上传测试内容');
$snippet->setTags(['自动上传', '测试']);
$snippet->setCategoryId('22'); // 对应People & Blogs分类,可根据需求调整
$video->setSnippet($snippet);

// 设置视频隐私状态
$status = new Google\Service\YouTube\VideoStatus();
$status->setPrivacyStatus('unlisted'); // 可选值public/private/unlisted
$video->setStatus($status);

// 分片上传视频文件
$chunkSizeBytes = 1 * 1024 * 1024; // 分片大小1MB,可自行调整
$client->setDefer(true);
$insertRequest = $youtube->videos->insert('snippet,status', $video, array('uploadType' => 'resumable'));

$media = new Google\Http\MediaFileUpload(
    $client,
    $insertRequest,
    'video/*',
    null,
    true,
    $chunkSizeBytes
);
$videoPath = '你的本地视频文件路径.mp4';
$media->setFileSize(filesize($videoPath));

$uploadStatus = false;
$handle = fopen($videoPath, 'rb');
while (!$uploadStatus && !feof($handle)) {
    $chunk = fread($handle, $chunkSizeBytes);
    $uploadStatus = $media->nextChunk($chunk);
}
fclose($handle);
$client->setDefer(false);

echo '上传完成,视频ID:' . $uploadStatus['id'];
?>

注意事项

  • refresh token属于敏感信息,不要硬编码在代码中,建议存储在环境变量或者加密的配置文件内,避免泄露
  • 单个Google账号的刷新令牌数量有上限,不要重复生成大量无效refresh token,超出上限后旧令牌会被自动回收
  • 如果用于授权的Google账号开启了两步验证,仅首次获取refresh token的时候需要完成身份验证,后续刷新令牌和上传操作都不需要二次验证

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:18:05