使用 youtube API 和 Google Apps 脚本
using youtube API with Google Apps Scripts
我无法测试我的脚本。
如果您可以在此处帮助处理代码 - 它无法正常工作
根据文档 - https://developers.google.com/youtube/v3/docs/videos/insert
if (serviceYT.hasAccess()) {
url = 'https://youtube.googleapis.com/youtube/v3/videos?part=snippet%2CcontentDetails%2Cstatistics&mine=true&key='+ API_KEY;
var data;
data = '{"snippet":{"title":"testtitle","description":"testdes","categoryId":"19","tags":["asdf","sadfds"]},"status":{"privacyStatus":"public"}}';
var options = {
'headers': {
'Authorization': 'Bearer ' + serviceYT.getAccessToken()
,'Accept': 'application/json'
},
'contentType': 'application/json',
'method' : 'POST',
'payload' : data,
'muteHttpExceptions' : true
};
//execute and handle the response
var response = UrlFetchApp.fetch(url, options);
var responseCode = response.getResponseCode();
var result = JSON.parse(response.getContentText());
Logger.log(result);
}
我的问题-
- 将视频放在哪里?
- 解决我遇到的错误:
{error={message='status', code=400.0, errors=[{reason=unexpectedPart, domain=youtube.part, message='status', location=part, locationType =参数}]}}
一个 youtube object(基本上是一个空视频)已成功添加到可以通过工作室看到的 youtube。它是一个空视频,但标题、描述、状态等...其他设置正确。
关于如何添加媒体或视频有什么想法吗??
视频 blob 必须添加到负载中的什么位置?
我无法在文档中找到它。
https://developers.google.com/youtube/v3/docs/videos/insert
我相信你的目标如下。
- 您想将包含标题、说明等的电影文件上传到您的 YouTube 频道。
- 电影文件已放入您的 Google 驱动器中。
- 您想通过使用
UrlFetchApp
直接向端点请求来实现此目的。
在这种情况下,下面的修改脚本怎么样?
修改后的脚本:
在使用此脚本之前,请启用 YouTube 数据 API v3 并添加 https://www.googleapis.com/auth/youtube
的范围。并且请将您 Google 驱动器中的电影文件的文件 ID 设置为 const fileId = "###";
。
serviceYT.getAccessToken()
来自您的脚本。
function myFunction() {
const fileId = "###"; // Please set the file ID of movie file on the Google Drive.
const metadata = {
"snippet": { "title": "testtitle", "description": "testdes", "categoryId": "19", "tags": ["asdf", "sadfds"] },
"status": { "privacyStatus": "public" }
};
const url = 'https://www.googleapis.com/upload/youtube/v3/videos?part=snippet%2Cstatus';
const file = DriveApp.getFileById(fileId);
const boundary = "xxxxxxxxxx";
let data = "--" + boundary + "\r\n";
data += "Content-Type: application/json; charset=UTF-8\r\n\r\n";
data += JSON.stringify(metadata) + "\r\n";
data += "--" + boundary + "\r\n";
data += "Content-Type: " + file.getMimeType() + "\r\n\r\n";
const payload = Utilities.newBlob(data).getBytes().concat(file.getBlob().getBytes()).concat(Utilities.newBlob("\r\n--" + boundary + "--").getBytes());
const options = {
method: "post",
contentType: "multipart/form-data; boundary=" + boundary,
payload: payload,
headers: { 'Authorization': 'Bearer ' + serviceYT.getAccessToken() },
muteHttpExceptions: true,
};
const res = UrlFetchApp.fetch(url, options).getContentText();
console.log(res);
}
在您的脚本中,您正在使用 url = 'https://youtube.googleapis.com/youtube/v3/videos?part=snippet%2CcontentDetails%2Cstatistics&mine=true&key='+ API_KEY;
的端点。您的 data
具有 snippet
和 status
的属性。在这种情况下,需要使用https://www.googleapis.com/upload/youtube/v3/videos?part=snippet%2Cstatus
.
的端点
要上传电影文件,需要用multipart/form-data
请求。
当此脚本为 运行 时,Google 驱动器上的电影文件被上传到 YouTube。
注:
现阶段即使使用"privacyStatus": "public"
,上传的视频也不是public。关于这个,大家可以在官方文档中看到,如下。 Ref
All videos uploaded via the videos.insert endpoint from unverified API projects created after 28 July 2020 will be restricted to private viewing mode. To lift this restriction, each API project must undergo an audit to verify compliance with the Terms of Service. Please see the API Revision History for more details.
当您使用 YouTube API 高级 Google 服务时,您可以使用以下简单脚本。 Ref
function myFunction2() {
const fileId = "###"; // Please set the file ID of movie file on the Google Drive.
const res = YouTube.Videos.insert({
"snippet": { "title": "testtitle", "description": "testdes", "categoryId": "19", "tags": ["asdf", "sadfds"] },
"status": { "privacyStatus": "public" }
}, ["snippet", "status"], DriveApp.getFileById(fileId).getBlob());
console.log(res);
}
参考文献:
我无法测试我的脚本。 如果您可以在此处帮助处理代码 - 它无法正常工作 根据文档 - https://developers.google.com/youtube/v3/docs/videos/insert
if (serviceYT.hasAccess()) {
url = 'https://youtube.googleapis.com/youtube/v3/videos?part=snippet%2CcontentDetails%2Cstatistics&mine=true&key='+ API_KEY;
var data;
data = '{"snippet":{"title":"testtitle","description":"testdes","categoryId":"19","tags":["asdf","sadfds"]},"status":{"privacyStatus":"public"}}';
var options = {
'headers': {
'Authorization': 'Bearer ' + serviceYT.getAccessToken()
,'Accept': 'application/json'
},
'contentType': 'application/json',
'method' : 'POST',
'payload' : data,
'muteHttpExceptions' : true
};
//execute and handle the response
var response = UrlFetchApp.fetch(url, options);
var responseCode = response.getResponseCode();
var result = JSON.parse(response.getContentText());
Logger.log(result);
}
我的问题-
- 将视频放在哪里?
- 解决我遇到的错误:
{error={message='status', code=400.0, errors=[{reason=unexpectedPart, domain=youtube.part, message='status', location=part, locationType =参数}]}}
一个 youtube object(基本上是一个空视频)已成功添加到可以通过工作室看到的 youtube。它是一个空视频,但标题、描述、状态等...其他设置正确。
关于如何添加媒体或视频有什么想法吗?? 视频 blob 必须添加到负载中的什么位置?
我无法在文档中找到它。 https://developers.google.com/youtube/v3/docs/videos/insert
我相信你的目标如下。
- 您想将包含标题、说明等的电影文件上传到您的 YouTube 频道。
- 电影文件已放入您的 Google 驱动器中。
- 您想通过使用
UrlFetchApp
直接向端点请求来实现此目的。
在这种情况下,下面的修改脚本怎么样?
修改后的脚本:
在使用此脚本之前,请启用 YouTube 数据 API v3 并添加 https://www.googleapis.com/auth/youtube
的范围。并且请将您 Google 驱动器中的电影文件的文件 ID 设置为 const fileId = "###";
。
serviceYT.getAccessToken()
来自您的脚本。
function myFunction() {
const fileId = "###"; // Please set the file ID of movie file on the Google Drive.
const metadata = {
"snippet": { "title": "testtitle", "description": "testdes", "categoryId": "19", "tags": ["asdf", "sadfds"] },
"status": { "privacyStatus": "public" }
};
const url = 'https://www.googleapis.com/upload/youtube/v3/videos?part=snippet%2Cstatus';
const file = DriveApp.getFileById(fileId);
const boundary = "xxxxxxxxxx";
let data = "--" + boundary + "\r\n";
data += "Content-Type: application/json; charset=UTF-8\r\n\r\n";
data += JSON.stringify(metadata) + "\r\n";
data += "--" + boundary + "\r\n";
data += "Content-Type: " + file.getMimeType() + "\r\n\r\n";
const payload = Utilities.newBlob(data).getBytes().concat(file.getBlob().getBytes()).concat(Utilities.newBlob("\r\n--" + boundary + "--").getBytes());
const options = {
method: "post",
contentType: "multipart/form-data; boundary=" + boundary,
payload: payload,
headers: { 'Authorization': 'Bearer ' + serviceYT.getAccessToken() },
muteHttpExceptions: true,
};
const res = UrlFetchApp.fetch(url, options).getContentText();
console.log(res);
}
在您的脚本中,您正在使用
的端点url = 'https://youtube.googleapis.com/youtube/v3/videos?part=snippet%2CcontentDetails%2Cstatistics&mine=true&key='+ API_KEY;
的端点。您的data
具有snippet
和status
的属性。在这种情况下,需要使用https://www.googleapis.com/upload/youtube/v3/videos?part=snippet%2Cstatus
.要上传电影文件,需要用
multipart/form-data
请求。当此脚本为 运行 时,Google 驱动器上的电影文件被上传到 YouTube。
注:
现阶段即使使用
"privacyStatus": "public"
,上传的视频也不是public。关于这个,大家可以在官方文档中看到,如下。 RefAll videos uploaded via the videos.insert endpoint from unverified API projects created after 28 July 2020 will be restricted to private viewing mode. To lift this restriction, each API project must undergo an audit to verify compliance with the Terms of Service. Please see the API Revision History for more details.
当您使用 YouTube API 高级 Google 服务时,您可以使用以下简单脚本。 Ref
function myFunction2() { const fileId = "###"; // Please set the file ID of movie file on the Google Drive. const res = YouTube.Videos.insert({ "snippet": { "title": "testtitle", "description": "testdes", "categoryId": "19", "tags": ["asdf", "sadfds"] }, "status": { "privacyStatus": "public" } }, ["snippet", "status"], DriveApp.getFileById(fileId).getBlob()); console.log(res); }