• דף הבית
    • אינדקס קישורים
    • פוסטים אחרונים
    • משתמשים
    • חיפוש בהגדרות המתקדמות
    • חיפוש גוגל בפורום
    • ניהול המערכת
    • ניהול המערכת - שרת private
    • הרשמה
    • התחברות

    מדריך מלא: חיבור Google Chat ל-Apps Script ומשם לימות — עוקף את החסימה, גם בלי חשבון עסקי

    מתוזמן נעוץ נעול הועבר עזרה הדדית למשתמשים מתקדמים
    13 פוסטים 9 כותבים 158 צפיות 4 עוקבים
    טוען פוסטים נוספים
    • מהישן לחדש
    • מהחדש לישן
    • הכי הרבה הצבעות
    תגובה
    • תגובה כנושא
    התחברו כדי לפרסם תגובה
    נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
    • ד מנותק
      דורש 3 @מ.ל.ל
      נערך לאחרונה על ידי

      @מ.ל.ל כתב:

      @דורש-3 לא הבנתי אם זה על קבוצה בלבד או על כל שיחה שיש לי עם משתמש ?

      שאלה מצוינת. התשובה הקצרה: זה עובד בדיוק אותו דבר, כי בגוגל צ'אט גם שיחה פרטית עם משתמש בודד היא בעצם חלל (Space), רק מסוג אחר. קבוצה היא חלל מסוג SPACE, ושיחה פרטית אחד על אחד היא חלל מסוג DIRECT_MESSAGE. מרגע שיש לכם את המזהה של החלל הפרטי, כל שאר המנגנון זהה, אותה בדיקה מחזורית ואותה תגובה.

      ההבדל היחיד הוא איך משיגים את המזהה של השיחה הפרטית, ואיך מטפלים בכמה שיחות במקביל. נסביר את שניהם.

      איך משיגים את מזהה השיחה הפרטית עם משתמש מסוים

      יש שתי דרכים.

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

      הדרך התכנותית: לתת לקוד למצוא או לפתוח את השיחה לבד, לפי מזהה המשתמש. מזהה המשתמש נראה כמו users ואחריו מספר ארוך, והוא מופיע בשדה sender של כל הודעה שאותו אדם כותב. הנה פונקציה שמוצאת את השיחה הפרטית עם משתמש נתון, ואם אין עדיין שיחה, פותחת אחת:

      // מחזירה את מזהה השיחה הפרטית עם משתמש מסוים (users/1234...)
      function getDmSpace(userId) {
        const token = ScriptApp.getOAuthToken();
      
        // קודם מנסים למצוא שיחה קיימת
        const find = UrlFetchApp.fetch(
          'https://chat.googleapis.com/v1/spaces:findDirectMessage?name=' + encodeURIComponent(userId),
          { headers: { Authorization: 'Bearer ' + token }, muteHttpExceptions: true });
        if (find.getResponseCode() === 200) {
          return JSON.parse(find.getContentText()).name; // spaces/XXXX
        }
      
        // אם אין - פותחים שיחה חדשה עם המשתמש
        const setup = UrlFetchApp.fetch('https://chat.googleapis.com/v1/spaces:setup', {
          method: 'post', contentType: 'application/json',
          headers: { Authorization: 'Bearer ' + token },
          payload: JSON.stringify({
            space: { spaceType: 'DIRECT_MESSAGE' },
            memberships: [{ member: { name: userId, type: 'HUMAN' } }]
          }),
          muteHttpExceptions: true
        });
        if (setup.getResponseCode() === 200) {
          return JSON.parse(setup.getContentText()).name;
        }
        console.log('לא הצלחתי לפתוח שיחה', setup.getContentText());
        return null;
      }
      

      איך גורמים לבוט לענות לכמה שיחות פרטיות במקביל

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

      הנה גרסה של הלולאה הראשית שעוברת על רשימת חללים, קבוצות או שיחות פרטיות, ומטפלת בכל אחת בנפרד:

      // רשימת החללים שהבוט מאזין להם - אפשר לערבב קבוצות ושיחות פרטיות
      const SPACES = [
        'spaces/PASTE_GROUP_ID',   // קבוצה
        'spaces/PASTE_DM_ID'       // שיחה פרטית עם משתמש מסוים
      ];
      
      function checkAll() {
        for (const space of SPACES) {
          checkOneSpace(space);
        }
      }
      
      function checkOneSpace(space) {
        const props = PropertiesService.getScriptProperties();
        const key = 'last_' + space;           // חותמת זמן נפרדת לכל חלל
        const last = props.getProperty(key);
      
        if (!last) { props.setProperty(key, new Date().toISOString()); return; }
      
        const res = Chat.Spaces.Messages.list(space, { pageSize: 15, orderBy: 'createTime desc' });
        const fresh = (res.messages || []).filter(m => m.createTime > last);
        if (!fresh.length) return;
        props.setProperty(key, fresh[0].createTime);
        fresh.reverse();
      
        for (const m of fresh) {
          if (isSelf(m)) continue;
          const t = (m.text || '').trim();
          if (!t) continue;
          // בשיחה פרטית לרוב לא צריך מילת הפעלה, כי כל הודעה מכוונת לבוט
          const answer = ask(t);
          if (answer) postTo(space, answer);
        }
      }
      
      // כמו post מהמדריך, רק שמקבל לאיזה חלל לכתוב
      function postTo(space, text) {
        UrlFetchApp.fetch('https://chat.googleapis.com/v1/' + space + '/messages', {
          method: 'post', contentType: 'application/json',
          headers: { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() },
          payload: JSON.stringify({ text: text }), muteHttpExceptions: true
        });
      }
      

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

      מכשול אחד ששווה לדעת עליו מראש

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

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

      תגובה 1 תגובה אחרונה תגובה ציטוט 3
      • א מנותק
        אA @דורש 3
        נערך לאחרונה על ידי

        @דורש-3
        שאלה קטנה.
        האם ניסית את המודול ונוכחת שהוא עובד?
        איך למשל פותחים חשבון לבוט?!

        ה תגובה 1 תגובה אחרונה תגובה ציטוט 0
        • ה מנותק
          הדיבל המעופף @אA
          נערך לאחרונה על ידי

          @אA כתב:

          איך למשל פותחים חשבון לבוט?!

          הוא מתכוון לחשבון גוגל רגיל שעליו תתקין את הבוט

          תגובה 1 תגובה אחרונה תגובה ציטוט 1
          • מ מנותק
            מאיר מלמד
            נערך לאחרונה על ידי

            @אa @הדיבל-המעופף ניסתי לעשות רק קבלת הודעות למערכת (ללא שליחה - כדי לא לפתוח מייל חדש) וזה עובד מעולה!
            @דורש-3 אתה פשוט אלוף!!!!

            תגובה 1 תגובה אחרונה תגובה ציטוט 1
            • מ מחובר
              מערכת קמפיינים @דורש 3
              נערך לאחרונה על ידי

              @דורש-3
              עד היום היה צריך חשבון עסקי כדי להשתמש בAPI של גוגל צאט, השתנה משהו?

              C תגובה 1 תגובה אחרונה תגובה ציטוט 0
              • C מנותק
                CUBASE @מערכת קמפיינים
                נערך לאחרונה על ידי

                @מערכת-קמפיינים לא השתנה, פשוט יש דרך שלא ידעת עליה, תמיד היה צריך חשבון עסקי לשימוש ב-API ותמיד היה אפשר להשתמש ב-API של גוגל צ׳אט המיוחד לגוגל סקריפט

                תגובה 1 תגובה אחרונה תגובה ציטוט 3
                • E מנותק
                  EM @דורש 3
                  נערך לאחרונה על ידי

                  @דורש-3 וואו מטורף
                  אני מחכה לכזה מדריך הרבה זמן
                  תגיד לי צריך בשביל זה להגדיר משהו ב Google Cloud ?
                  ובעצם איך השליחה מתבצעת לפי זה באיזה שיטה ?
                  כי הגדרתי משהו דומה לפי המדריך שלך (עם עזרה של AI)
                  הקריאה של ההודעות מתבצעת טוב אבל בשליחה יש שגיאות
                  ממש תודה רבה!!!

                  ד תגובה 1 תגובה אחרונה תגובה ציטוט 0
                  • ד מנותק
                    דורש 3 @EM
                    נערך לאחרונה על ידי

                    @EM כתב:

                    @דורש-3 וואו מטורף
                    אני מחכה לכזה מדריך הרבה זמן
                    תגיד לי צריך בשביל זה להגדיר משהו ב Google Cloud ?
                    ובעצם איך השליחה מתבצעת לפי זה באיזה שיטה ?
                    כי הגדרתי משהו דומה לפי המדריך שלך (עם עזרה של AI)
                    הקריאה של ההודעות מתבצעת טוב אבל בשליחה יש שגיאות
                    ממש תודה רבה!!!

                    היי, תודה, שמח שאהבת!

                    בקיצור, לא צריך להגדיר כלום ב-Google Cloud. עצם זה שהפעלת את שירות ה-Chat בעורך מספיק.

                    השליחה עצמה היא פשוט קריאת API שיוצרת הודעה בשם חשבון הבוט, לא webhook ולא משהו מסובך.

                    לגבי השגיאה שלך, זה קלאסי. קריאה עובדת כי גוגל נותנת הרשאת קריאה לבד, אבל בשליחה, אם היא עשויה עם fetch רגיל, גוגל לא מבינה שאתה צריך גם הרשאת כתיבה, אז זה נדחה. תחליף את השליחה בשורה הזאת:

                    function post(space, text) {
                      Chat.Spaces.Messages.create({ text: text }, space);
                    }
                    

                    תריץ פעם אחת ידנית, גוגל תבקש לאשר הרשאה חדשה, וזאת בדיוק הכתיבה שחסרה. מאשרים וזה עובד.

                    אם עדיין נופל, תשלח לי את השגיאה המדויקת ואני אעזור. בהצלחה!

                    S תגובה 1 תגובה אחרונה תגובה ציטוט 0
                    • S מנותק
                      sh0548534047 @דורש 3
                      נערך לאחרונה על ידי

                      @דורש-3
                      לא הבנתי מה הפעולה הסופית
                      שיחה טלפונית עם AI ?
                      או שמיעת עדכונים מצ'אט ?
                      משהו אחר ???

                      ד תגובה 1 תגובה אחרונה תגובה ציטוט 0
                      • ד מנותק
                        דורש 3 @sh0548534047
                        נערך לאחרונה על ידי

                        @sh0548534047 כתב:

                        sh0548534047
                        לפני 8 דקות

                        @דורש-3
                        לא הבנתי מה הפעולה הסופית
                        שיחה טלפונית עם AI ?
                        או שמיעת עדכונים מצ'אט ?
                        משהו אחר ???

                        בעיקר זה מביא לקו ימות את מה שנכתב בקבוצת הצ'אט, שכל מי שמחייג לקו שומע את ההודעות בקול. שימושי למי שאין לו צ'אט בטלפון והוא רוצה בכל זאת להתעדכן.

                        ודרך אגב, יש שם גם בוט קטן בצ'אט שעונה על שאלות, אבל זה לא העיקר. העיקר זה החיבור לימות.

                        S תגובה 1 תגובה אחרונה תגובה ציטוט 0
                        • S מנותק
                          sh0548534047 @דורש 3
                          נערך לאחרונה על ידי

                          @דורש-3
                          כשאני מגדיר ג'מיני אני יכול לשים את זה כשיחה עם AI ?
                          וכן אם זה מגדיר רק השמעה 000 אז זה דורס את הישנים ואיך בנ"א מקשיב רק פעם ביום איך ישמע את 10 ההודעות האחרונות ?

                          תגובה 1 תגובה אחרונה תגובה ציטוט 0

                          שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.

                          נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.

                          בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗

                          הרשמה התחברות
                          • פוסט ראשון
                            פוסט אחרון