Javascript 更新默认广播';通过YouTube API下载流标题
使用下面的链接,可以轻松更新Javascript 更新默认广播';通过YouTube API下载流标题,javascript,json,google-apps-script,youtube-data-api,google-apps-script-api,Javascript,Json,Google Apps Script,Youtube Data Api,Google Apps Script Api,使用下面的链接,可以轻松更新标题: https://developers.google.com/youtube/v3/live/docs/liveStreams/update?apix=true 我希望在GoogleApps脚本中使用YouTube API实现同样的功能。下面的代码工作成功,但不是更新它,而是创建一个新的流 区别在于上面的链接不需要scheduledStartTime。但是API需要它。当给出scheduledStartTime时,它会创建一个新广播,而不是更新原始广播。如果分配
标题
:
https://developers.google.com/youtube/v3/live/docs/liveStreams/update?apix=true
我希望在GoogleApps脚本中使用YouTube API实现同样的功能。下面的代码工作成功,但不是更新它,而是创建一个新的流
区别在于上面的链接不需要scheduledStartTime
。但是API需要它。当给出scheduledStartTime
时,它会创建一个新广播,而不是更新原始广播。如果分配了scheduledStartTime
,1970-01-01T00:00:00Z
,它的作用就好像没有考虑scheduledStartTime
一样
要分配的值,以便它更新默认广播流,而不是更新一个。
或者我还缺少什么来完成更新过程
这是我的密码:
Logger.log('Starting');
service = getService();
if (service.hasAccess()) {
//Fetch the LiveBroadcast Title and Description Details
var url = "https://www.googleapis.com/youtube/v3/liveBroadcasts?broadcastStatus=upcoming&broadcastType=all";
var parameters = {'headers' : {'Content-Type': 'application/json', 'Authorization': 'Bearer ' + service.getAccessToken()}};
var response = UrlFetchApp.fetch(url,parameters);
var result = JSON.parse(response.getContentText());
//Logger.log(result);
var resource = result.items[0];
//Edit the LiveBroadcast Title and Description Details scheduledStartTime
var title = "as per today";
var description = "new desc check";
var scheduledStartTime ='1970-01-01T00:00:00Z';
var privacyStatus = 'public';
//var privacyStatus = 'unlisted';
//var scheduledStartTime = '2020-10-26T04:08:00Z';
data = {
'id' : 'MDaEvnSioI',
'status' : { 'privacyStatus' : 'public' , 'selfDeclaredMadeForKids' : false},
'snippet' : { 'title' : title , 'description' : description , 'scheduledStartTime' : scheduledStartTime }
};
//Update the LiveBroadcast
Logger.log("--");
var jsondata = JSON.stringify(data);
Logger.log(jsondata);
var options = {
'headers': {
'Authorization': 'Bearer ' + service.getAccessToken()
},
'contentType': 'application/json',
'method' : 'post',
'payload': jsondata,
'muteHttpExceptions':true
};
var response = UrlFetchApp.fetch(url2, options);
Logger.log(response.getContentText());
Logger.log('service has access...!!');
如果您只需要更新广播的
标题
和说明
属性,那么根据官方文档,您只需使用API端点即可:
(字符串)广播的标题。请注意,广播仅代表一个YouTube视频。您可以通过修改广播资源或设置相应视频资源的字段来设置此字段 (字符串)
广播的描述。与
标题
一样,您可以通过修改广播资源或设置相应视频资源的字段来设置此字段
为了实现这一点,请按如下方式修改代码:
// First step: obtain the video's 'categoryId'
var url = "https://www.googleapis.com/youtube/v3/videos?part=id,snippet&fields=items/snippet/categoryId&id=MDaEvnSioI";
var options = {
'headers': {
'Authorization': 'Bearer ' + service.getAccessToken()
}
};
var response = UrlFetchApp.fetch(url, options);
var result = JSON.parse(response.getContentText());
var categoryId = result.items[0].snippet.categoryId;
// Second step: update the video's 'title' and 'description',
// using its 'categoryId' obtained above
var url2 = "https://www.googleapis.com/youtube/v3/videos?part=id,snippet";
var data2 = {
'id': 'MDaEvnSioI',
'snippet': {
'title': title,
'description': description,
'categoryId': categoryId
}
};
var options2 = {
'headers': {
'Authorization': 'Bearer ' + service.getAccessToken()
},
'contentType': 'application/json',
'payload': JSON.stringify(data2),
'method': 'put'
};
var response2 = UrlFetchApp.fetch(url2, options2);
请注意,更新视频的标题
和描述
是一个分两步的过程,因为根据官方文档,在调用视频时。在视频的片段
对象上更新
端点,该视频的属性也会更新到端点
因此,首先使用API端点查询视频的当前categoryId
属性,然后调用Videos.update
还要注意,上面的代码被简化了很多,因为它不处理这些API调用可能返回的错误
关于您的问题(报价): […]当scheduledStartTime给定时,它会创建一个新广播,而不是更新原始广播 请确认在URL上调用API:
https://www.googleapis.com/youtube/v3/liveBroadcasts
正如您对代码所做的那样,您实际上是在调用API端点,而不是您实际期望的
这是因为这两个API端点具有相同的URL;区别这两种方法的是HTTP方法,它调用每种方法:前者调用POST
,后者调用PUT
由于您对的第二次调用明确指定了
方法为POST
,因此您实际上是在调用LiveBroadcasts.insert
端点,而不是LiveBroadcasts.update
太好了,您提到的解决方案成功了!认可的。。。❤我有一个相关的问题。。。youtube中的令牌将在1小时(3600秒)后过期,我需要每天运行此脚本两次。如何在运行脚本之前自动获取新令牌?为了具体回答您的问题,我需要查看函数getService
。在任何情况下,这是关于的官方文档,如果您正在使用,那么请参阅函数refresh()
。但是由于您使用hasAccess
,那么您不应该做任何事情,因为同一文档中说:hasAccess()→ {boolean}
确定服务是否具有访问权限(已授权且尚未过期)。如果已授予脱机访问权限,且以前的令牌已过期,则此方法将尝试生成新令牌。