Давайте сразу к делу. Здесь мы собираемся сделать следующее:

  • Создайте сервер node.js с помощью express.js
  • Получить аутентификацию для Google Диска
  • Загрузите файл изображения на Google Диск с сервера node.js

Если вы не хотите следовать инструкциям, скачайте Исходный код

Создайте сервер node.js с помощью express.js

Запустите в терминале следующее:

mkdir google-drive-api-v3 && cd google-drive-api-v3
npm init -y && npm install express --save

Теперь давайте создадим файл server.js в папке вашего проекта. И заполните файл следующим:

const express = require('express');
const app = express();
const PORT = 5000;

app.get('/testRoute', (req, res) => res.end('Hello from Server!'));

app.listen(PORT, () => {
  console.log(`Node.js App running on port ${PORT}...`);
});

Давайте пройдемся по тому, что мы сделали!

Сначала мы импортировали express.js на наш сервер. Затем мы создали совершенно новое приложение, вызвав метод express().

Затем мы инициализировали нашу переменную порта значением 5000.

А затем мы создали тестовый маршрут под названием /testRoute, чтобы проверить, правильно ли работает наш сервер. Наконец, мы начали слушать наш сервер, вызвав app.listen().

Запустите сервер с вашего терминала:

node server.js

Поздравляем! мы успешно запустили наш сервер. Так что теперь мы можем проверить этот маршрут через почтальона с запросом на localhost:5000/testRoute

Получить аутентификацию для Google Диска

Сначала нам нужно включить наш Drive API, чтобы получить требуемый файл credentials.json. Итак, давайте перейдем на эту страницу.

Нажмите на Enable the Drive API. Если вы не вошли в систему, то войдите под своей учетной записью.

Если вы уже вошли в систему, откроется модальное окно с заголовком Включить Drive API. Пусть имя проекта будет по умолчанию или введите подходящее имя. Нажмите NEXT.

Теперь он будет говорить Configure your OAuth client. Я оставлю его как Настольное приложение и создам. Нажмите на DOWNLOAD CLIENT CONFIGURATION.

На этом у вас все готово.

Теперь сохраните файл credentials.json в корневом каталоге папки вашего сервера.

Для того, чтобы получить токен для гугл диска, добавьте следующие строки:

const express = require('express');
const app = express();
const PORT = 5000;

const fs = require('fs');
const readline = require('readline');
const { google } = require('googleapis');

Здесь мы импортируем fs для доступа к локальной файловой системе сервера node.js.

Модуль readline предоставляет интерфейс для чтения данных из потока Readable (например, process.stdin) по одной строке за раз.

googleapis — это клиентская библиотека node.js для использования API Google. Включена поддержка авторизации и аутентификации с помощью OAuth 2.0, ключей API и токенов JWT.

Мы включили необходимые библиотеки. Теперь давайте использовать его в действии. Добавьте следующие строки.

const fs = require('fs');
const readline = require('readline');
const { google } = require('googleapis');

// If modifying these scopes, delete token.json.
const SCOPES = ['https://www.googleapis.com/auth/drive'];

// The file token.json stores the user's access and refresh tokens, and is
// created automatically when the authorization flow completes for the first
// time.
const TOKEN_PATH = 'token.json';

let auth;

// ...

Давайте посмотрим, что мы уже добавили.

Переменная SCOPES содержит тип разрешений, которые мы получаем для Google Диска. Например, если нам нужно разрешение только на чтение для метаданных, мы должны добавить */drive.metadata.readonly* в конце ссылки.

Для TOKEN_PATH прочитайте строки комментариев выше. (Надеюсь, вы уже прочитали это)

auth будет содержать аутентификацию, которую мы скоро получим от Google для выполнения наших задач.

Теперь, когда мы успешно импортировали то, что нам нужно. Давайте теперь применим их в действии.

// ...
let auth;

// Load client secrets from a local file.
fs.readFile('credentials.json', (err, content) => {
  if (err) return console.log('Error loading client secret file:', err);
  // Authorize a client with credentials, then call the Google Drive API.
  authorize(JSON.parse(content));
});

Файл credential.json, который мы сохранили в корневой папке нашего сервера, чтобы прочитать файл, мы пользуемся помощью модуля fs node.js.

Итак, с помощью этой вышеприведенной функции мы прочитаем файл и вызовем функцию authorize, чтобы получить авторизацию от Google. Итак, давайте напишем функцию authorize.

// ...

/**
 * 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) {
  const { client_secret, client_id, redirect_uris } = credentials.installed;
  const oAuth2Client = new google.auth.OAuth2(
    client_id,
    client_secret,
    redirect_uris[0]
  );

  // Check if we have previously stored a token.
  fs.readFile(TOKEN_PATH, (err, token) => {
    if (err) return getAccessToken(oAuth2Client);
    oAuth2Client.setCredentials(JSON.parse(token));
    auth = oAuth2Client;
  });
}

Ву! Написал огромное количество кодов ха? Не волнуйтесь, давайте посмотрим, что мы уже сделали в этой функции.

Сначала мы извлекли три значения из файла credential.json и сохранили их в трех отдельных переменных. После этого, используя эти переменные, мы вызвали метод Google OAuth2, чтобы заставить oAuth2Client получить настоящую авторизацию ниже.

Теперь с помощью модуля fs мы читаем файл token.json. Впервые у нас нет файла token.json, поэтому мы вызываем функцию getAccessToken, чтобы получить токен от Google. После получения token.json в первый раз будет просто устанавливать учетные данные с помощью oAuthClient каждый раз при запуске сервера.

Теперь давайте напишем функцию getAccessToken, которая будет получать токен от google, если у нас нет файла token.json в корне нашего сервера.

// ...

/**
 * 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 for the authorized client.
 */

function getAccessToken(oAuth2Client) {
  const authUrl = oAuth2Client.generateAuthUrl({
    access_type: 'offline',
    scope: SCOPES,
  });
  console.log('Authorize this app by visiting this url:', authUrl);
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
  });
  rl.question('Enter the code from that page here: ', (code) => {
    rl.close();
    oAuth2Client.getToken(code, (err, token) => {
      if (err) return console.error('Error retrieving access token', err);
      oAuth2Client.setCredentials(token);
      // Store the token to disk for later program executions
      fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
        if (err) return console.error(err);
        console.log('Token stored to', TOKEN_PATH);
      });
      auth = authoAuth2Client;
    });
  });
}

Этот getAccessToken() будет делать следующее:

  • Он покажет ссылку в консоли, чтобы получить разрешение на диск
  • Он получит код в консоли, который предоставляет гугл диск
  • Он будет хранить файл token.json в корневой папке сервера.

Теперь давайте запустим сервер.

node server.js

Это предоставит нам URL-адрес для получения разрешения от Google. Откройте ссылку в браузере. Выберите свою учетную запись, если у вас несколько учетных записей. Если это показывает, что это приложение не проверено, пропустите это, выбрав › заранее › Перейти к быстрому запуску (небезопасно).

Теперь разрешите разрешение. Это будет код для копирования. Скопируйте его и вставьте в консоль.

Вот и все! Проверьте корневую папку вашего сервера. Файл token.json уже сохранен. Теперь нет необходимости выполнять эту же процедуру, если у вас есть файлы credentials.json и token.json, сохраненные в корневой папке вашего сервера.

Загрузите файл изображения на Google Диск с сервера node.js

Мы не собираемся загружать изображение из какого-либо запроса от пользовательского интерфейса/почтальона. Вместо этого мы собираемся загрузить изображение из существующей папки нашего сервера.

Давайте вручную сохраним изображение в ./demo-files/kamal-hossain.jpg. Вы можете изменить имя папки и изображения, если хотите, но не забудьте изменить их в коде.

Теперь давайте определим почтовый маршрут на нашем сервере node.js с помощью следующих строк:

// ...

app.post('/uploadAFile', (req, res) => {
  var fileMetadata = {
    name: 'kamal-hossain', // file name that will be saved in google drive
  };

  var media = {
    mimeType: 'image/jpg',
    body: fs.createReadStream('./demo-files/kamal-hossain.jpg'), // Reading the file from our server
  };

  // Authenticating drive API
  const drive = google.drive({ version: 'v3', auth });

  // Uploading Single image to drive
  drive.files.create(
    {
      resource: fileMetadata,
      media: media,
    },
    async (err, file) => {
      if (err) {
        // Handle error
        console.error(err.msg);

        return res
          .status(400)
          .json({ errors: [{ msg: 'Server Error try again later' }] });
      } else {
        // if file upload success then return the unique google drive id
        res.status(200).json({
          fileID: file.data.id,
        });
      }
    }
  );
});

Пожалуйста, прочитайте комментарии в коде, надеюсь, вам все будет понятно. Если загрузка образа файла прошла успешно, то, вероятно, придет такой ответ. (Я использую почтальон для отправки этого post запроса)

{ "fileID": "1w-wsh2nJsT0cldTf_fJnOsfdJwsuPpWzp" }

Ин ша Аллах (если будет на то воля Аллаха), возможно, в другом блоге я попытаюсь опубликовать, как загружать, удалять или выполнять другие операции в гугл диске с сервера node.js. Быть в курсе.

Первоначально опубликовано наhttps://kamalhossain.me/blog/google-drive-api-in-nodejs