תיעוד 1
Go WhatsApp: בנוי לשימוש יעיל בזיכרון
אם אתה משתמש בכלי זה כדי לייצר הכנסה, שקול לתמוך בפיתוח שלו על ידי הצטרפות כחבר ב-Patreon!
התמיכה שלך עוזרת להבטיח שהפרויקט ימשיך להתוחזק ויקבל עדכונים שוטפים!
#תמיכה ב-ARM, AMD64 ו-MCP
הורדה:
#צומת קהילה של n8n
- חבילת n8n
- עבור אל Settings → Community Nodes, הזן
@aldinokemal2104/n8n-nodes-gowa, ובחר Install.
#שינויים שוברים
v6- מצב
RESTדורש<binary> restבמקום<binary>.- דוגמה:
./whatsapp restבמקום./whatsapp.
- דוגמה:
- מצב
MCPדרש<binary> mcp.- דוגמה:
./whatsapp mcp.
- דוגמה:
- מצב
v7- החל מגרסה 7.x, קבצים בינאריים נבנים באמצעות
GoReleaserוניתן להוריד אותם מהשחרור האחרון.
- החל מגרסה 7.x, קבצים בינאריים נבנים באמצעות
v8תמיכה בריבוי מכשירים: כעת ניתן לחבר ולנהל מספר חשבונות WhatsApp בו זמנית במופע שרת יחיד.
API חדש לניהול מכשירים: נקודות קצה חדשות תחת
/devicesמנהלות מספר מכשירים.חובת הגדרת טווח מכשיר (Device scoping): כל קריאות ה-REST API ברמת המכשיר דורשות כעת אחד מהשניים:
- כותרת
X-Device-Id, או - פרמטר שאילתה
device_id. - אם רשום מכשיר אחד בלבד, הוא משמש כברירת מחדל.
- כותרת
הגדרת טווח מכשיר ב-WebSocket: התחבר אל
/ws?device_id=<id>כדי להגדיר את טווח חיבור ה-WebSocket למכשיר מסוים.תמיכה בממשק משתמש מרוחק: CORS מאפשר את הכותרות
Authorizationו-X-Device-Id, כך שממשק אינטרנט עצמאי (לדוגמה, gowa-ui) שמתארח במקור אחר יכול לקרוא ל-API ישירות.GET /app/infoחושף את הגרסה ומגבלות גודל המדיה. מכיוון שדפדפנים אינם יכולים להגדיר כותרות בחיבורי WebSocket, העבר/ws?device_id=<id>&authorization=<base64(user:pass)>כאשר Basic Auth מופעל (השתמש ב-TLS, פרטי ההזדהות גלויים ב-URL).שינויים במבנה נתוני Webhook (Payload): כל נתוני ה-webhook כוללים כעת שדה ברמה העליונה בשם
device_idשמזהה איזה מכשיר קיבל את האירוע:{ "event": "message", "device_id": "[email protected]", "payload": { ... } }
v9- MCP ו-API מאוחדים תחת
rest: MCP אינו עוד מצב או תהליך נפרד. הפעל./whatsapp restכדי להגיש גם את ה-REST API וגם את ה-MCP. ה-MCP זמין ב-/mcp(ללא פקודת משנה עצמאיתmcp). ראה שרת MCP (Model Context Protocol) לפרטי הגירה. - ממשק המשתמש הועבר למאגר נפרד: לוח הבקרה ברשת אינו כלול עוד במאגר זה. כעת הוא נמצא ב-aldinokemal/gowa-ui ומופץ כקובץ עצמאי יחיד
gowa-ui.html. השרת מוריד את שחרור לוח הבקרה האחרון בעת ההפעלה, מאמת את סיכום ה-SHA-256 שלו, שומר אותו במטמון תחתstorages/ui/, ומגיש אותו ב-/. ראה לוח בקרה ברשת (gowa-ui) עבור הגדרותAPP_UI_*, נעילת שרשרת אספקה ופריסה בסביבה מבודדת רשת (air-gapped).
- MCP ו-API מאוחדים תחת
#תכונות
שליחת הודעות WhatsApp דרך ה-HTTP API. ראה docs/openapi.yaml לפרטים.
תמיכה בשרת MCP (Model Context Protocol): שילוב עם סוכני וכלי AI באמצעות פרוטוקול סטנדרטי.
MCP OAuth 2.1 אופציונלי: חיבור לקוחות MCP מרוחקים שאינם יכולים לספק כותרת Basic Auth. ראה MCP OAuth.
אזכור משתמשים:
@phoneNumber- דוגמה:
Hello @628974812XXXX, @628974812XXXX
אזכורי רפאים (אזכור כולם): אזכור משתתפי קבוצה בלי להציג
@phoneבטקסט ההודעה.- העבר מספרי טלפון בשדה
mentionsכדי לאזכר משתמשים ללא@גלוי בהודעה. - השתמש במילת המפתח המיוחדת
@everyoneכדי לאזכר אוטומטית את כל משתתפי הקבוצה.
- העבר מספרי טלפון בשדה
פרסום עדכוני סטטוס ב-WhatsApp.
סימון הודעות שמע והודעות קוליות נכנסות כמושמעות.
שליחת מדבקות: המרה אוטומטית של תמונות לפורמט מדבקה של WebP.
- תמיכה בפורמטים JPG, JPEG, PNG, WebP ו-GIF.
- שינוי גודל אוטומטי של תמונות ל-512×512 פיקסלים.
- שמירה על שקיפות בתמונות PNG.
- מדבקות WebP מונפשות נתמכות אך חייבות לעמוד בדרישות WhatsApp:
- בדיוק 512×512 פיקסלים.
- פחות מ-500 KB.
- אורך של לא יותר מ-10 שניות.
- אם מדבקה מונפשת אינה עומדת בדרישות אלה, שנה את גודלה לפני ההעלאה באמצעות כלי כגון ezgif.com.
דחיסת תמונות לפני שליחה.
דחיסת סרטונים לפני שליחה.
התאמה אישית של שם מערכת ההפעלה המוצג כשם המכשיר המקושר ב-WhatsApp:
--os=Chromeאו--os=MyApplication
אימות בסיסי (Basic Auth) עם מספר פרטי הזדהות:
--basic-auth=kemal:secret,toni:password,userName:secretPassword- צורה מקוצרת:
-b=kemal:secret,toni:password,userName:secretPassword
תמיכה בפריסה תחת נתיב משנה:
--base-path="/gowa"מאפשר פריסה תחת נתיב כגון/gowa.
יציאה (Port) ומצב ניפוי שגיאות (Debug) ניתנים להתאמה:
--port 8000--debug true
מענה אוטומטי להודעות נכנסות:
--autoreply="Don't reply to this message"
סימון אוטומטי של הודעות נכנסות כנקראו:
--auto-mark-read=true
הורדה אוטומטית של מדיה מהודעות נכנסות:
--auto-download-media=falseמשבית הורדות מדיה אוטומטיות (ברירת מחדל:true).
התעלמות מהורדת מדיה מסטטוסים:
--ignore-status-media=trueמשבית הורדת מדיה מסטטוסים (ברירת מחדל:false).
דחייה אוטומטית של שיחות נכנסות:
--auto-reject-call=trueאוWHATSAPP_AUTO_REJECT_CALL=true(ראה Webhook Payload עבור אירועי שיחות).
נוכחות (Presence) ניתנת להגדרה בעת התחברות:
--presence-on-connect=unavailableאוWHATSAPP_PRESENCE_ON_CONNECT=unavailableavailable: סמן את החשבון כמחובר (משתיק התראות בטלפון).unavailable: רישום שם ה-push מבלי להתחבר (ברירת מחדל, שומר על התראות בטלפון).none: דילוג מלא על נוכחות (שם ה-push אינו נרשם, כך שאנשי קשר עשויים לראות-כשם).
פעימת נוכחות יומית:
--presence-pulse-enabled=trueאוWHATSAPP_PRESENCE_PULSE_ENABLED=true(ברירת מחדל:true).--presence-pulse-interval=24hשולט בתדירות שבה מבוצעת פעימה לכל מכשיר מחובר.--presence-pulse-duration=5mשולט במשך הזמן שבו החשבון נשאר במצבavailableלפני חזרה למצבunavailable.
Webhooks עבור הודעות שהתקבלו ואירועים אחרים:
--webhook="http://yourwebhook.site/handler"- צורה מקוצרת:
-w="http://yourwebhook.site/handler" - ראה תיעוד נתוני Webhook לפרטים.
Webhooks לכל מכשיר: לכל מכשיר יכולה להיות כתובת URL של webhook ומסנני אירועים משלו.
- הגדרה דרך API:
PATCH /devices/:device_id/webhookעם{"webhook_url": "https://device-webhook.site/handler"}. - קבלה דרך API:
GET /devices/:device_id/webhook. - כאשר למכשיר יש webhook מותאם אישית, אירועים עבור אותו מכשיר נשלחים לכתובת הספציפית למכשיר.
- כאשר לא מוגדר webhook למכשיר, אירועים נופלים לברירת המחדל של ה-webhook הגלובלי (
--webhook). - הגדר את
webhook_urlכמחרוזת ריקה עםPATCHכדי לנקות אותו ולהשתמש ב-webhook הגלובלי. - הגדר את
WHATSAPP_WEBHOOK_DEVICE_MERGE_GLOBAL=true(או--webhook-device-merge-global=true) כדי להפוך webhook של מכשיר לתוספת במקום תחליף: כתובות ה---webhookהגלובליות עדיין יקבלו את אירועי המכשיר (חתומים באמצעות הסוד הגלובלי, מסוננים לפיWHATSAPP_WEBHOOK_EVENTS) בעוד שכתובת ה-URL של המכשיר שומרת על הסוד ומסנן האירועים שלה.
- הגדרה דרך API:
חתימות Webhook: בקשות Webhook כוללות חתימת HMAC-SHA-256 בכותרת
X-Hub-Signature-256, שנוצרת באמצעות מפתח ברירת המחדלsecret.שנה את המפתח באמצעות:
--webhook-secret="secret"
תיעוד נתוני Webhook: עבור סכמות מפורטות, יישום אבטחה ודוגמאות שילוב, ראה תיעוד נתוני Webhook.
סינון אירועי Webhook: סנן אילו אירועים מועברים ל-webhook שלך באמצעות:
--webhook-events="message,message.ack"(רשימה מופרדת בפסיקים), אוWHATSAPP_WEBHOOK_EVENTS=message,message.ack.
אירועי Webhook זמינים:
Event תיאור messageהודעות טקסט, מדיה, איש קשר, מיקום message.reactionתגובות אימוג'י להודעות message.revokedהודעות שנמחקו/בוטלו message.editedהודעות שנערכו message.ackאישורי מסירה וקריאה message.deletedהודעות שנמחקו עבור המשתמש chat_presenceמחווני הקלדה והקלטה מאנשי קשר group.participantsאירועי הצטרפות, עזיבה, קידום והורדה של חברי קבוצה group.joinedצורפת לקבוצה label.editמטא-נתונים של תווית WhatsApp השתנו label.associationתווית הוחלה על צ'אט או הוסרה ממנו newsletter.joinedנרשמת לניוזלטר/ערוץ newsletter.leftביטלת הרשמה לניוזלטר newsletter.messageהודעות חדשות שפורסמו בניוזלטר newsletter.muteהגדרת השתקת ניוזלטר השתנתה call.offerהתקבלה שיחה נכנסת אם הגדרה זו ריקה, כל האירועים מועברים.
סינון JID ב-Webhook
ניתן לדלג על אירועים עבור צ'אטים או שולחים ספציפיים (לדוגמה, להשתיק את כל הקבוצות) לפני שהם מועברים:
--webhook-ignore-jids="@g.us,[email protected]"(רשימה מופרדת בפסיקים), או[email protected].- תומך בתווים כלליים מסוג
@g.us/@s.whatsapp.net/@lid(התאמה למרחב כתובות שלם) וב-JID מדויקים. - פעולה זו מסננת לפי שיחה או שולח ואינה תלויה ב-
--webhook-events, שמסנן לפי סוג אירוע. לשילוב עם Chatwoot יש הגדרתCHATWOOT_IGNORE_JIDSנפרדת.
תצורת TLS ב-Webhook
אם אתה נתקל בשגיאות אימות תעודת TLS בעת שימוש ב-webhooks (לדוגמה, עם מנהרות Cloudflare או תעודות בחתימה עצמית):
tls: failed to verify certificate: x509: certificate signed by unknown authorityניתן להשבית את אימות תעודת ה-TLS באמצעות:
--webhook-insecure-skip-verify=true, אוWHATSAPP_WEBHOOK_INSECURE_SKIP_VERIFY=true.
אזהרת אבטחה: אפשרות זו משביתה את אימות תעודת ה-TLS ויש להשתמש בה רק בסביבות:
- סביבות פיתוח או בדיקות.
- מנהרות Cloudflare, המספקות שכבת אבטחה משלהן.
- רשתות פנימיות עם תעודות בחתימה עצמית.
עבור סביבות ייצור, השתמש בתעודת TLS תקיפה (לדוגמה, מ-Let's Encrypt) במקום להשבית את האימות.
#תצורה
התצורה נטענת לפי סדר עדיפויות זה:
- דגלי שורת הפקודה (עדיפות עליונה)
- משתני סביבה
- קובץ
.env(עדיפות תחתונה)
#משתני סביבה
כדי להשתמש במשתני סביבה:
- משורש המאגר, העתק את קובץ הדוגמה:
cp src/.env.example src/.env. - עדכן את הערכים ב-
src/.envלפי הצורך. - לחלופין, הגדר את אותם המשתנים בסביבת התהליך.
#משתני סביבה זמינים
| משתנה | תיאור | ברירת מחדל | דוגמה |
|---|---|---|---|
APP_PORT | יציאת היישום | 3000 | APP_PORT=8080 |
APP_HOST | כתובת מארח לקשירת השרת | 0.0.0.0 | APP_HOST=127.0.0.1 |
APP_DEBUG | הפעלת רישום ניפוי שגיאות | false | APP_DEBUG=true |
APP_OS | שם מערכת ההפעלה (שם המכשיר ב-WhatsApp) | GOWA | APP_OS=MyApp |
APP_BASIC_AUTH | פרטי אימות בסיסי (Basic authentication) | - | APP_BASIC_AUTH=user1:pass1,user2:pass2 |
APP_BASE_PATH | נתיב בסיס לפריסה תחת נתיב משנה | - | APP_BASE_PATH=/gowa |
APP_TRUSTED_PROXIES | טווחי IP של פרוקסי מהימנים עבור Reverse Proxy | - | APP_TRUSTED_PROXIES=0.0.0.0/0 |
APP_CORS_ALLOWED_ORIGINS | מקורות CORS מורשים (כל מקור כאשר ריק) | - | APP_CORS_ALLOWED_ORIGINS=https://ui.example.com |
APP_UI_ENABLED | הגשת לוח הבקרה gowa-ui שהורד | true | APP_UI_ENABLED=false |
APP_UI_AUTO_UPDATE | הורדה ורענון מעת לעת של לוח הבקרה האחרון | true | APP_UI_AUTO_UPDATE=false |
APP_UI_REPO | מאגר GitHub המכיל שחרורים של gowa-ui | aldinokemal/gowa-ui | APP_UI_REPO=my-org/gowa-ui |
APP_UI_ASSET_NAME | שם קובץ הנכס של שחרור לוח הבקרה | gowa-ui.html | APP_UI_ASSET_NAME=gowa-ui.html |
APP_UI_UPDATE_INTERVAL | מרווח זמן בין בדיקות עדכון לוח הבקרה | 3h | APP_UI_UPDATE_INTERVAL=6h |
APP_UI_GITHUB_TOKEN | טוקן GitHub אופציונלי למגבלת קצב גבוהה יותר ב-API | - | APP_UI_GITHUB_TOKEN=github_pat_xxx |
APP_UI_ASSET_SHA256 | נעילת SHA-256 אופציונלית לנכס לוח הבקרה | - | APP_UI_ASSET_SHA256=<hex-digest> |
MCP_ENABLED | הגשת נקודת קצה של MCP ב-HTTP בר-הזרמה ב-/mcp | true | MCP_ENABLED=false |
MCP_OAUTH_ENABLED | הפעלת אימות OAuth 2.1 עבור MCP | false | MCP_OAUTH_ENABLED=true |
MCP_OAUTH_ISSUER_URL | כתובת HTTPS ציבורית של מנפיק ה-OAuth | - | MCP_OAUTH_ISSUER_URL=https://gowa.example.com |
MCP_OAUTH_RESOURCE_URL | כתובת MCP קנונית ציבורית אופציונלית | נגזר מהמנפיק ונתיב הבסיס | MCP_OAUTH_RESOURCE_URL=https://gowa.example.com/mcp |
MCP_OAUTH_DB_URI | URI של SQLite עבור לקוחות OAuth, קודים וגיבובי טוקנים | file:storages/oauth.db | MCP_OAUTH_DB_URI=file:storages/oauth.db |
DB_URI | URI לחיבור מסד הנתונים | file:storages/whatsapp.db | DB_URI=postgres://user:pass@host/db |
DB_KEYS_URI | URI אופציונלי למסד נתונים עבור מטמון מפתחות הצפנה/הפעלה. השאר ריק כדי להשתמש ב-DB_URI; הימנע מאחסון בזיכרון בייצור מכיוון שהפעלות מחדש עלולות לאבד את מצב הפעלת WhatsApp. | - | DB_KEYS_URI=file:storages/whatsapp-keys.db?_foreign_keys=on |
CHAT_STORAGE_MAX_OPEN_CONNS | מספר מרבי של חיבורי SQLite מקבילים לאחסון צ'אטים | 5 | CHAT_STORAGE_MAX_OPEN_CONNS=10 |
WHATSAPP_AUTO_REPLY | הודעת מענה אוטומטי | - | WHATSAPP_AUTO_REPLY="Auto reply message" |
WHATSAPP_AUTO_MARK_READ | סימון אוטומטי של הודעות נכנסות כנקראו | false | WHATSAPP_AUTO_MARK_READ=true |
WHATSAPP_AUTO_DOWNLOAD_MEDIA | הורדה אוטומטית של מדיה מהודעות נכנסות | true | WHATSAPP_AUTO_DOWNLOAD_MEDIA=false |
WHATSAPP_IGNORE_STATUS_MEDIA | התעלמות מהורדת מדיה מסטטוסים (status@broadcast) | false | WHATSAPP_IGNORE_STATUS_MEDIA=true |
WHATSAPP_AUTO_REJECT_CALL | דחייה אוטומטית של שיחות WhatsApp נכנסות | false | WHATSAPP_AUTO_REJECT_CALL=true |
WHATSAPP_WEBHOOK | כתובות URL של webhook עבור אירועים (מופרדות בפסיקים) | - | WHATSAPP_WEBHOOK=https://webhook.site/xxx |
WHATSAPP_WEBHOOK_SECRET | סוד Webhook לאימות | secret | WHATSAPP_WEBHOOK_SECRET=super-secret-key |
WHATSAPP_WEBHOOK_INSECURE_SKIP_VERIFY | דילוג על אימות TLS עבור webhooks (לא מאובטח) | false | WHATSAPP_WEBHOOK_INSECURE_SKIP_VERIFY=true |
WHATSAPP_WEBHOOK_EVENTS | רשימה לבנה של אירועים להעברה (מופרדת בפסיקים, ריק = הכל) | - | WHATSAPP_WEBHOOK_EVENTS=message,message.ack |
WHATSAPP_WEBHOOK_IGNORE_JIDS | מזהי JID/תווים כלליים לדילוג בעת העברה (מופרדים בפסיקים) | - | [email protected] |
WHATSAPP_WEBHOOK_DEVICE_MERGE_GLOBAL | webhook לכל מכשיר מתווסף לכתובות הגלובליות במקום להחליף אותן | false | WHATSAPP_WEBHOOK_DEVICE_MERGE_GLOBAL=true |
WHATSAPP_ACCOUNT_VALIDATION | הפעלת אימות חשבון | true | WHATSAPP_ACCOUNT_VALIDATION=false |
WHATSAPP_PRESENCE_ON_CONNECT | נוכחות בעת חיבור: available, unavailable, או none | unavailable | WHATSAPP_PRESENCE_ON_CONNECT=unavailable |
WHATSAPP_PROXY | פרוקסי יוצא עבור WebSocket של WhatsApp (SOCKS5/HTTP/HTTPS) | - | WHATSAPP_PROXY=socks5://user:pass@host:1080 |
WHATSAPP_PRESENCE_PULSE_ENABLED | הפעלת פעימת נוכחות יומית available/unavailable | true | WHATSAPP_PRESENCE_PULSE_ENABLED=false |
WHATSAPP_PRESENCE_PULSE_INTERVAL | מרווח זמן בין פעימות נוכחות | 24h | WHATSAPP_PRESENCE_PULSE_INTERVAL=24h |
WHATSAPP_PRESENCE_PULSE_DURATION | משך זמן השהייה במצב available במהלך כל פעימה | 5m | WHATSAPP_PRESENCE_PULSE_DURATION=5m |
CHATWOOT_ENABLED | הפעלת שילוב Chatwoot | false | CHATWOOT_ENABLED=true |
CHATWOOT_URL | כתובת URL של מופע Chatwoot | - | CHATWOOT_URL=https://app.chatwoot.com |
CHATWOOT_API_TOKEN | טוקן גישה ל-API של Chatwoot | - | CHATWOOT_API_TOKEN=your-api-token |
CHATWOOT_ACCOUNT_ID | מזהה חשבון Chatwoot | - | CHATWOOT_ACCOUNT_ID=12345 |
CHATWOOT_INBOX_ID | מזהה תיבת דואר נכנס של Chatwoot | - | CHATWOOT_INBOX_ID=67890 |
CHATWOOT_DEVICE_ID | מזהה מכשיר WhatsApp עבור Chatwoot (ברירת מחדל למכשיר יחיד/סביבה) | - | [email protected] |
CHATWOOT_ALLOWED_HOSTS | רשימה מורשית של מארחי Chatwoot לתצורות של מכשירים (הגנת SSRF) | - | CHATWOOT_ALLOWED_HOSTS=app.chatwoot.com,chat.example.com |
CHATWOOT_IMPORT_MESSAGES | הפעלת סנכרון היסטוריית הודעות ל-Chatwoot | false | CHATWOOT_IMPORT_MESSAGES=true |
CHATWOOT_DAYS_LIMIT_IMPORT_MESSAGES | מספר ימי היסטוריה לייבוא | 3 | CHATWOOT_DAYS_LIMIT_IMPORT_MESSAGES=7 |
CHATWOOT_IMPORT_DB_URI | URI ישיר של PostgreSQL של Chatwoot לסנכרון היסטוריה | - | CHATWOOT_IMPORT_DB_URI=postgresql://user:pass@host:5432/chatwoot_production?sslmode=disable |
CHATWOOT_IMPORT_PLACEHOLDER_MEDIA_MESSAGE | הוספת שומרי מקום טקסטואליים לשורות מדיה במהלך ייבוא ישיר ממסד הנתונים | true | CHATWOOT_IMPORT_PLACEHOLDER_MEDIA_MESSAGE=true |
CHATWOOT_IMPORT_MEDIA_WITH_REST | העלאת שורות מדיה מייבוא ישיר ממסד הנתונים דרך Chatwoot REST | false | CHATWOOT_IMPORT_MEDIA_WITH_REST=true |
CHATWOOT_AUTO_CREATE | יצירה אוטומטית או שימוש חוזר בתיבת דואר נכנס של Chatwoot API בעת ההפעלה | false | CHATWOOT_AUTO_CREATE=true |
CHATWOOT_INBOX_NAME | שם תיבת הדואר הנכנס המשמש כאשר יצירה אוטומטית מופעלת | WhatsApp | CHATWOOT_INBOX_NAME=WhatsApp Support |
CHATWOOT_WEBHOOK_URL | כתובת URL ציבורית של webhook לתגובות Chatwoot של GOWA | - | CHATWOOT_WEBHOOK_URL=https://api.example.com/chatwoot/webhook?secret=shared |
CHATWOOT_WEBHOOK_SECRET | סוד משותף הנדרש עבור webhooks נכנסים של Chatwoot | - | CHATWOOT_WEBHOOK_SECRET=shared |
CHATWOOT_REOPEN_CONVERSATION | פתיחה מחדש של שיחות Chatwoot שנפתרו עבור אנשי קשר שחוזרים | true | CHATWOOT_REOPEN_CONVERSATION=false |
CHATWOOT_CONVERSATION_PENDING | יצירת שיחות Chatwoot חדשות במצב ממתין (pending) | false | CHATWOOT_CONVERSATION_PENDING=true |
CHATWOOT_IGNORE_JIDS | מזהי JID או תווים כלליים להחרגה מהעברה ל-Chatwoot | - | [email protected],[email protected] |
CHATWOOT_SIGN_MSG | הקדמת שם הנציג לתשובות נציג מ-Chatwoot | false | CHATWOOT_SIGN_MSG=true |
CHATWOOT_SIGN_DELIMITER | תוחם בין חתימת נציג Chatwoot לגוף ההודעה | \n\n | CHATWOOT_SIGN_DELIMITER=" - " |
CHATWOOT_FORWARD_EDITS | שיקוף עריכות מ-WhatsApp בהערות משורשרות ב-Chatwoot | true | CHATWOOT_FORWARD_EDITS=false |
CHATWOOT_FORWARD_DELETES | שיקוף אירועי מחיקה לכולם מ-WhatsApp בהערות ב-Chatwoot | true | CHATWOOT_FORWARD_DELETES=false |
CHATWOOT_MESSAGE_READ | סנכרון מצב קריאה עבור הודעות מקושרות בין WhatsApp ל-Chatwoot | false | CHATWOOT_MESSAGE_READ=true |
CHATWOOT_MESSAGE_DELETE | מחיקת הודעות מקושרות בצד הנגדי כאשר מדווחת מחיקה | false | CHATWOOT_MESSAGE_DELETE=true |
תיעוד:
- לסכמות מפורטות של נתוני webhook, יישום אבטחה ודוגמאות שילוב, ראה Webhook Payload Documentation.
- למדריך השילוב המקיף של Chatwoot, ראה Chatwoot Integration Documentation.
- לפרטי פריסה ואבטחה של OAuth, ראה MCP OAuth.
הפעל ./whatsapp --help כדי לראות את כל דגלי שורת הפקודה.
#דרישות
#דרישות מערכת
- Go 1.26.0 ומעלה (בעת בנייה מקוד מקור)
- FFmpeg (לעיבוד מדיה)
#פלטפורמות נתמכות
- Linux (x86_64, ARM64)
- macOS (Intel, Apple Silicon)
- Windows (x86_64; מומלץ WSL)
#תלויות (ללא Docker)
- macOS:
brew install ffmpeg webpexport CGO_CFLAGS_ALLOW="-Xpreprocessor"
- Linux:
sudo apt updatesudo apt install ffmpeg webp
- Windows (מומלץ WSL; ראה Install WSL):
הערה: החבילה
webpמספקת את הכליםcwebp(מקודד),dwebp(מפענח) ו-webpmux(חולץ פריימים). FFmpeg נדרש לעיבוד מדיה. כלי libwebp (webpmux+dwebp) משמשים לתמיכה במדבקות WebP מונפשות.
#אופן השימוש
#בסיסי
- שכפל את המאגר:
git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice. - פתח את הספרייה המשוכפלת במסוף.
- הרץ
cd src. - הרץ
go run . rest. - פתח את
http://localhost:3000.
#Docker
Docker מונע את הצורך בהתקנת Go, FFmpeg ו-libwebp ישירות במחשב המארח.
- שכפל את המאגר:
git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice. - פתח את הספרייה המשוכפלת במסוף.
- העתק את קובץ הסביבה:
cp src/.env.example src/.env. - הרץ
docker compose up -d --build. - פתח את
http://localhost:3000.
#בניית קובץ בינארי בעצמך
- שכפל את המאגר:
git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice. - פתח את הספרייה המשוכפלת במסוף.
- הרץ
cd src. - בנה את הקובץ הבינארי:
- Linux ו-macOS:
go build -o whatsapp - Windows (שורת הפקודה או PowerShell):
go build -o whatsapp.exe
- Linux ו-macOS:
- הפעל את השרת:
- Linux ו-macOS:
./whatsapp rest - Windows:
.\whatsapp.exe rest
- Linux ו-macOS:
- פתח את
http://localhost:3000בדפדפן.
הפעל ./whatsapp --help (או .\whatsapp.exe --help ב-Windows) כדי לראות את כל הדגלים.
#הידור צולב עבור Raspberry Pi (ARM)
כדי לבנות עבור Raspberry Pi או מכשיר ARM אחר ללא שרשרת כלי C (כלומר CGO), השתמש בתג הבנייה purego. פעולה זו בוחרת מימוש SQLite ב-Go טהור.
שכפל את המאגר:
git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice.פתח את הספרייה המשוכפלת במסוף.
הרץ
cd src.בנייה עבור Raspberry Pi Zero / 1 (ARMv6):
CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 go build -tags purego -o whatsapp-armv6בנייה עבור Raspberry Pi 2 / 3 / 4 (ARMv7 32-bit):
CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -tags purego -o whatsapp-armv7העבר את הקובץ הבינארי ל-Pi שלך, תן לו הרשאת הרצה (
chmod +x), והפעל אותו:- אם בנית ARMv6:
./whatsapp-armv6 rest - אם בנית ARMv7:
./whatsapp-armv7 rest
- אם בנית ARMv6:
#שרת MCP (Model Context Protocol)
MCP אינו מצב או תהליך נפרד, הוא מוגש על ידי שרת ה-REST עצמו. בכל זמן שבו ./whatsapp rest פועל, נקודת הקצה של MCP זמינה בכתובת http://<host>:<port><base-path>/mcp (ברירת מחדל http://localhost:3000/mcp) באמצעות תעבורת HTTP הניתנת להזרמה. השבת אותה באמצעות MCP_ENABLED=false או --mcp-enabled=false (ברירת מחדל: מופעל).
#כלי MCP זמינים
ישנם חמישה כלים מאוחדים; סוכנים בוחרים התנהגות באמצעות ארגומנט type/action במקום כלי אחד לכל פעולה:
| כלי | ערכי type / action |
|---|---|
whatsapp_send | text, image, video, audio, document, sticker, location, contact, poll, link, forward |
whatsapp_message | react, edit, revoke, delete, mark_read, mark_played, star, unstar, download_media |
whatsapp_chat | list_chats, list_contacts, get_messages, archive |
whatsapp_group | create, join_with_link, leave, info, participants, add_participants, remove_participants, promote, demote, invite_link, set_name, set_topic, set_settings, join_requests, manage_join_requests |
whatsapp_app | status, login_qr, login_code, logout, reconnect |
#בחירת מכשיר
עבור פריסות מרובות מכשירים, הכותרת X-Device-Id בחיבור לקוח ה-MCP בוחרת את המכשיר המשמש עבור כל קריאת כלי באותו חיבור. אם הושמטה, היא נופלת למכשיר ברירת המחדל, בדיוק כמו ב-REST. כל קריאה בודדת יכולה לעקוף זאת באמצעות ארגומנט device_id אופציונלי.
#תצורת MCP
כוון את לקוח ה-MCP שלך אל נקודת הקצה /mcp. היא יורשת את ה-Basic Auth של שרת ה-REST, לכן כלול את אותה כותרת Authorization שבה משתמשות קריאות ה-REST שלך:
{
"mcpServers": {
"whatsapp": {
"url": "http://localhost:3000/mcp",
"headers": {
"Authorization": "Basic dXNlcjpzZWNyZXQ=",
"X-Device-Id": "628123456789"
}
}
}
}headers הוא אופציונלי: כלול את Authorization רק כאשר מוגדר Basic Auth, ואת X-Device-Id רק עבור הגדרות של ריבוי מכשירים.
#OAuth עבור לקוחות MCP מרוחקים
OAuth 2.1 זמין עבור לקוחות מרוחקים שאינם יכולים לצרף כותרת Basic Auth. הוא מושבת כברירת מחדל. תצורה מינימלית היא:
APP_BASIC_AUTH=admin:replace-with-a-strong-password
MCP_ENABLED=true
MCP_OAUTH_ENABLED=true
MCP_OAUTH_ISSUER_URL=https://gowa.example.comכאשר OAuth מופעל, /mcp מקבל טוקן מסוג Bearer או את פרטי ה-Basic Auth המוגדרים. OAuth אינו מבצע אימות לנתיבי REST או UI. ראה MCP OAuth עבור הגדרת לקוח, דרישות Reverse Proxy, התנהגות נתיב משנה ומודל האבטחה.
#מעבר ממצב MCP העצמאי
./whatsapp mcp←./whatsapp rest(MCP נכלל כעת אוטומטית).http://localhost:8080/sse←http://localhost:3000/mcp.- 40 כלים מפורטים ← 5 כלים מאוחדים (סוכנים בוחרים פעולות דרך השדה
type/action).
#שרת REST לייצור (Docker)
שימוש ב-Docker Hub:
docker volume create whatsapp-storages
docker volume create whatsapp-statics
docker run --detach \
--publish 3000:3000 \
--name whatsapp \
--restart always \
--volume whatsapp-storages:/app/storages \
--volume whatsapp-statics:/app/statics \
aldinokemal2104/go-whatsapp-web-multidevice \
rest --autoreply="Don't reply to this message, please"שימוש ב-GitHub Container Registry:
docker volume create whatsapp-storages
docker volume create whatsapp-statics
docker run --detach \
--publish 3000:3000 \
--name whatsapp \
--restart always \
--volume whatsapp-storages:/app/storages \
--volume whatsapp-statics:/app/statics \
ghcr.io/aldinokemal/go-whatsapp-web-multidevice \
rest --autoreply="Don't reply to this message, please"#שרת REST לייצור (Docker Compose)
צור קובץ docker-compose.yml עם אחת מהתצורות הבאות.
שימוש ב-Docker Hub:
services:
whatsapp:
image: aldinokemal2104/go-whatsapp-web-multidevice
container_name: whatsapp
restart: always
ports:
- "3000:3000"
volumes:
- whatsapp_storages:/app/storages
- whatsapp_statics:/app/statics
command:
- rest
- --basic-auth=admin:admin
- --port=3000
- --debug=true
- --os=Chrome
- --account-validation=false
volumes:
whatsapp_storages:
whatsapp_statics:שימוש ב-GitHub Container Registry:
services:
whatsapp:
image: ghcr.io/aldinokemal/go-whatsapp-web-multidevice
container_name: whatsapp
restart: always
ports:
- "3000:3000"
volumes:
- whatsapp_storages:/app/storages
- whatsapp_statics:/app/statics
command:
- rest
- --basic-auth=admin:admin
- --port=3000
- --debug=true
- --os=Chrome
- --account-validation=false
volumes:
whatsapp_storages:
whatsapp_statics:שימוש במשתני סביבה עם Docker Hub:
services:
whatsapp:
image: aldinokemal2104/go-whatsapp-web-multidevice
container_name: whatsapp
restart: always
ports:
- "3000:3000"
volumes:
- whatsapp_storages:/app/storages
- whatsapp_statics:/app/statics
environment:
- APP_BASIC_AUTH=admin:admin
- APP_PORT=3000
- APP_DEBUG=true
- APP_OS=Chrome
- WHATSAPP_ACCOUNT_VALIDATION=false
volumes:
whatsapp_storages:
whatsapp_statics:שימוש במשתני סביבה עם GitHub Container Registry:
services:
whatsapp:
image: ghcr.io/aldinokemal/go-whatsapp-web-multidevice
container_name: whatsapp
restart: always
ports:
- "3000:3000"
volumes:
- whatsapp_storages:/app/storages
- whatsapp_statics:/app/statics
environment:
- APP_BASIC_AUTH=admin:admin
- APP_PORT=3000
- APP_DEBUG=true
- APP_OS=Chrome
- WHATSAPP_ACCOUNT_VALIDATION=false
volumes:
whatsapp_storages:
whatsapp_statics:הפעל את המערך שנבחר באמצעות docker compose up -d.
#שרת ייצור (קובץ בינארי)
הורד קובץ בינארי מדף השחרורים, ולאחר מכן הפעל אותו עם פקודת המשנה rest.
ניתן גם ליצור fork או לשנות את קוד המקור.
#API נוכחי
#MCP (Model Context Protocol) API
- מוגש ב-
/mcpעל ידי שרת ה-REST באמצעות HTTP בר-הזרמה בכל זמן שבוMCP_ENABLEDמוגדר כ-true. כאשרAPP_BASE_PATHמוגדר, הנתיב הוא<base-path>/mcp. - הכלים הזמינים מפורטים בסעיף "כלי MCP זמינים" לעיל.
- תואם לכלי וסוכני AI בעלי יכולת MCP.
#HTTP REST API
- עיין ב-docs/openapi.yaml למפרטי API מפורטים.
- השתמש ב-Swagger Editor כדי להציג חזותית את ה-API.
- צור לקוחות HTTP באמצעות openapi-generator.
| סטטוס | פעולה | מתודה | URL |
|---|---|---|---|
| ✅ | Health Check | GET | /health |
| ✅ | List Devices | GET | /devices |
| ✅ | Add Device | POST | /devices |
| ✅ | Get Device Info | GET | /devices/:device_id |
| ✅ | Remove Device | DELETE | /devices/:device_id |
| ✅ | Login Device (QR) | GET | /devices/:device_id/login |
| ✅ | Login Device (Code) | POST | /devices/:device_id/login/code |
| ✅ | Logout Device | POST | /devices/:device_id/logout |
| ✅ | App Info (version, limits) | GET | /app/info |
| ✅ | User Info | GET | /user/info |
| ✅ | User Avatar | GET | /user/avatar |
| ✅ | Change User Avatar | POST | /user/avatar |
| ✅ | Change User Push Name | POST | /user/pushname |
| ✅ | List My Groups* | GET | /user/my/groups |
| ✅ | List My Newsletters | GET | /user/my/newsletters |
| ✅ | Get My Privacy Settings | GET | /user/my/privacy |
| ✅ | List My Contacts | GET | /user/my/contacts |
| ✅ | Check WhatsApp User | GET | /user/check |
| ✅ | Get Business Profile | GET | /user/business-profile |
| ✅ | Send Message | POST | /send/message |
| ✅ | Send Image | POST | /send/image |
| ✅ | Send Audio | POST | /send/audio |
| ✅ | Send File | POST | /send/file |
| ✅ | Send Video | POST | /send/video |
| ✅ | Send Sticker | POST | /send/sticker |
| ✅ | Send Contact | POST | /send/contact |
| ✅ | Send Link | POST | /send/link |
| ✅ | Send Location | POST | /send/location |
| ✅ | Send Poll / Vote | POST | /send/poll |
| ✅ | Send Presence | POST | /send/presence |
| ✅ | Send Chat Presence (Typing Indicator) | POST | /send/chat-presence |
| ✅ | Revoke Message | POST | /message/:message_id/revoke |
| ✅ | React Message | POST | /message/:message_id/reaction |
| ✅ | Delete Message | POST | /message/:message_id/delete |
| ✅ | Edit Message | POST | /message/:message_id/update |
| ✅ | Mark Message as Read | POST | /message/:message_id/read |
| ✅ | Mark Audio Message as Played | POST | /message/:message_id/played |
| ✅ | Star Message | POST | /message/:message_id/star |
| ✅ | Unstar Message | POST | /message/:message_id/unstar |
| ✅ | Forward Message | POST | /message/:message_id/forward |
| ✅ | Download Message Media | GET | /message/:message_id/download |
| ✅ | Reject Call | POST | /call/reject |
| ✅ | Join Group with Link | POST | /group/join-with-link |
| ✅ | Get Group Info from Link | GET | /group/info-from-link |
| ✅ | Get Group Info | GET | /group/info |
| ✅ | Leave Group | POST | /group/leave |
| ✅ | Create Group | POST | /group |
| ✅ | List Group Participants | GET | /group/participants |
| ✅ | Add Group Participants | POST | /group/participants |
| ✅ | Remove Group Participants | POST | /group/participants/remove |
| ✅ | Promote Group Participants | POST | /group/participants/promote |
| ✅ | Demote Group Participants | POST | /group/participants/demote |
| ✅ | Export Group Participants (CSV) | GET | /group/participants/export |
| ✅ | List Group Join Requests | GET | /group/participant-requests |
| ✅ | Approve Group Join Requests | POST | /group/participant-requests/approve |
| ✅ | Reject Group Join Requests | POST | /group/participant-requests/reject |
| ✅ | Set Group Photo | POST | /group/photo |
| ✅ | Set Group Name | POST | /group/name |
| ✅ | Lock or Unlock Group Settings | POST | /group/locked |
| ✅ | Set Group Announcement Mode | POST | /group/announce |
| ✅ | Set Group Topic | POST | /group/topic |
| ✅ | Get Group Invite Link | GET | /group/invite-link |
| ✅ | Unfollow Newsletter | POST | /newsletter/unfollow |
| ✅ | Get Newsletter Messages | GET | /newsletter/messages |
| ✅ | Download Newsletter Message Media | GET | /newsletter/messages/{server_id}/download |
| ✅ | Get Chat List | GET | /chats |
| ✅ | Get Chat Messages | GET | /chat/:chat_jid/messages |
| ✅ | Pin Chat | POST | /chat/:chat_jid/pin |
| ✅ | Archive Chat | POST | /chat/:chat_jid/archive |
| ✅ | Set Disappearing Messages | POST | /chat/:chat_jid/disappearing |
| ✅ | Request Chat History (Load Older Msgs) | POST | /chat/:chat_jid/history |
| ✅ | Chatwoot Sync History | POST | /chatwoot/sync |
| ✅ | Chatwoot Sync Status | GET | /chatwoot/sync/status |
| ✅ | List Chatwoot Configurations | GET | /chatwoot/configs |
| ✅ | Get Device Chatwoot Configuration | GET | /devices/:device_id/chatwoot/config |
| ✅ | Set Device Chatwoot Configuration | PUT | /devices/:device_id/chatwoot/config |
| ✅ | Delete Device Chatwoot Configuration | DELETE | /devices/:device_id/chatwoot/config |
| ✅ | Chatwoot Reply Webhook | POST | /chatwoot/webhook |
| ✅ | Device Chatwoot Reply Webhook | POST | /chatwoot/webhook/:device_id |
✅ = זמין. * = בעל מגבלות ידועות; ראה את ההערות להלן.
הערות:
*List My Groups: מחזיר מקסימום 500 קבוצות עקב מגבלת פרוטוקול של WhatsApp. השרתים של WhatsApp, ולא ה-API הזה, אוכפים את המגבלה. ראה את קוד המקור של whatsmeow לפרטים.- הנתיב
/healthהוא ציבורי ותמיד רשום בנתיב השורש, גם כאשרAPP_BASE_PATHמוגדר. - נתיבי Chatwoot נרשמים רק כאשר
CHATWOOT_ENABLED=true.
#ממשק משתמש
#ממשק משתמש MCP
- הגדרת MCP (נבדק ב-Cursor)

- בדיקת MCP

- הגדרת MCP מוצלחת

#לוח בקרה ברשת (gowa-ui)
לוח הבקרה נמצא במאגר משלו: aldinokemal/gowa-ui. כל שחרור של gowa-ui מפרסם קובץ עצמאי יחיד gowa-ui.html; השרת מוריד את השחרור האחרון בעת ההפעלה (וכל APP_UI_UPDATE_INTERVAL, שברירת המחדל שלו היא 3h), מאמת את סיכום ה-SHA-256 שלו, שומר אותו במטמון תחת storages/ui/, ומגיש אותו ב-/ מאחורי Basic Auth.
| הגדרה | ברירת מחדל | מטרה |
|---|---|---|
APP_UI_ENABLED | true | הגשת לוח הבקרה ב-/; ערך false מחזיר כרזת JSON (מצב API בלבד) |
APP_UI_AUTO_UPDATE | true | הורדה ורענון מ-GitHub; השבת עבור פריסות מבודדות רשת (air-gapped) |
APP_UI_REPO | aldinokemal/gowa-ui | המאגר שאחריו עוקב המעדכן, תמיד השחרור האחרון שלו, ולא גרסה נעולה |
APP_UI_ASSET_NAME | gowa-ui.html | שם קובץ הנכס להורדה מתוך השחרור |
APP_UI_UPDATE_INTERVAL | 3h | תדירות הבדיקה של releases/latest |
APP_UI_GITHUB_TOKEN | (ריק) | טוקן אופציונלי להעלאת מגבלת הקצב של ה-API של GitHub |
APP_UI_ASSET_SHA256 | (ריק) | נעילת שרשרת אספקה: דחיית כל לוח בקרה שה-SHA-256 שלו שונה |
מודל אמון: סיכום השחרור מוכיח שההורדה תואמת למה ש-GitHub מפרסם, ולא מי פרסם אותה. מפעילים שבודקים גרסת בנייה ספציפית יכולים לנעול אותה באמצעות APP_UI_ASSET_SHA256 (כל שחרור מספק נכס .sha256, זוהי ההגדרה היחידה שנועלת גרסת בנייה מדויקת), לכוון את APP_UI_REPO ל-fork בשליטתם (המעדכן עדיין עוקב אחר השחרור האחרון של אותו מאגר), או להזין מראש את המטמון ולהשבית את העדכון האוטומטי לחלוטין.
שרתים מבודדי רשת (Air-gapped): שים קובץ gowa-ui.html שהורד בנתיב storages/ui/index.html והגדר APP_UI_AUTO_UPDATE=false. ניתן גם לארח את לוח הבקרה באופן עצמאי בכל מקום סטטי ולכוון אותו לכתובת ה-URL של שרת זה (ראה את ה-README של gowa-ui).
#הערה עבור macOS
אם אתה רואה invalid flag in pkg-config --cflags: -Xpreprocessor, הרץ:
export CGO_CFLAGS_ALLOW="-Xpreprocessor"#חשוב
- פרויקט זה אינו רשמי ואינו קשור ל-WhatsApp.
- השתמש ב-WhatsApp Business Platform הרשמי כאשר אתה זקוק לאינטגרציה נתמכת המתאימה לסביבת ייצור.