如何通过PHP从视频URL上传视频至YouTube
如何通过PHP从指定视频URL上传视频至YouTube
嘿,我来帮你搞定用PHP从指定URL上传视频到YouTube的事儿,结合你给出的代码片段,我整理了完整的实现步骤和代码,你可以照着来:
前置准备
- 先通过Composer安装Google API的PHP客户端:
composer require google/apiclient:^2.0 - 去Google Cloud控制台创建项目,启用YouTube Data API v3,生成OAuth 2.0凭据(选桌面应用类型),下载JSON文件后命名为
client_secret.json,放到你的项目目录里。
完整实现代码
<?php require __DIR__ . '/vendor/autoload.php'; // 初始化Google客户端 $client = new Google_Client(); $client->setApplicationName('YouTube视频上传工具'); $client->setScopes([Google_Service_YouTube::YOUTUBE_UPLOAD]); $client->setAuthConfig('client_secret.json'); $client->setAccessType('offline'); // 允许离线刷新token $client->setPrompt('select_account consent'); // 强制用户选择账号并授权 // 处理授权逻辑(第一次运行需要手动授权,之后自动用保存的token) $tokenPath = 'token.json'; if (file_exists($tokenPath)) { $accessToken = json_decode(file_get_contents($tokenPath), true); $client->setAccessToken($accessToken); } // 刷新过期的token,或者引导用户重新授权 if ($client->isAccessTokenExpired()) { if ($client->getRefreshToken()) { $client->fetchAccessTokenWithRefreshToken($client->getRefreshToken()); } else { // 生成授权URL,让用户在浏览器打开 $authUrl = $client->createAuthUrl(); printf("请在浏览器打开下面的链接授权:\n%s\n", $authUrl); print "输入授权后的验证码: "; $authCode = trim(fgets(STDIN)); // 用验证码交换access token $accessToken = $client->fetchAccessTokenWithAuthCode($authCode); $client->setAccessToken($accessToken); // 保存token到本地文件,下次直接用 if (!file_exists(dirname($tokenPath))) { mkdir(dirname($tokenPath), 0700, true); } file_put_contents($tokenPath, json_encode($client->getAccessToken())); } } // 初始化YouTube服务 $youtube = new Google_Service_YouTube($client); // 你指定的远程视频URL,先下载到临时文件(YouTube API需要本地文件上传) $videoUrl = "http://test.com/Uploads/UserProfile/test.mp4"; $tempVideoPath = sys_get_temp_dir() . '/temp_youtube_upload.mp4'; // 下载远程视频到临时目录 if (!file_put_contents($tempVideoPath, file_get_contents($videoUrl))) { die("无法下载远程视频,请检查URL是否有效\n"); } // 配置视频的基本信息(Snippet) $snippet = new Google_Service_YouTube_VideoSnippet(); $snippet->setTitle("Test title"); $snippet->setDescription("Test description"); $snippet->setTags(array("tag1", "tag2")); $snippet->setCategoryId("22"); // 22对应「人物与博客」分类,可根据需求修改 // 配置视频状态(隐私设置) $status = new Google_Service_YouTube_VideoStatus(); $status->setPrivacyStatus("public"); // 可选值:public(公开)、private(私有)、unlisted(不公开但可通过链接访问) // 组装视频对象 $video = new Google_Service_YouTube_Video(); $video->setSnippet($snippet); $video->setStatus($status); // 准备分块上传(大视频推荐用分块,避免超时) $chunkSizeBytes = 1 * 1024 * 1024; // 1MB每块 $client->setDefer(true); $insertRequest = $youtube->videos->insert("status,snippet", $video); // 创建媒体上传对象 $media = new Google_Http_MediaFileUpload( $client, $insertRequest, 'video/*', null, true, $chunkSizeBytes ); $media->setFileSize(filesize($tempVideoPath)); // 执行上传逻辑 $uploadStatus = false; $fileHandle = fopen($tempVideoPath, "rb"); while (!$uploadStatus && !feof($fileHandle)) { $chunkData = fread($fileHandle, $chunkSizeBytes); $uploadStatus = $media->nextChunk($chunkData); } fclose($fileHandle); // 上传结果处理 if (isset($uploadStatus['id'])) { echo "视频上传成功!视频ID: " . $uploadStatus['id'] . "\n"; echo "视频链接: https://www.youtube.com/watch?v=" . $uploadStatus['id'] . "\n"; } else { echo "上传失败,未返回有效视频ID\n"; } // 清理临时文件 unlink($tempVideoPath); ?>
关键注意事项
- 授权流程:第一次运行脚本时,会输出一个授权URL,你需要在浏览器打开它,登录你的Google账号(要有YouTube权限),授权后复制验证码回到命令行输入,脚本会自动保存token到
token.json,后续运行无需重复授权。 - 视频下载:因为YouTube的上传API只支持本地文件,所以必须先把远程URL的视频下载到临时目录,上传完成后记得删除临时文件避免占用空间。
- 分类ID:
categoryId的可选值可以参考YouTube官方的分类列表,比如1是「电影与动画」,2是「汽车与车辆」,22是「人物与博客」等。 - 分块上传:如果你的视频比较大(比如超过100MB),建议保持分块上传的设置,避免因网络问题导致上传失败。
内容的提问来源于stack exchange,提问作者Test Updates
相关产品推荐
相关产品推荐

