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}
确定服务是否具有访问权限(已授权且尚未过期)。如果已授予脱机访问权限,且以前的令牌已过期,则此方法将尝试生成新令牌。