I've modified quickstart.js file provided by youtube api(node.js version), and I have done my Api_key and credential.josn file, so I successfully run the function of getChannel() and getVideos(), however, when I run the function insertComment, I've got this erroe from the console:
Error inserting comment: GaxiosError: Login Required.at Gaxios._request (/Users/chi/node_modules/gaxios/build/src/gaxios.js:136:23)
I want to successfully sent the comment to the video by using the api function
codes shown below is my modified quickstart.js file:
var fs = require("fs");var readline = require("readline");var { google } = require("googleapis");var OAuth2 = google.auth.OAuth2;// If modifying these scopes, delete your previously saved credentials// at ~/.credentials/youtube-nodejs-quickstart.jsonvar SCOPES = ["https://www.googleapis.com/auth/youtube.readonly","https://www.googleapis.com/auth/youtube.force-ssl","https://www.googleapis.com/auth/youtube","https://www.googleapis.com/auth/youtubepartner",];var TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH || process.env.USERPROFILE) +"/.credentials/";var TOKEN_PATH = TOKEN_DIR +"youtube-nodejs-quickstart.json";// Load client secrets from a local file.fs.readFile("client_secret.json", function processClientSecrets(err, content) { if (err) { console.log("Error loading client secret file: " + err); return; } // Authorize a client with the loaded credentials, then call the YouTube API. authorize(JSON.parse(content), insertComment);});/** * Create an OAuth2 client with the given credentials, and then execute the * given callback function. * * @param {Object} credentials The authorization client credentials. * @param {function} callback The callback to call with the authorized client. */function authorize(credentials, callback) { var clientSecret = credentials.installed.client_secret; var clientId = credentials.installed.client_id; var redirectUrl = credentials.installed.redirect_uris[0]; var oauth2Client = new OAuth2(clientId, clientSecret, redirectUrl); // Check if we have previously stored a token. fs.readFile(TOKEN_PATH, function (err, token) { if (err) { getNewToken(oauth2Client, callback); } else { oauth2Client.credentials = JSON.parse(token); callback(oauth2Client); } });}/** * Get and store new token after prompting for user authorization, and then * execute the given callback with the authorized OAuth2 client. * * @param {google.auth.OAuth2} oauth2Client The OAuth2 client to get token for. * @param {getEventsCallback} callback The callback to call with the authorized * client. */function getNewToken(oauth2Client, callback) { var authUrl = oauth2Client.generateAuthUrl({ access_type: "offline", scope: SCOPES, }); console.log("Authorize this app by visiting this url: ", authUrl); var rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); rl.question("Enter the code from that page here: ", function (code) { rl.close(); oauth2Client.getToken(code, function (err, token) { if (err) { console.log("Error while trying to retrieve access token", err); return; } oauth2Client.credentials = token; storeToken(token); callback(oauth2Client); }); });}/** * Store token to disk be used in later program executions. * * @param {Object} token The token to store to disk. */function storeToken(token) { try { fs.mkdirSync(TOKEN_DIR); } catch (err) { if (err.code != "EEXIST") { throw err; } } fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => { if (err) throw err; console.log("Token stored to " + TOKEN_PATH); });}/** * Lists the names and IDs of up to 10 files. * * @param {google.auth.OAuth2} auth An authorized OAuth2 client. */function getChannel(auth) { var service = google.youtube("v3"); service.videos.list( { auth: auth, part: "snippet,contentDetails,statistics", id: "UC_x5XG1OV2P6uZZ5FSM9Ttw", }, function (err, response) { if (err) { console.log("The API returned an error: " + err); return; } var videos = response.data.items; if (videos.length == 0) { console.log("No channel found."); } else { console.log("This channel's ID is %s. Its title is '%s', and " +"it has %s views.", videos[0].id, videos[0].snippet.title, videos[0].statistics.viewCount ); } } );}function getVideoos(auth) { var service = google.youtube("v3"); service.search.list( { auth: auth, part: "snippet", q: "green day", }, function (err, response) { if (err) { console.log("The API returned an error: " + err); return; } var videos = response.data.items; if (videos.length == 0) { console.log("No videos found."); } else { console.log(videos); } } );}function insertComment(auth) { var service = google.youtube("v3"); const commentParams = { part: "snippet", body: { snippet: { videoId: "EGcF7lyqN8Q", // its an hard-coding id of a video which permits commenting topLevelComment: { snippet: { textOriginal: "speechless...", // this is what I want to comment }, }, }, }, }; service.commentThreads.insert(commentParams, (err, response) => { if (err) { console.error("Error inserting comment:", err); return; } console.log("Comment inserted successfully:", response.data); });}

