无需用户授权,通过PHP调用YouTube API上传视频至自有账号
解决方案:使用长期刷新令牌实现服务器自动授权
你需要通过OAuth 2.0刷新令牌实现服务器自动获取有效访问令牌,无需用户交互——毕竟你是操作自己的YouTube账号,而非第三方用户账号。以下是具体步骤和代码示例:
核心原理
上传视频需要写入权限,API Key仅支持只读操作,因此必须用OAuth 2.0。通过获取offline类型授权,你能拿到长期有效的刷新令牌,服务器可自动用它换取新的短期访问令牌(access token),无需手动干预。
步骤1:创建OAuth客户端凭证
- 登录Google Cloud控制台,进入你的项目,找到「API和服务」→「凭据」
- 创建「OAuth客户端ID」,类型选桌面应用(服务器自用,无需用户网页授权)
- 记录生成的
客户端ID和客户端密钥
步骤2:获取刷新令牌
- 构造授权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
- 用浏览器打开该URL,登录你的YouTube账号并授权,得到授权码
- 用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
相关产品推荐
相关产品推荐

