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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:21:43