0

I am trying to download a file from google drive using node.js. This is my first attempt to use google sdks so I just followed the instructions and copied the code from the samples. I can succesfully get the metadata from the files present in my gdrive , but whenever I am trying to download a file, it is throwing the error. Please find ahead the code snippet I am using below which is nothing but the examples provided in the documentation.

            var fs = require('fs');
            var readline = require('readline');
            var google = require('googleapis');
            var googleAuth = require('google-auth-library');
            var request = require("request");

            // If modifying these scopes, delete your previously saved credentials
            // at ~/.credentials/drive-nodejs-quickstart.json
            //var SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly'];
            var SCOPES = ['https://www.googleapis.com/auth/drive'];
            /* var TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH ||
                process.env.USERPROFILE) + '/.credentials/'; */
            var TOKEN_DIR = process.env.USERPROFILE + '/.credentials/'; 
            var TOKEN_PATH = TOKEN_DIR + 'drive-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
              // Drive API.
              authorize(JSON.parse(content), listFiles);
            });

            /**
             * 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 auth = new googleAuth();
              var oauth2Client = new auth.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));
              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 listFiles(auth) {
              var service = google.drive('v3');
              service.files.list({
                auth: auth,
                pageSize: 10,
                fields: "nextPageToken, files(id, name)"
              }, function(err, response) {
                if (err) {
                  console.log('The API returned an error: ' + err);
                  return;
                }
                var files = response.files;
                if (files.length == 0) {
                  console.log('No files found.');
                } else {
                  for (var i = 0; i < files.length; i++) {
                    var file = files[i];
                    if(file.name.indexOf('Expense') > -1) {
                        downloadFile(file.id);
                    }


                  }
                }
              });
            }

            /**
             * Download a file's content.
             *
             * @param {File} file Drive File instance.
             * @param {Function} callback Function to call when the request is complete.
             */


            function downloadFile(fileId) {
            //file['exportLinks']['application/pdf'];

              //var fileId = '0BwwA4oUTeiV1UVNwOHItT0xfa2M';
                    var service = google.drive('v3');
                    var dest = fs.createWriteStream('/test.doc');
                    service.files.get({
                       fileId: fileId,
                       alt: 'media'
                    })
                    .on('end', function() {
                      console.log('Done');
                    })
                    .on('error', function(err) {
                      console.log('Error during download', err);
                    })
                    .pipe(dest);

            }

I have only tried 17-20 requests in the last hour and don't think I have used all my quotas. I have checked that the GDrive api is enabled in my project. Please help.

  • Adding the output for better understanding. Done { [Error: Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.] code: 403, errors: [ { domain: 'usageLimits', reason: 'dailyLimitExceededUnreg', message: 'Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.', extendedHelp: 'https://code.google.com/apis/console' } ] } – Subhankar Mukherjee May 04 '16 at 13:00
  • that error means that your request was missing an Authorization header – pinoyyid May 04 '16 at 14:33
  • 1
    though there is a mention of an authorization header in the documentation , in the example there is no mention of this header. Would you please provide any working sample as I am clueless on this. – Subhankar Mukherjee May 05 '16 at 06:25
  • same problem never answered – An Le Mar 12 '21 at 09:19

1 Answers1

0

Based from this documentation, error 403 means that you have reached Google Drive API's maximum request rate. The limit varies depending on the kind of requests. The suggested action is to Batch the requests. Try to reduce the number of HTTP connections your client has to make.

Another workaround is to check the status for Google+ API in developer console. It should be set to ON. Wait for a few minutes after turning on, and ensure that you get a fresh token.

Check these related SO questions:

Community
  • 1
  • 1
abielita
  • 13,147
  • 2
  • 17
  • 59
  • 3
    Thanks for the suggestion, but as I have mentioned its only 17-20 request for a day, So I dont think I have reached the maximum request rate. Secondly I have checked that the GDrive api is enabled for my app in the api console. So I am afraid it does not solve the issue. – Subhankar Mukherjee May 05 '16 at 09:19
  • i have a similar issue. did you resolve it subhankar? – Joris Weimar Jun 25 '17 at 20:25