如何用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
相关产品推荐
相关产品推荐

