משתמשים ב-Google Cloud Functions כדי לשפר את תיבת הדואר הנכנס של Gmail

1. מבוא

מיליארדי עסקים ואנשים פרטיים משתמשים ב-Gmail ובשירותים אחרים של G Suite כדי לתקשר ולעבד נתונים. Google מציעה ממשקי API של G Suite שיעזרו לכם לגשת למידע בשירותים האלה באופן פרוגרמטי. תוכלו להשתמש בממשקי ה-API כדי להפוך בקלות את תהליך העבודה היומיומי שלכם לאוטומטי. בשיעור ה-Lab הזה תפתחו תוסף Gmail חזק שמסווג באופן אוטומטי אימיילים בהודעות נכנסות ושומר את הקטגוריות האלה בגיליון אלקטרוני ב-Google Sheets. התוסף הזה ישתמש בממשקי RESTful API של G Suite, ב-Google Cloud Functions ובשירותים נוספים של Google Cloud Platform.

מה תפַתחו

בשיעור ה-Lab הזה תפתחו ותפרסו כמה פונקציות Cloud Functions המחוברות לממשקי API של G Suite ולשירותי Google Cloud Platform אחרים. הפונקציות האלה:

  • הענקת גישה מאובטחת לנתונים שלך ב-Gmail וב-Google Sheets
  • חילוץ תמונות מצורפות לכל דואר נכנס
  • סיווג של התמונות האלה באמצעות Cloud Vision API
  • צריך לכתוב את הקטגוריות האלה, את כתובת השולח ואת שם הקובץ המצורף בגיליון אלקטרוני ב-Google Sheets

מה תלמדו

  • העקרונות הבסיסיים של ממשקי API ל-RESTful ב-G Suite
  • יסודות של Google Cloud Functions ושירותים אחרים של Google Cloud Platform
  • איך ניגשים ל-Gmail באופן פרוגרמטי באמצעות Google Cloud Functions

מה צריך להכין

2. השלב הראשון

הפעלת ממשקי ה-API

בשיעור ה-Lab הזה תשתמשו במוצרים או בשירותים הבאים של Google:

  • פונקציות Google Cloud
  • Google Cloud Pub/Sub
  • Google Cloud Vision API
  • מאגר הנתונים של Google Cloud
  • ממשק ה-API של Gmail
  • Google Sheets API

פונקציות Google Cloud

Google Cloud Functions היא פלטפורמת שרת ללא שרת (serverless Functions) של Google שמאפשרת להריץ קטעי קוד נפרדים ('פונקציות') באופן פשוט שניתן להתאמה.

כדי להפעיל את Google Cloud Functions, לוחצים על סמל האפשרויות הנוספות (3 קווים) בפינה הימנית העליונה של המסך כדי לפתוח את סרגל הניווט הימני:

f457988e33594bb6.png

מאתרים את האפשרות Cloud Functions בתפריט הניווט ולוחצים עליה. לוחצים על Enable API כדי להפעיל את Google Cloud Functions בפרויקט.

Google Cloud Pub/Sub

Google Cloud Pub/Sub הוא בסיס פשוט שניתן להתאמה, שמאפשר להעביר נתונים בסטרימינג ולשדר אירועים. בשיעור ה-Lab הזה הוא ישמש כשליח בין Gmail ל-Google Cloud Functions.

כדי להפעיל את Google Cloud Pub/Sub, פותחים את סרגל הניווט השמאלי, מחפשים את Pub/Sub ולוחצים עליו. לוחצים על Enable API כדי להפעיל את Google Cloud Pub/Sub בפרויקט.

מאגר הנתונים של Google Cloud

Google Cloud Datastore הוא מסד נתונים ללא שרת (serverless) שניתן להרחבה ולהפצה.

כדי להפעיל את Google Cloud Datastore, מחפשים את Datastore בסרגל הניווט השמאלי ולוחצים עליו. לוחצים על Select Datastore Mode בדף החדש.

98012c91fd4080d4.png

בשיעור ה-Lab הזה תוכלו להשתמש בכל מיקום של מסד נתונים. לוחצים על Create Database כדי להפעיל את Google Cloud Datastore. עשויות להימשך כמה דקות.

Google Cloud Vision

Google Cloud Vision API הוא שירות מתקדם של למידת מכונה שמשתמש במודלים שעברו אימון מראש כדי להפיק תובנות מהתמונות שלכם.

בהמשך מפורטות הוראות להפעלה של Google Cloud Vision API.

הפעלה של Gmail API, Google Sheets API ו-Google Cloud Vision API

שוב, פותחים את סרגל הצד של הניווט ומחפשים את האפשרות APIs & שירותים. לוחצים על ספרייה. בקטע חיפוש ממשקי API השדה 'שירותים', הקלד ב-Gmail. בתוצאות החיפוש, בוחרים באפשרות Gmail API ולוחצים על הפעלה.

חוזרים לדף 'ספריית API'. מחפשים את Google Sheets API ומפעילים אותו.

חוזרים על התהליך. מחפשים את Cloud Vision API ומפעילים אותו.

פתיחת Google Cloud Shell

בשיעור ה-Lab הזה תשתמשו ב-Google Cloud Shell לביצוע רוב הפעולות. Cloud Shell נותנת לכם גישה למשאבים שלכם ב-Google Cloud Platform ישירות מהדפדפן, וכך מאפשרת לנהל אותם בלי להשתמש במחשב מקומי.

כדי לפתוח את Google Cloud Shell, לוחצים על הלחצן Activate Cloud Shell בסרגל האופקי הכחול העליון:

fd5c2925ca9cdfdd.png

חלונית חדשה תופיע בחלק התחתון של המסך:

34f498402e910802.png

לוחצים על הלחצן Launch code Editor (השקת עורך קוד) כדי להפעיל את Cloud Shell Code Editor:

10f8631ef48bed22.png

הכלי Cloud Shell Code Editor ייפתח בחלון חדש.

להורדת הקוד

כדי לשכפל את הפרויקט, מריצים את הפקודה הבאה ב-Cloud Shell:

git clone https://github.com/googlecodelabs/gcf-gmail-codelab.git

cd gcf-gmail-codelab

תיקייה חדשה, gcf-gmail-codelab, אמורה להופיע ב-Cloud Shell Code Editor.

3. סקירה אדריכלית

בהמשך מוצג תהליך העבודה של שיעור ה-Lab הזה:

79c5d3e43f674b33.png

  1. משתמש מגדיר התראות ב-Gmail: בכל פעם שהודעה חדשה מגיעה לתיבת הדואר הנכנס, Gmail שולח התראה ל-Cloud Pub/Sub.
  2. ההודעה החדשה נשלחת מ-Cloud Pub/Sub ל-Google Cloud Functions.
  3. עם קבלת ההתראה החדשה, מכונה של Cloud Functions מתחברת ל-Gmail ומאחזרת את ההודעה החדשה.
  4. אם הודעת האימייל כוללת תמונה כקובץ מצורף, המכונה של Cloud Functions קוראת ל-Cloud Vision API לנתח את הקובץ המצורף.
  5. המכונה של Cloud Functions מעדכנת גיליון אלקטרוני לבחירתכם ב-Google Sheets, ומציינת מי שולח את ההודעה ומאיפה להוריד את הקובץ המצורף.

4. הענקת גישה ל-Gmail

לפני שמגדירים פונקציה של Cloud Functions כדי לקרוא אימיילים באופן אוטומטי, צריך לאשר את הגישה שלה ל-Gmail. יהיה עליך לרשום לקוח OAuth ב-Google וליצור מזהה לקוח משויך.

רישום לקוח OAuth

בתפריט הניווט השמאלי במסוף Google Cloud מאתרים את האפשרות APIs & שירותים. לוחצים על מסך ההסכמה של OAuth.

91b2a3bac30bb2c5.png

מקלידים שם בשדה שם האפליקציה, למשל GCF + Gmail Codelab. משאירים את שאר ההגדרות ללא שינוי, גוללים למטה בדף ולוחצים על שמירה.

יצירת מזהה לקוח משויך

עוברים לכרטיסייה Credentials. לוחצים על Create Credentials (יצירת פרטי כניסה) ובוחרים באפשרות OAuth client ID (מזהה לקוח OAuth). בוחרים את הסוג Web application, נותנים לו שם (אפשר להשתמש כאן שוב ב-GCF + Gmail Codelab) ולוחצים על Create. כרגע אפשר להשאיר את השדות 'הגבלות' ריקים.

רושמים את מזהה הלקוח ואת סוד הלקוח שמוחזר בחלון הקופץ. אפשר ללחוץ על שם הלקוח בדף כדי להציג שוב את הערכים האלה:

1160d8027ea52d90.png

ביצוע תהליך ההרשאה

בקוד לדוגמה, המאפיין auth/index.js מציין שתי פונקציות של Cloud Functions, auth_init ו-auth_callback, שפועלות יחד לביצוע תהליך ההרשאה באמצעות מזהה הלקוח וסוד הלקוח שיצרתם.

כדי לבדוק את הקוד, פותחים את auth/index.js ב-Cloud Shell Code Editor.

בתהליך ההרשאה מחזירים שני סוגים של אסימונים: אסימוני גישה ואסימוני רענון.

  • אסימוני גישה הם הוכחת זהות לטווח קצר שמעניקות לכל מי שיש להם גישה בהיקף שלהם לנתונים שלכם; auth_callback שומר אותן ב-Cloud Datastore.
  • אסימוני רענון משמשים לקבלת אסימוני גישה חדשים, והתוקף שלהם ארוך יותר באופן משמעותי.

בדרך כלל, הם מוצפנים ו/או מאוחסנים בנפרד מאסימוני גישה.

עורכים את auth/env_vars.yaml ב-Cloud Shell Code Editor. מחליפים את YOUR-GOOGLE-CLIENT-ID ואת YOUR-GOOGLE-CLIENT-SECRET בערכים משלכם. כדי לקבל מידע נוסף, אפשר לעיין בשלב הקודם. צריך להשאיר את הערכים של YOUR-GOOGLE-CLIENT-CALLBACK-URL ו-YOUR-PUBSUB-TOPIC ללא שינוי.

a2b4853c39a78bc6.png

אחרי שעורכים את auth/env_vars.yaml, מריצים את הפקודה הבאה ב-Cloud Shell כדי לפרוס את הפונקציות של Cloud Functions:

cd ~
cd gcf-gmail-codelab/auth

# Deploy Cloud Function auth_init
gcloud functions deploy auth_init --runtime=nodejs8 --trigger-http --env-vars-file=env_vars.yaml

# Deploy Cloud Function auth_callback
gcloud functions deploy auth_callback --runtime=nodejs8 --trigger-http --env-vars-file=env_vars.yaml

הפריסה של Cloud Functions עשויה להימשך כמה דקות. אם מתבקשים, נותנים ל-Cloud SDK הרשאה להתקין פקודות בטא.

לאחר מכן, נכנסים למסוף Google Cloud ולוחצים על Cloud Functions בתפריט הניווט השמאלי. לוחצים על auth_callback ברשימה של Cloud Functions, ועוברים לכרטיסייה Trigger.

cb094bd341f9b299.png

45678a327c80e0f1.png

מעתיקים את כתובת ה-URL של הדף. חוזרים לדף Cloud Functions, לוחצים על auth_init ברשימת Cloud Functions. בכרטיסייה כללי, לוחצים על עריכה. לוחצים על משתנים סביבתיים, רשתות, זמנים קצובים לתפוגה ועוד ומחליפים את הערך של GOOGLE_CALLBACK_URL בכתובת ה-URL שהעתקתם.

939ca3bd38047282.png

לוחצים על פריסה כדי להחיל את השינויים. חוזרים על התהליך ומעדכנים גם את auth_callback.

לבסוף, פותחים את תפריט הניווט השמאלי ולוחצים על APIs & שירותים > אימות הדומיין כדי להוסיף דומיין מורשה, לוחצים על הוספת דומיין. לדוגמה, אם כתובת ה-URL שהעתקת קודם לכן נראית כך:

https://us-central1-my-project.cloudfunctions.net/auth_callback

צריך להוסיף את הכתובת הבאה כדומיין מורשה:

us-central1-my-project.cloudfunctions.net

לוחצים על הוספת דומיין כדי לאשר.

4348748f232ceb87.png

חוזרים לדף Credentials. לוחצים על השם של לקוח OAuth ומוסיפים את כתובת ה-URL שהעתקתם כ-URI מורשה להפניה אוטומטית. מקישים על Enter כדי לאשר.

צריך להסיר את החלק /auth_callback מכתובת ה-URL ולהוסיף את השאר כמקור JavaScript מורשה. לדוגמה, אם כתובת האתר שלכם נראית כך:

https://us-central1-my-project.cloudfunctions.net/auth_callback

צריך להוסיף את הקוד הבא בתור המקור:

https://us-central1-my-project.cloudfunctions.net/

159bad719432582c.png

מקישים על Enter כדי לאשר ולוחצים על שמירה כדי להחיל את השינויים.

5. הגדרת התראות ב-Gmail

אם תהליך ההרשאה יצליח, auth_callback יקרא באופן אוטומטי ל-Gmail API כדי להגדיר התראות.

כדי לקבל התראות של Gmail, עליך ליצור נושא Pub/Sub. כל המנויים לנושא יקבל התראות על הודעות נכנסות באופן אוטומטי כשהם יגיעו מ-Gmail.

כדי ליצור נושא Pub/Sub, נכנסים אל Google Cloud Console ולוחצים על Pub/Sub > נושאים בתפריט הניווט הימני. לוחצים על יצירת נושא. מקלידים את שם הנושא, למשל gmail-watch, ולוחצים על יצירה. בנוסף, צריך לתת ל-Gmail הרשאה לשלוח הודעות לנושא Pub/Sub: לוחצים על תפריט ההקשר של הנושא שיצרתם (שלוש נקודות במאונך) ובוחרים באפשרות הרשאות. לוחצים על הוספת חברים, מציינים את gmail-api-push@system.gserviceaccount.com כחבר חדש ומקצים לו את התפקיד Pub/Sub > בעל אפליקציה ב-Pub/Sub; לסיום, לוחצים על שמירה כדי להחיל את השינויים.

צריך לעדכן את הפונקציה auth_callback של Cloud Functions כדי לציין באיזה נושא Pub/Sub להשתמש. בתפריט הניווט השמאלי, לוחצים על Cloud Functions ובוחרים באפשרות auth_callback ברשימת Cloud Functions. בכרטיסייה כללי, לוחצים על עריכה. לוחצים על עוד ומחליפים את הערך של PUBSUB_TOPIC בשם של נושא Pub/Sub שיצרתם. לוחצים על Save כדי להחיל את השינויים.

עכשיו אתה מוכן לאשר ולהגדיר התראות ב-Gmail. ממתינים עד שהשינויים החדשים יושלמו, ואז חוזרים לדף Cloud Functions, בוחרים באפשרות auth_init ברשימת Cloud Functions ועוברים לכרטיסייה Trigger. לוחצים על כתובת ה-URL. המערכת תפנה אתכם לדף כניסה באמצעות חשבון Google:

348ab0a7e0c9cd03.png

נכנסים באמצעות חשבון Gmail שנמצא בבעלותכם. כל הודעה חדשה שתקבלו לתיבת הדואר הנכנס בחשבון תקפיץ התראה. לאחר הכניסה, יוצג הדף הבא:

cfdad62fd02de004.png

לוחצים על אישור כדי לאשר גישה. auth_callback ישלים את תהליך ההרשאה, ישמור את אסימוני הגישה ויגדיר בשבילך התראות של Gmail. כשהתהליך יסתיים, ההודעה Successfully set up Gmail push notifications אמורה להופיע בדפדפן.

ה-Codelab הזה משתמש בחבילת @google-cloud/express-oauth2-handlers כדי לבצע בשבילך את תהליך ההרשאה באופן אוטומטי. מידע נוסף זמין במאגר שלו ב-GitHub.

6. עיבוד ההודעות הנכנסות

כפי שהזכרנו קודם, כל מנוי לנושא Pub/Sub שיצרתם יקבל התראות כשהודעות חדשות יגיעו לתיבת הדואר הנכנס שלכם. pubsub/index.js מציין פונקציה של Cloud Functions, watchGmailMessages, שאחריה נפרסה בתור מנויים לנושא, היא תקרא את ההודעות החדשות, תסווג את התמונות המצורפות ותייצא את הקטגוריות האלה לגיליון אלקטרוני ב-Google Sheets.

כדי לבדוק את הקוד, פותחים את pubsub/index.js ב-Cloud Shell Code Editor.

ההודעות בתהליך אחזור

התראה של Gmail כוללת את כתובת האימייל שאליה משויכת ההתראה ומזהה היסטוריה. כדי לשמור על פשטות, ב-Codelab הזה תצטרכו פשוט לבקש מ-Gmail API את ההודעה האחרונה בכל פעם שמתקבלת התראת דחיפה; כדי לקבל תוצאות טובות יותר, אפשר להשתמש במזהה ההיסטוריה כדי לחפש הודעות.

// Look up the most recent message.
const listMessagesRes = await gmail.users.messages.list({
  userId: email,
  maxResults: 1
});
const messageId = listMessagesRes.messages[0].id;

// Get the message using the message ID.
const message = await gmail.users.messages.get({
  userId: email,
  id: messageId
});

return message;

ניתוח של תמונות מצורפות

אם להודעה מצורפת תמונה, watchGmailMessages יקרא ל-Cloud Vision API כדי להוסיף הערות לתמונה. ב-Codelab הזה, תבקשו מ-Cloud Vision API לסווג את התמונה ולהחזיר כמה תגי תמונה; לדוגמה, אם תספקו אותו באמצעות תמונה של שמיים כחולים, Cloud Vision API יחזיר את התגים blue (כחול), sky (שמיים) ו-nature (טבע).

הפקודה watchGmailMessages משתמשת בספריית Cloud Vision API עבור Node.js כדי לקרוא ל-Cloud Vision API:

// Tag the attachment using Cloud Vision API
const analyzeAttachment = async (data, filename) => {
  var topLabels = ['', '', ''];
  if (filename.endsWith('.png') || filename.endsWith('.jpg')) {
    const [analysis] = await visionClient.labelDetection({
      image: {
        content: Buffer.from(data, 'base64')
      }
    });
    const labels = analysis.labelAnnotations;
    topLabels = labels.map(x => x.description).slice(0, 3);
  }

  return topLabels;
};

עדכון הגיליון האלקטרוני ב-Google Sheets

תוצאות הניתוח מיוצאות על ידי watchGmailMessages לגיליון אלקטרוני ב-Google Sheets. היא כוללת את שם השולח, שם הקובץ המצורף ותגים של תמונות שצורפו (אם יש).

קודם כול, יוצרים גיליון אלקטרוני ב-Google Sheets. פותחים את Google Sheets ולוחצים על התבנית ריקה בקטע יצירת גיליון אלקטרוני חדש. מעתיקים את המזהה של הגיליון. לדוגמה, אם הכתובת בדפדפן נראית כך:

https://docs.google.com/spreadsheets/d/abcdefghij01234567890/edit#gid=0

המזהה של הגיליון האלקטרוני הוא abcdefghij01234567890. ב-Cloud Shell Code Editor, מעדכנים את gcf-gmail-codelab/pubsub/env_vars.yaml ומחליפים את הערך YOUR-GOOGLE-SHEET-ID בערך משלכם.

watchGmailMessages מתחבר ל-Google Sheets API כדי לצרף מידע:

const updateReferenceSheet = async (from, filename, topLabels) => {
  await googleSheets.spreadsheets.values.append({
    spreadsheetId: SHEET,
    range: SHEET_RANGE,
    valueInputOption: 'USER_ENTERED',
    requestBody: {
      range: SHEET_RANGE,
      majorDimension: 'ROWS',
      values: [
        [from, filename].concat(topLabels)
      ]
    }
  });
};

שלב אחרון

ב-Cloud Shell Code Editor, פותחים את gcf-gmail-codelab/pubsub/env_vars.yaml ומחליפים את YOUR-GOOGLE-CLIENT-ID, YOUR-GOOGLE-CLIENT-SECRET ו-YOUR-GOOGLE-CALLBACK-URL בערכים משלכם. הערכים האלה מופיעים במסוף Google Cloud: פותחים את Cloud Functions בתפריט הניווט השמאלי, בוחרים באפשרות auth_init ברשימת Cloud Functions ומחפשים את הקטע Environment variables.

פורסים את הקוד

מריצים את הפקודה הבאה כדי לפרוס את הפונקציה של Cloud Functions:

cd ~

cd gcf-gmail-codelab/pubsub

gcloud functions deploy watchGmailMessages --runtime=nodejs8 --trigger-topic=gmail-watch --env-vars-file=env_vars.yaml

אם השם של נושא Cloud Pub/Sub הוא שונה מ-gmail-watch, מחליפים את gmail-watch בפקודה שלמעלה בשם הנושא שלכם. פריסת הפונקציה של Cloud Functions עשויה להימשך מספר שניות.

7. רוצה לנסות?

מזל טוב. סיימת! שולחים לעצמכם אימייל עם קובץ מצורף של תמונה. בעוד כמה שניות יוצג לכם גיליון אלקטרוני ב-Google Sheets שיצרתם, שמתעדכן באופן אוטומטי עם המידע שסיפקתם.