Google apps script 如何使用谷歌应用程序脚本将视频上传到Youtube?

Google apps script 如何使用谷歌应用程序脚本将视频上传到Youtube?,google-apps-script,youtube-api,youtube-data-api,Google Apps Script,Youtube Api,Youtube Data Api,我想使用GoogleApps脚本使用YouTube数据API v3上传视频YouTube。这是我的代码: function YouTubeAPI() { var url = {URL VIDEO}; var file = UrlFetchApp.fetch(url).getBlob(); Logger.log(file.getName()); var snippet = { "snippet": { "title": "

我想使用GoogleApps脚本使用YouTube数据API v3上传视频YouTube。这是我的代码:

function YouTubeAPI()
{
  var url = {URL VIDEO};
  var file = UrlFetchApp.fetch(url).getBlob();
  Logger.log(file.getName());
  var snippet = {
  "snippet": {
    "title": "Summer vacation in California",
    "description": "Had a great time surfing in Santa Cruz",
    "tags": ["surfing", "Santa Cruz"],
    "categoryId": "22"},"status": {"privacyStatus": "private"}};
  YouTube.Videos.insert(snippet, 'snippet,status', file)
}
响应为“Unauthorized”,我检查Google控制台是否启用,并且在脚本中还启用Youtube数据API。

尝试使用。此示例代码查找用户的上载,然后通过添加字符串更新最新上载的描述

/**
 * This sample finds the active user's uploads, then updates the most recent
 * upload's description by appending a string.
 */
function updateVideo() {
  // 1. Fetch all the channels owned by active user
  var myChannels = YouTube.Channels.list('contentDetails', {mine: true});
  // 2. Iterate through the channels and get the uploads playlist ID
  for (var i = 0; i < myChannels.items.length; i++) {
    var item = myChannels.items[i];
    var uploadsPlaylistId = item.contentDetails.relatedPlaylists.uploads;

    var playlistResponse = YouTube.PlaylistItems.list('snippet', {
      playlistId: uploadsPlaylistId,
      maxResults: 1
    });

    // Get the videoID of the first video in the list
    var video = playlistResponse.items[0];
    var originalDescription = video.snippet.description;
    var updatedDescription = originalDescription + ' Description updated via Google Apps Script';

    video.snippet.description = updatedDescription;

    var resource = {
      snippet: {
        title: video.snippet.title,
        description: updatedDescription,
        categoryId: '22'
      },
      id: video.snippet.resourceId.videoId
    };
    YouTube.Videos.update(resource, 'id,snippet');
  }
}
/**
*此示例查找活动用户的上载,然后更新最新的
*通过附加字符串上载的描述。
*/
函数updateVideo(){
//1.获取活动用户拥有的所有频道
var myChannels=YouTube.Channels.list('contentDetails',{mine:true});
//2.迭代频道并获取上传的播放列表ID
对于(var i=0;i

有关更多信息,请在此处下载演示应用程序:

如果您的谷歌硬盘中有一个小于50MB的MP4文件,则可以从谷歌硬盘获取该文件,并使用YouTube数据API将其上载到YouTube。我创建了一个新的Google云平台(GCP)项目,启用了YouTube数据API和Google驱动API,并将新的GCP项目与我的应用程序脚本项目相关联。此外,我还手动将所需的作用域添加到appsscript.json文件中

{
  "timeZone": "Your time zone will be here",
  "dependencies": {
    "enabledAdvancedServices": [
      {
        "userSymbol": "YouTube",
        "version": "v3",
        "serviceId": "youtube"
      }
    ]
  },
  "oauthScopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/script.external_request","https://www.googleapis.com/auth/youtube"],
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}
守则:

function uploadToYouTube(mp4_fileId) {
  var blob,mp4_fileId,part,requestResource,response;
  var options = {},snippet = {};

  /*
    You will need to create a GCP standard project and associate it with this Apps Script project-
    In the new code editor click the settings cog wheel and scroll down to:
    Google Cloud Platform (GCP) Project -
    You may get an error:
    In order to change your project, you will need to configure the OAuth consent screen. Configure your OAuth Consent details.
    
    And if you do not have a Google Workspace account then you wont be able to set up the GCP project as "INTERNAL"
    You will need to enable the Google Drive API and the YouTube API in the associated GCP project -
  */

  /*
    This code needs the file ID of the MP4 file in your Google Drive - 
    To get the file ID of an MP4 video file in Google Drive, right click the MP4 in your Google Drive
    and choose, "Get link"
    The link will look like this:
    https://drive.google.com/file/d/FILE_ID_IS_HERE/view?usp=sharing
    In the URL is the file ID
  */

  options = {
    "method" : "get",
    "headers" : {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
    "muteHttpExceptions":true
  }
  
  mp4_fileId = mp4_fileId ? mp4_fileId : 'PUT_YOUR_MP4_FILE_ID_HERE';

  const url = `https://www.googleapis.com/drive/v3/files/` + mp4_fileId + `?alt=media`;
  response = UrlFetchApp.fetch(url, options);
  //Logger.log('response.getResponseCode(): ' + response.getResponseCode())

  if (response.getResponseCode() !== 200) {

    return;
  }
  
  blob = response.getBlob();
  //Logger.log('blob.getName(): ' + blob.getName())

  /*
  {"snippet":{
    "playlistId":"YOUR_PLAYLIST_ID",
    "position":0,
    "resourceId":{
      "kind":"youtube#video",
      "videoId":"abcdefg"
      }
    }
  }
  */

  /*
  {
  "snippet": {
    "title": "Summer vacation in California",
    "description": "Had fun surfing in Santa Cruz",
    "tags": ["surfing", "Santa Cruz"],
    "categoryId": "22"
  },
  "status": {
    "privacyStatus": "private"
  }
  }
  */
  
  requestResource = {};

  snippet.title = "AAA_Put_Title_Here";
  snippet.description = "Description of video goes here";
  snippet.categoryId = "22";

  options.snippet = snippet;
  options.status = {
      "privacyStatus": "private"
    }

  part = "snippet,status";//This correlates to the options

  //YouTube.Videos.insert(resource: Youtube_v3.Youtube.V3.Schema.Video, part: string[], mediaData: Blob, optionalArgs: Object)
  var response = YouTube.Videos.insert(requestResource, part, blob, options);

  if (!response || !response.kind) {//There was an error
    console.log("Error!")
  }
  
  //Logger.log('response: ' + response);

}

见下面的新答案。