【问题标题】:Updating the default broadcast's stream title via YouTube API通过 YouTube API 更新默认广播的流标题
【发布时间】:2021-02-08 10:20:27
【问题描述】:

使用下面的链接,title 可以轻松更新:

https://developers.google.com/youtube/v3/live/docs/liveStreams/update?apix=true.

我希望使用 Google Apps 脚本中的 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...!!');

【问题讨论】:

  • 太棒了,你提到的解决方案奏效了!接受...❤
  • 我有一个与此相关的问题... youtube 中的令牌会在 1 小时(3600 秒)后过期,我需要每天运行两次此脚本。如何在运行脚本前自动获取新令牌?
  • 要具体回答您的问题,我需要查看函数getService。无论如何,这里是关于how to refresh an access token 的官方文档,
  • 如果您使用的是OAuth2 for Apps Script,请查看Service_html 的函数refresh()
  • 但是既然你使用hasAccess,那么你不应该做任何事情,因为同一个文档说:hasAccess() → {boolean} 确定服务是否可以访问(已被授权并且没有' t 过期)。如果授予离线访问权限并且之前的令牌已过期,则此方法会尝试生成新令牌。

标签: javascript json google-apps-script youtube-data-api google-apps-script-api


【解决方案1】:

如果您只更新广播的titledescription 属性,那么根据官方文档,您可以简单地使用Videos.update API 端点:

snippet.title(字符串)
广播的标题。请注意,广播仅代表一个 YouTube 视频。您可以通过修改广播资源或设置对应视频资源的title字段来设置该字段。

snippet.description(字符串)
广播的描述。与title一样,您可以通过修改广播资源或设置相应视频资源的description字段来设置该字段。

为此,请按如下方式修改您的代码:

// 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);

请注意,更新视频的titledescription 是一个两步过程,因为根据官方文档,在视频的snippet 对象one need to pass 上调用Videos.update 端点时,视频的categoryId 属性也到端点。

因此,首先使用Videos.list API 端点查询视频的当前categoryId 属性,然后才调用Videos.update

还请注意,上面的代码已大大简化,因为它不处理这些 API 调用可能返回的错误。


关于您的问题(引用):

[...] 当给定 scheduleStartTime 时,它​​会创建一个新的广播,而不是更新原来的广播。

请确认在 URL 上调用 API:

https://www.googleapis.com/youtube/v3/liveBroadcasts

正如您对代码所做的那样,您实际上是在调用LiveBroadcasts.insert API 端点,而不是您实际期望的LiveBroadcasts.update

之所以如此,是因为这两个 API 端点具有相同的 URL;两者的区别在于调用各自的 HTTP 方法:POST 用于前者,PUT 用于后者。

由于您对UrlFetchApp.fetch 的第二次调用确实将method 明确指定为POST,因此您实际上是在调用LiveBroadcasts.insert 端点而不是LiveBroadcasts.update

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2023-04-04
    • 2015-03-19
    相关资源
    最近更新 更多