ارائه های Google Slides را از Big Data در Node.js ایجاد کنید

1. بررسی اجمالی

در این لبه کد، خواهید آموخت که چگونه می توانید از اسلایدهای Google به عنوان یک ابزار ارائه سفارشی برای تجزیه و تحلیل رایج ترین مجوزهای نرم افزار استفاده کنید. شما با استفاده از BigQuery API همه کدهای منبع باز را در GitHub پرس و جو می کنید و با استفاده از Google Slides API یک اسلاید برای ارائه نتایج خود ایجاد می کنید. برنامه نمونه با استفاده از Node.js ساخته شده است، اما همان اصول اولیه برای هر معماری قابل اجرا است.

چیزی که یاد خواهید گرفت

  • ایجاد ارائه با استفاده از Slides API
  • استفاده از BigQuery برای به دست آوردن بینش در مورد یک مجموعه داده بزرگ
  • کپی کردن یک فایل با استفاده از Google Drive API

آنچه شما نیاز دارید

  • Node.js نصب شده است
  • دسترسی به اینترنت و مرورگر وب
  • یک اکانت گوگل
  • یک پروژه Google Cloud Platform

2. کد نمونه را دریافت کنید

می توانید تمام کدهای نمونه را در رایانه خود دانلود کنید ...

... یا مخزن GitHub را از خط فرمان کلون کنید.

git clone https://github.com/googleworkspace/slides-api.git

مخزن شامل مجموعه‌ای از دایرکتوری‌ها است که هر مرحله در طول فرآیند را نشان می‌دهد، در صورتی که نیاز به ارجاع به نسخه‌ای فعال دارید.

شما از کپی موجود در فهرست start استفاده می کنید، اما می توانید در صورت نیاز به فایل های دیگر مراجعه کرده یا از آنها کپی کنید.

3. برنامه نمونه را اجرا کنید

ابتدا اجازه دهید اسکریپت Node را راه اندازی و اجرا کنیم. با دانلود کد، دستورالعمل های زیر را برای نصب و راه اندازی برنامه Node.js دنبال کنید:

  1. یک ترمینال خط فرمان را در رایانه خود باز کنید و به دایرکتوری start کد لبه بروید.
  2. برای نصب وابستگی های Node.js دستور زیر را وارد کنید.
npm install
  1. برای اجرای اسکریپت دستور زیر را وارد کنید:
node .
  1. به سلامی که مراحل این پروژه را نشان می دهد توجه کنید.
-- Start generating slides. --
TODO: Get Client Secrets
TODO: Authorize
TODO: Get Data from BigQuery
TODO: Create Slides
TODO: Open Slides
-- Finished generating slides. --

می توانید لیست TODO های ما را در slides.js ، license.js و auth.js مشاهده کنید. توجه داشته باشید که ما از JavaScript Promises برای زنجیره مراحل مورد نیاز برای تکمیل برنامه استفاده می کنیم زیرا هر مرحله به تکمیل مرحله قبلی بستگی دارد.

اگر با وعده ها آشنا نیستید، نگران نباشید، ما تمام کدهای مورد نیاز شما را ارائه می کنیم. به طور خلاصه، وعده‌ها راهی را به ما می‌دهند تا پردازش ناهمزمان را به شیوه‌ای هماهنگ‌تر انجام دهیم.

4. اسرار مشتری را دریافت کنید

برای استفاده از Slides، Bigquery و Drive API، یک OAuth Client و یک Service Account ایجاد می کنیم.

Google Developers Console را راه اندازی کنید

  1. از این جادوگر برای ایجاد یا انتخاب یک پروژه در Google Developers Console استفاده کنید و به طور خودکار API را روشن کنید. روی Continue کلیک کنید، سپس به اعتبارنامه بروید .
  2. در صفحه افزودن اعتبار به پروژه خود ، روی دکمه لغو کلیک کنید.
  3. در بالای صفحه، برگه صفحه رضایت OAuth را انتخاب کنید. یک آدرس ایمیل انتخاب کنید، نام محصول Slides API Codelab را وارد کنید و روی دکمه ذخیره کلیک کنید.

APIهای BigQuery، Drive و Slides را فعال کنید

  1. تب Dashboard را انتخاب کنید، روی دکمه Enable API کلیک کنید و 3 API زیر را فعال کنید:
  2. BigQuery API
  3. Google Drive API
  4. Google Slides API

دانلود OAuth Client Secret (برای اسلایدها و Drive)

  1. تب Credentials را انتخاب کنید، روی دکمه Create credentials کلیک کنید و OAuth Client ID را انتخاب کنید.
  2. نوع برنامه دیگر را انتخاب کنید، نام Google Slides API Codelab را وارد کنید، و روی دکمه ایجاد کلیک کنید. برای رد کردن گفتگوی حاصل، روی OK کلیک کنید.
  3. روی دکمه file_download (دانلود JSON) در سمت راست شناسه مشتری کلیک کنید.
  4. نام فایل مخفی خود را به client_secret.json تغییر دهید و آن را در هر دو فهرست start/ و finish/ کپی کنید.

دانلود راز حساب سرویس (برای BigQuery)

  1. تب Credentials را انتخاب کنید، روی دکمه Create credentials کلیک کنید و کلید حساب کاربری را انتخاب کنید.
  2. در منوی کشویی، New Service Account را انتخاب کنید. نام Slides API Codelab Service برای سرویس خود انتخاب کنید. سپس روی Role کلیک کنید و به BigQuery بروید و BigQuery Data Viewer و BigQuery Job User را انتخاب کنید.
  3. برای نوع کلید ، JSON را انتخاب کنید.
  4. روی ایجاد کلیک کنید. فایل کلید به طور خودکار در رایانه شما دانلود می شود. برای خروج از گفتگوی ظاهر شده روی Close کلیک کنید.
  5. نام فایل مخفی خود را به service_account_secret.json تغییر دهید و آن را در هر دو فهرست start/ و finish/ کپی کنید.

اسرار مشتری را دریافت کنید

در start/auth.js ، بیایید روش getClientSecrets را پر کنیم.

auth.js

const fs = require('fs');

/**
 * Loads client secrets from a local file.
 * @return {Promise} A promise to return the secrets.
 */
module.exports.getClientSecrets = () => {
  return new Promise((resolve, reject) => {
    fs.readFile('client_secret.json', (err, content) => {
      if (err) return reject('Error loading client secret file: ' + err);
      console.log('loaded secrets...');
      resolve(JSON.parse(content));
    });
  });
}

ما اکنون اسرار مشتری را بارگذاری کرده ایم. اعتبارنامه به قول بعدی منتقل می شود. پروژه را با node . تا مطمئن شوید که هیچ خطایی وجود ندارد.

5. یک مشتری OAuth2 ایجاد کنید

برای ایجاد اسلاید، اجازه دهید با افزودن کد زیر به فایل auth.js خود، احراز هویت را به API های Google اضافه کنیم. این احراز هویت برای خواندن و نوشتن فایل‌ها در Google Drive، ایجاد ارائه‌ها در اسلایدهای Google و اجرای جستارهای فقط خواندنی از Google BigQuery درخواست دسترسی به حساب Google شما می‌کند. (توجه: ما getClientSecrets را تغییر ندادیم)

auth.js

const fs = require('fs');
const readline = require('readline');
const openurl = require('openurl');
const googleAuth = require('google-auth-library');
const TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH ||
      process.env.USERPROFILE) + '/.credentials/';
const TOKEN_PATH = TOKEN_DIR + 'slides.googleapis.com-nodejs-quickstart.json';

// If modifying these scopes, delete your previously saved credentials
// at ~/.credentials/slides.googleapis.com-nodejs-quickstart.json
const SCOPES = [
  'https://www.googleapis.com/auth/presentations', // needed to create slides
  'https://www.googleapis.com/auth/drive', // read and write files
  'https://www.googleapis.com/auth/bigquery.readonly' // needed for bigquery
];

/**
 * Loads client secrets from a local file.
 * @return {Promise} A promise to return the secrets.
 */
module.exports.getClientSecrets = () => {
  return new Promise((resolve, reject) => {
    fs.readFile('client_secret.json', (err, content) => {
      if (err) return reject('Error loading client secret file: ' + err);
      console.log('loaded secrets...');
      resolve(JSON.parse(content));
    });
  });
}

/**
 * Create an OAuth2 client promise with the given credentials.
 * @param {Object} credentials The authorization client credentials.
 * @param {function} callback The callback for the authorized client.
 * @return {Promise} A promise to return the OAuth client.
 */
module.exports.authorize = (credentials) => {
  return new Promise((resolve, reject) => {
    console.log('authorizing...');
    const clientSecret = credentials.installed.client_secret;
    const clientId = credentials.installed.client_id;
    const redirectUrl = credentials.installed.redirect_uris[0];
    const auth = new googleAuth();
    const oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl);

    // Check if we have previously stored a token.
    fs.readFile(TOKEN_PATH, (err, token) => {
      if (err) {
        getNewToken(oauth2Client).then(() => {
          resolve(oauth2Client);
        });
      } else {
        oauth2Client.credentials = JSON.parse(token);
        resolve(oauth2Client);
      }
    });
  });
}

/**
 * Get and store new token after prompting for user authorization, and then
 * fulfills the promise. Modifies the `oauth2Client` object.
 * @param {google.auth.OAuth2} oauth2Client The OAuth2 client to get token for.
 * @return {Promise} A promise to modify the oauth2Client credentials.
 */
function getNewToken(oauth2Client) {
  console.log('getting new auth token...');
  openurl.open(oauth2Client.generateAuthUrl({
    access_type: 'offline',
    scope: SCOPES
  }));

  console.log(''); // \n
  return new Promise((resolve, reject) => {
    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 reject(err);
        oauth2Client.credentials = token;
        let storeTokenErr = storeToken(token);
        if (storeTokenErr) return reject(storeTokenErr);
        resolve();
      });
    });
  });
}

/**
 * Store token to disk be used in later program executions.
 * @param {Object} token The token to store to disk.
 * @return {Error?} Returns an error or undefined if there is no error.
 */
function storeToken(token) {
  try {
    fs.mkdirSync(TOKEN_DIR);
    fs.writeFileSync(TOKEN_PATH, JSON.stringify(token));
  } catch (err) {
    if (err.code != 'EEXIST') return err;
  }
  console.log('Token stored to ' + TOKEN_PATH);
}

6. BigQuery را راه اندازی کنید

کاوش BigQuery (اختیاری)

BigQuery به ما امکان می دهد مجموعه داده های عظیم را در چند ثانیه پرس و جو کنیم. بیایید قبل از پرس و جو به صورت برنامه نویسی از رابط وب استفاده کنیم. اگر قبلاً BigQuery را راه‌اندازی نکرده‌اید، مراحل این شروع سریع را دنبال کنید .

برای مرور داده های GitHub موجود در BigQuery و اجرای پرس و جوهای خود ، کنسول Cloud را باز کنید. بیایید با نوشتن این پرس و جو و فشار دادن دکمه Run ، محبوب ترین مجوزهای نرم افزار در GitHub را دریابیم.

bigquery.sql

WITH AllLicenses AS (
  SELECT * FROM `bigquery-public-data.github_repos.licenses`
)
SELECT
  license,
  COUNT(*) AS count,
  ROUND((COUNT(*) / (SELECT COUNT(*) FROM AllLicenses)) * 100, 2) AS percent
FROM `bigquery-public-data.github_repos.licenses`
GROUP BY license
ORDER BY count DESC
LIMIT 10

ما به تازگی میلیون ها مخزن عمومی را در GitHub تجزیه و تحلیل کردیم و محبوب ترین مجوزها را کشف کردیم. باحال حالا بیایید همان پرس و جو را راه اندازی کنیم، اما این بار به صورت برنامه نویسی.

BigQuery را راه اندازی کنید

کد فایل license.js را جایگزین کنید. تابع bigquery.query یک وعده را برمی گرداند.

مجوز **.js**

const google = require('googleapis');
const read = require('read-file');
const BigQuery = require('@google-cloud/bigquery');
const bigquery = BigQuery({
  credentials: require('./service_account_secret.json')
});

// See codelab for other queries.
const query = `
WITH AllLicenses AS (
  SELECT * FROM \`bigquery-public-data.github_repos.licenses\`
)
SELECT
  license,
  COUNT(*) AS count,
  ROUND((COUNT(*) / (SELECT COUNT(*) FROM AllLicenses)) * 100, 2) AS percent
FROM \`bigquery-public-data.github_repos.licenses\`
GROUP BY license
ORDER BY count DESC
LIMIT 10
`;

/**
 * Get the license data from BigQuery and our license data.
 * @return {Promise} A promise to return an object of licenses keyed by name.
 */
module.exports.getLicenseData = (auth) => {
  console.log('querying BigQuery...');
  return bigquery.query({
    query,
    useLegacySql: false,
    useQueryCache: true,
  }).then(bqData => Promise.all(bqData[0].map(getLicenseText)))
    .then(licenseData => new Promise((resolve, reject) => {
      resolve([auth, licenseData]);
    }))
    .catch((err) => console.error('BigQuery error:', err));
}

/**
 * Gets a promise to get the license text about a license
 * @param {object} licenseDatum An object with the license's
 *   `license`, `count`, and `percent`
 * @return {Promise} A promise to return license data with license text.
 */
function getLicenseText(licenseDatum) {
  const licenseName = licenseDatum.license;
  return new Promise((resolve, reject) => {
    read(`licenses/${licenseName}.txt`, 'utf8', (err, buffer) => {
      if (err) return reject(err);
      resolve({
        licenseName,
        count: licenseDatum.count,
        percent: licenseDatum.percent,
        license: buffer.substring(0, 1200) // first 1200 characters
      });
    });
  });
}

سعی کنید برخی از داده‌های داخل فراخوان Promise ما console.log کنید تا ساختار اشیاء خود را بفهمید و عملکرد کد را ببینید.

7. اسلایدها را ایجاد کنید

حالا برای قسمت سرگرم کننده! بیایید با فراخوانی متدهای create و batchUpdate Slides API اسلاید بسازیم. فایل ما باید با موارد زیر جایگزین شود:

slides.js

const google = require('googleapis');
const slides = google.slides('v1');
const drive = google.drive('v3');
const openurl = require('openurl');
const commaNumber = require('comma-number');

const SLIDE_TITLE_TEXT = 'Open Source Licenses Analysis';

/**
 * Get a single slide json request
 * @param {object} licenseData data about the license
 * @param {object} index the slide index
 * @return {object} The json for the Slides API
 * @example licenseData: {
 *            "licenseName": "mit",
 *            "percent": "12.5",
 *            "count": "1667029"
 *            license:"<body>"
 *          }
 * @example index: 3
 */
function createSlideJSON(licenseData, index) {
  // Then update the slides.
  const ID_TITLE_SLIDE = 'id_title_slide';
  const ID_TITLE_SLIDE_TITLE = 'id_title_slide_title';
  const ID_TITLE_SLIDE_BODY = 'id_title_slide_body';

  return [{
    // Creates a "TITLE_AND_BODY" slide with objectId references
    createSlide: {
      objectId: `${ID_TITLE_SLIDE}_${index}`,
      slideLayoutReference: {
        predefinedLayout: 'TITLE_AND_BODY'
      },
      placeholderIdMappings: [{
        layoutPlaceholder: {
          type: 'TITLE'
        },
        objectId: `${ID_TITLE_SLIDE_TITLE}_${index}`
      }, {
        layoutPlaceholder: {
          type: 'BODY'
        },
        objectId: `${ID_TITLE_SLIDE_BODY}_${index}`
      }]
    }
  }, {
    // Inserts the license name, percent, and count in the title
    insertText: {
      objectId: `${ID_TITLE_SLIDE_TITLE}_${index}`,
      text: `#${index + 1} ${licenseData.licenseName}  — ~${licenseData.percent}% (${commaNumber(licenseData.count)} repos)`
    }
  }, {
    // Inserts the license in the text body paragraph
    insertText: {
      objectId: `${ID_TITLE_SLIDE_BODY}_${index}`,
      text: licenseData.license
    }
  }, {
    // Formats the slide paragraph's font
    updateParagraphStyle: {
      objectId: `${ID_TITLE_SLIDE_BODY}_${index}`,
      fields: '*',
      style: {
        lineSpacing: 10,
        spaceAbove: {magnitude: 0, unit: 'PT'},
        spaceBelow: {magnitude: 0, unit: 'PT'},
      }
    }
  }, {
    // Formats the slide text style
    updateTextStyle: {
      objectId: `${ID_TITLE_SLIDE_BODY}_${index}`,
      style: {
        bold: true,
        italic: true,
        fontSize: {
          magnitude: 10,
          unit: 'PT'
        }
      },
      fields: '*',
    }
  }];
}

/**
 * Creates slides for our presentation.
 * @param {authAndGHData} An array with our Auth object and the GitHub data.
 * @return {Promise} A promise to return a new presentation.
 * @see https://developers.google.com/apis-explorer/#p/slides/v1/
 */
module.exports.createSlides = (authAndGHData) => new Promise((resolve, reject) => {
  console.log('creating slides...');
  const [auth, ghData] = authAndGHData;

  // First copy the template slide from drive.
  drive.files.copy({
    auth: auth,
    fileId: '1toV2zL0PrXJOfFJU-NYDKbPx9W0C4I-I8iT85TS0fik',
    fields: 'id,name,webViewLink',
    resource: {
      name: SLIDE_TITLE_TEXT
    }
  }, (err, presentation) => {
    if (err) return reject(err);

    const allSlides = ghData.map((data, index) => createSlideJSON(data, index));
    slideRequests = [].concat.apply([], allSlides); // flatten the slide requests
    slideRequests.push({
      replaceAllText: {
        replaceText: SLIDE_TITLE_TEXT,
        containsText: { text: '{{TITLE}}' }
      }
    })

    // Execute the requests
    slides.presentations.batchUpdate({
      auth: auth,
      presentationId: presentation.id,
      resource: {
        requests: slideRequests
      }
    }, (err, res) => {
      if (err) {
        reject(err);
      } else {
        resolve(presentation);
      }
    });
  });
});

8. اسلایدها را باز کنید

در آخر، اجازه دهید ارائه را در مرورگر باز کنیم. روش زیر را در slides.js به روز کنید.

slides.js

/**
 * Opens a presentation in a browser.
 * @param {String} presentation The presentation object.
 */
module.exports.openSlidesInBrowser = (presentation) => {
  console.log('Presentation URL:', presentation.webViewLink);
  openurl.open(presentation.webViewLink);
}

پروژه خود را برای آخرین بار اجرا کنید تا نتیجه نهایی نشان داده شود.

9. تبریک می گویم!

شما با موفقیت اسلایدهای Google را از داده های تجزیه و تحلیل شده با استفاده از BigQuery ایجاد کرده اید. اسکریپت شما یک ارائه با استفاده از Google Slides API و BigQuery ایجاد می کند تا تجزیه و تحلیل رایج ترین مجوزهای نرم افزار را گزارش کند.

بهبودهای احتمالی

در اینجا چند ایده اضافی برای ایجاد یک ادغام قانع کننده تر وجود دارد:

  • به هر اسلاید تصاویر اضافه کنید
  • اسلایدهای خود را از طریق ایمیل با استفاده از Gmail API به اشتراک بگذارید
  • اسلاید الگو را به عنوان آرگومان خط فرمان سفارشی کنید

بیشتر بدانید