מדריך מלא: חיבור Google Chat ל-Apps Script ומשם לימות — עוקף את החסימה, גם בלי חשבון עסקי
-
@דורש-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 במקום לפונקציה של חלל בודד. שני, בשיחה פרטית בדרך כלל מוותרים על מילת ההפעלה, כי כל הודעה בשיחה אחד על אחד ממילא מכוונת לבוט, אז אפשר פשוט לענות על הכל. בקבוצה כן משאירים מילת הפעלה כדי שהבוט לא יתפרץ לכל שיחה.
מכשול אחד ששווה לדעת עליו מראש
בפתיחת שיחה פרטית יזומה מצד הבוט, כלומר כשהבוט הוא זה שמתחיל את השיחה עם מישהו שעדיין לא כתב לו, יש מגבלות תלוי בסוג החשבון וההגדרות. הדרך היציבה ביותר, שכמעט תמיד עובדת, היא שהמשתמש ישלח לבוט הודעה אחת ראשונה. מאותו רגע השיחה קיימת, הבוט רואה אותה, ויכול לענות לה חופשי. אם אתם בונים את זה למשפחה או לקבוצה סגורה, פשוט תבקשו מכל אחד לכתוב לבוט שלום פעם אחת בהתחלה, וזהו.
בקיצור, אין הבדל מהותי בין קבוצה למשתמש בודד. שניהם חללים, ואותו קוד מטפל בשניהם. ההבדל היחיד הוא מאיפה משיגים את המזהה, ולשמור חותמת זמן נפרדת לכל שיחה.
-
@דורש-3
שאלה קטנה.
האם ניסית את המודול ונוכחת שהוא עובד?
איך למשל פותחים חשבון לבוט?! -
-
@אa @הדיבל-המעופף ניסתי לעשות רק קבלת הודעות למערכת (ללא שליחה - כדי לא לפתוח מייל חדש) וזה עובד מעולה!
@דורש-3 אתה פשוט אלוף!!!! -
@דורש-3
עד היום היה צריך חשבון עסקי כדי להשתמש בAPI של גוגל צאט, השתנה משהו? -
@מערכת-קמפיינים לא השתנה, פשוט יש דרך שלא ידעת עליה, תמיד היה צריך חשבון עסקי לשימוש ב-API ותמיד היה אפשר להשתמש ב-API של גוגל צ׳אט המיוחד לגוגל סקריפט
-
@דורש-3 וואו מטורף
אני מחכה לכזה מדריך הרבה זמן
תגיד לי צריך בשביל זה להגדיר משהו ב Google Cloud ?
ובעצם איך השליחה מתבצעת לפי זה באיזה שיטה ?
כי הגדרתי משהו דומה לפי המדריך שלך (עם עזרה של AI)
הקריאה של ההודעות מתבצעת טוב אבל בשליחה יש שגיאות
ממש תודה רבה!!! -
@דורש-3 וואו מטורף
אני מחכה לכזה מדריך הרבה זמן
תגיד לי צריך בשביל זה להגדיר משהו ב Google Cloud ?
ובעצם איך השליחה מתבצעת לפי זה באיזה שיטה ?
כי הגדרתי משהו דומה לפי המדריך שלך (עם עזרה של AI)
הקריאה של ההודעות מתבצעת טוב אבל בשליחה יש שגיאות
ממש תודה רבה!!!היי, תודה, שמח שאהבת!
בקיצור, לא צריך להגדיר כלום ב-Google Cloud. עצם זה שהפעלת את שירות ה-Chat בעורך מספיק.
השליחה עצמה היא פשוט קריאת API שיוצרת הודעה בשם חשבון הבוט, לא webhook ולא משהו מסובך.
לגבי השגיאה שלך, זה קלאסי. קריאה עובדת כי גוגל נותנת הרשאת קריאה לבד, אבל בשליחה, אם היא עשויה עם fetch רגיל, גוגל לא מבינה שאתה צריך גם הרשאת כתיבה, אז זה נדחה. תחליף את השליחה בשורה הזאת:
function post(space, text) { Chat.Spaces.Messages.create({ text: text }, space); }תריץ פעם אחת ידנית, גוגל תבקש לאשר הרשאה חדשה, וזאת בדיוק הכתיבה שחסרה. מאשרים וזה עובד.
אם עדיין נופל, תשלח לי את השגיאה המדויקת ואני אעזור. בהצלחה!
-
@דורש-3
לא הבנתי מה הפעולה הסופית
שיחה טלפונית עם AI ?
או שמיעת עדכונים מצ'אט ?
משהו אחר ??? -
sh0548534047
לפני 8 דקות@דורש-3
לא הבנתי מה הפעולה הסופית
שיחה טלפונית עם AI ?
או שמיעת עדכונים מצ'אט ?
משהו אחר ???בעיקר זה מביא לקו ימות את מה שנכתב בקבוצת הצ'אט, שכל מי שמחייג לקו שומע את ההודעות בקול. שימושי למי שאין לו צ'אט בטלפון והוא רוצה בכל זאת להתעדכן.
ודרך אגב, יש שם גם בוט קטן בצ'אט שעונה על שאלות, אבל זה לא העיקר. העיקר זה החיבור לימות.
-
@דורש-3
כשאני מגדיר ג'מיני אני יכול לשים את זה כשיחה עם AI ?
וכן אם זה מגדיר רק השמעה 000 אז זה דורס את הישנים ואיך בנ"א מקשיב רק פעם ביום איך ישמע את 10 ההודעות האחרונות ?
שלום! נראה שהשיחה הזו מעניינת אותך, אבל עדיין אין לך חשבון.
נמאס לכם לגלול בין אותם הפוסטים בכל ביקור? כשנרשמים לחשבון, תמיד תחזרו בדיוק למקום שבו הייתם קודם, ותוכלו לבחור לקבל התראות על תגובות חדשות (בין אם במייל, ובין אם בהתראת פוש). תוכלו גם לשמור סימניות ולפרגן ב-upvote לפוסטים כדי להביע הערכה לחברי קהילה אחרים.
בעזרת התרומה שלך, הפוסט הזה יכול להיות אפילו טוב יותר 💗
הרשמה התחברות