מדריך וואטסאפ ל-AI בעברית

תיעוד 1

Go WhatsApp: בנוי לשימוש יעיל בזיכרון

GoWA Logo

Patreon

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

התמיכה שלך עוזרת להבטיח שהפרויקט ימשיך להתוחזק ויקבל עדכונים שוטפים!


release version Build Image Binary Release

#תמיכה ב-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 וניתן להוריד אותם מהשחרור האחרון.
  • 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).

#תכונות

  • שליחת הודעות 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=unavailable
    • available: סמן את החשבון כמחובר (משתיק התראות בטלפון).
    • 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 של המכשיר שומרת על הסוד ומסנן האירועים שלה.
  • חתימות 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) במקום להשבית את האימות.

#תצורה

התצורה נטענת לפי סדר עדיפויות זה:

  1. דגלי שורת הפקודה (עדיפות עליונה)
  2. משתני סביבה
  3. קובץ .env (עדיפות תחתונה)

#משתני סביבה

כדי להשתמש במשתני סביבה:

  1. משורש המאגר, העתק את קובץ הדוגמה: cp src/.env.example src/.env.
  2. עדכן את הערכים ב-src/.env לפי הצורך.
  3. לחלופין, הגדר את אותם המשתנים בסביבת התהליך.

#משתני סביבה זמינים

משתנהתיאורברירת מחדלדוגמה
APP_PORTיציאת היישום3000APP_PORT=8080
APP_HOSTכתובת מארח לקשירת השרת0.0.0.0APP_HOST=127.0.0.1
APP_DEBUGהפעלת רישום ניפוי שגיאותfalseAPP_DEBUG=true
APP_OSשם מערכת ההפעלה (שם המכשיר ב-WhatsApp)GOWAAPP_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 שהורדtrueAPP_UI_ENABLED=false
APP_UI_AUTO_UPDATEהורדה ורענון מעת לעת של לוח הבקרה האחרוןtrueAPP_UI_AUTO_UPDATE=false
APP_UI_REPOמאגר GitHub המכיל שחרורים של gowa-uialdinokemal/gowa-uiAPP_UI_REPO=my-org/gowa-ui
APP_UI_ASSET_NAMEשם קובץ הנכס של שחרור לוח הבקרהgowa-ui.htmlAPP_UI_ASSET_NAME=gowa-ui.html
APP_UI_UPDATE_INTERVALמרווח זמן בין בדיקות עדכון לוח הבקרה3hAPP_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 בר-הזרמה ב-/mcptrueMCP_ENABLED=false
MCP_OAUTH_ENABLEDהפעלת אימות OAuth 2.1 עבור MCPfalseMCP_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_URIURI של SQLite עבור לקוחות OAuth, קודים וגיבובי טוקניםfile:storages/oauth.dbMCP_OAUTH_DB_URI=file:storages/oauth.db
DB_URIURI לחיבור מסד הנתוניםfile:storages/whatsapp.dbDB_URI=postgres://user:pass@host/db
DB_KEYS_URIURI אופציונלי למסד נתונים עבור מטמון מפתחות הצפנה/הפעלה. השאר ריק כדי להשתמש ב-DB_URI; הימנע מאחסון בזיכרון בייצור מכיוון שהפעלות מחדש עלולות לאבד את מצב הפעלת WhatsApp.-DB_KEYS_URI=file:storages/whatsapp-keys.db?_foreign_keys=on
CHAT_STORAGE_MAX_OPEN_CONNSמספר מרבי של חיבורי SQLite מקבילים לאחסון צ'אטים5CHAT_STORAGE_MAX_OPEN_CONNS=10
WHATSAPP_AUTO_REPLYהודעת מענה אוטומטי-WHATSAPP_AUTO_REPLY="Auto reply message"
WHATSAPP_AUTO_MARK_READסימון אוטומטי של הודעות נכנסות כנקראוfalseWHATSAPP_AUTO_MARK_READ=true
WHATSAPP_AUTO_DOWNLOAD_MEDIAהורדה אוטומטית של מדיה מהודעות נכנסותtrueWHATSAPP_AUTO_DOWNLOAD_MEDIA=false
WHATSAPP_IGNORE_STATUS_MEDIAהתעלמות מהורדת מדיה מסטטוסים (status@broadcast)falseWHATSAPP_IGNORE_STATUS_MEDIA=true
WHATSAPP_AUTO_REJECT_CALLדחייה אוטומטית של שיחות WhatsApp נכנסותfalseWHATSAPP_AUTO_REJECT_CALL=true
WHATSAPP_WEBHOOKכתובות URL של webhook עבור אירועים (מופרדות בפסיקים)-WHATSAPP_WEBHOOK=https://webhook.site/xxx
WHATSAPP_WEBHOOK_SECRETסוד Webhook לאימותsecretWHATSAPP_WEBHOOK_SECRET=super-secret-key
WHATSAPP_WEBHOOK_INSECURE_SKIP_VERIFYדילוג על אימות TLS עבור webhooks (לא מאובטח)falseWHATSAPP_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_GLOBALwebhook לכל מכשיר מתווסף לכתובות הגלובליות במקום להחליף אותןfalseWHATSAPP_WEBHOOK_DEVICE_MERGE_GLOBAL=true
WHATSAPP_ACCOUNT_VALIDATIONהפעלת אימות חשבוןtrueWHATSAPP_ACCOUNT_VALIDATION=false
WHATSAPP_PRESENCE_ON_CONNECTנוכחות בעת חיבור: available, unavailable, או noneunavailableWHATSAPP_PRESENCE_ON_CONNECT=unavailable
WHATSAPP_PROXYפרוקסי יוצא עבור WebSocket של WhatsApp (SOCKS5/HTTP/HTTPS)-WHATSAPP_PROXY=socks5://user:pass@host:1080
WHATSAPP_PRESENCE_PULSE_ENABLEDהפעלת פעימת נוכחות יומית available/unavailabletrueWHATSAPP_PRESENCE_PULSE_ENABLED=false
WHATSAPP_PRESENCE_PULSE_INTERVALמרווח זמן בין פעימות נוכחות24hWHATSAPP_PRESENCE_PULSE_INTERVAL=24h
WHATSAPP_PRESENCE_PULSE_DURATIONמשך זמן השהייה במצב available במהלך כל פעימה5mWHATSAPP_PRESENCE_PULSE_DURATION=5m
CHATWOOT_ENABLEDהפעלת שילוב ChatwootfalseCHATWOOT_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הפעלת סנכרון היסטוריית הודעות ל-ChatwootfalseCHATWOOT_IMPORT_MESSAGES=true
CHATWOOT_DAYS_LIMIT_IMPORT_MESSAGESמספר ימי היסטוריה לייבוא3CHATWOOT_DAYS_LIMIT_IMPORT_MESSAGES=7
CHATWOOT_IMPORT_DB_URIURI ישיר של PostgreSQL של Chatwoot לסנכרון היסטוריה-CHATWOOT_IMPORT_DB_URI=postgresql://user:pass@host:5432/chatwoot_production?sslmode=disable
CHATWOOT_IMPORT_PLACEHOLDER_MEDIA_MESSAGEהוספת שומרי מקום טקסטואליים לשורות מדיה במהלך ייבוא ישיר ממסד הנתוניםtrueCHATWOOT_IMPORT_PLACEHOLDER_MEDIA_MESSAGE=true
CHATWOOT_IMPORT_MEDIA_WITH_RESTהעלאת שורות מדיה מייבוא ישיר ממסד הנתונים דרך Chatwoot RESTfalseCHATWOOT_IMPORT_MEDIA_WITH_REST=true
CHATWOOT_AUTO_CREATEיצירה אוטומטית או שימוש חוזר בתיבת דואר נכנס של Chatwoot API בעת ההפעלהfalseCHATWOOT_AUTO_CREATE=true
CHATWOOT_INBOX_NAMEשם תיבת הדואר הנכנס המשמש כאשר יצירה אוטומטית מופעלתWhatsAppCHATWOOT_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 שנפתרו עבור אנשי קשר שחוזריםtrueCHATWOOT_REOPEN_CONVERSATION=false
CHATWOOT_CONVERSATION_PENDINGיצירת שיחות Chatwoot חדשות במצב ממתין (pending)falseCHATWOOT_CONVERSATION_PENDING=true
CHATWOOT_IGNORE_JIDSמזהי JID או תווים כלליים להחרגה מהעברה ל-Chatwoot-[email protected],[email protected]
CHATWOOT_SIGN_MSGהקדמת שם הנציג לתשובות נציג מ-ChatwootfalseCHATWOOT_SIGN_MSG=true
CHATWOOT_SIGN_DELIMITERתוחם בין חתימת נציג Chatwoot לגוף ההודעה\n\nCHATWOOT_SIGN_DELIMITER=" - "
CHATWOOT_FORWARD_EDITSשיקוף עריכות מ-WhatsApp בהערות משורשרות ב-ChatwoottrueCHATWOOT_FORWARD_EDITS=false
CHATWOOT_FORWARD_DELETESשיקוף אירועי מחיקה לכולם מ-WhatsApp בהערות ב-ChatwoottrueCHATWOOT_FORWARD_DELETES=false
CHATWOOT_MESSAGE_READסנכרון מצב קריאה עבור הודעות מקושרות בין WhatsApp ל-ChatwootfalseCHATWOOT_MESSAGE_READ=true
CHATWOOT_MESSAGE_DELETEמחיקת הודעות מקושרות בצד הנגדי כאשר מדווחת מחיקהfalseCHATWOOT_MESSAGE_DELETE=true

תיעוד:

הפעל ./whatsapp --help כדי לראות את כל דגלי שורת הפקודה.

#דרישות

#דרישות מערכת

  • Go 1.26.0 ומעלה (בעת בנייה מקוד מקור)
  • FFmpeg (לעיבוד מדיה)

#פלטפורמות נתמכות

  • Linux (x86_64, ARM64)
  • macOS (Intel, Apple Silicon)
  • Windows (x86_64; מומלץ WSL)

#תלויות (ללא Docker)

  • macOS:
    • brew install ffmpeg webp
    • export CGO_CFLAGS_ALLOW="-Xpreprocessor"
  • Linux:
    • sudo apt update
    • sudo apt install ffmpeg webp
  • Windows (מומלץ WSL; ראה Install WSL):
    • התקן את FFmpeg.
    • התקן את libwebp, לאחר מכן חלץ אותו והוסף את ספריית ה-bin שלו ל-PATH.

הערה: החבילה webp מספקת את הכלים cwebp (מקודד), dwebp (מפענח) ו-webpmux (חולץ פריימים). FFmpeg נדרש לעיבוד מדיה. כלי libwebp (webpmux + dwebp) משמשים לתמיכה במדבקות WebP מונפשות.

#אופן השימוש

#בסיסי

  1. שכפל את המאגר: git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice.
  2. פתח את הספרייה המשוכפלת במסוף.
  3. הרץ cd src.
  4. הרץ go run . rest.
  5. פתח את http://localhost:3000.

#Docker

Docker מונע את הצורך בהתקנת Go, FFmpeg ו-libwebp ישירות במחשב המארח.

  1. שכפל את המאגר: git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice.
  2. פתח את הספרייה המשוכפלת במסוף.
  3. העתק את קובץ הסביבה: cp src/.env.example src/.env.
  4. הרץ docker compose up -d --build.
  5. פתח את http://localhost:3000.

#בניית קובץ בינארי בעצמך

  1. שכפל את המאגר: git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice.
  2. פתח את הספרייה המשוכפלת במסוף.
  3. הרץ cd src.
  4. בנה את הקובץ הבינארי:
    • Linux ו-macOS: go build -o whatsapp
    • Windows (שורת הפקודה או PowerShell): go build -o whatsapp.exe
  5. הפעל את השרת:
    • Linux ו-macOS: ./whatsapp rest
    • Windows: .\whatsapp.exe rest
  6. פתח את http://localhost:3000 בדפדפן.

הפעל ./whatsapp --help (או .\whatsapp.exe --help ב-Windows) כדי לראות את כל הדגלים.

#הידור צולב עבור Raspberry Pi (ARM)

כדי לבנות עבור Raspberry Pi או מכשיר ARM אחר ללא שרשרת כלי C (כלומר CGO), השתמש בתג הבנייה purego. פעולה זו בוחרת מימוש SQLite ב-Go טהור.

  1. שכפל את המאגר: git clone https://github.com/aldinokemal/go-whatsapp-web-multidevice.

  2. פתח את הספרייה המשוכפלת במסוף.

  3. הרץ cd src.

  4. בנייה עבור Raspberry Pi Zero / 1 (ARMv6):

    CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=6 go build -tags purego -o whatsapp-armv6
  5. בנייה עבור Raspberry Pi 2 / 3 / 4 (ARMv7 32-bit):

    CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -tags purego -o whatsapp-armv7
  6. העבר את הקובץ הבינארי ל-Pi שלך, תן לו הרשאת הרצה (chmod +x), והפעל אותו:

    • אם בנית ARMv6: ./whatsapp-armv6 rest
    • אם בנית ARMv7: ./whatsapp-armv7 rest

#שרת 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_sendtext, image, video, audio, document, sticker, location, contact, poll, link, forward
whatsapp_messagereact, edit, revoke, delete, mark_read, mark_played, star, unstar, download_media
whatsapp_chatlist_chats, list_contacts, get_messages, archive
whatsapp_groupcreate, 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_appstatus, 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/ssehttp://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

סטטוספעולהמתודהURL
Health CheckGET/health
List DevicesGET/devices
Add DevicePOST/devices
Get Device InfoGET/devices/:device_id
Remove DeviceDELETE/devices/:device_id
Login Device (QR)GET/devices/:device_id/login
Login Device (Code)POST/devices/:device_id/login/code
Logout DevicePOST/devices/:device_id/logout
App Info (version, limits)GET/app/info
User InfoGET/user/info
User AvatarGET/user/avatar
Change User AvatarPOST/user/avatar
Change User Push NamePOST/user/pushname
List My Groups*GET/user/my/groups
List My NewslettersGET/user/my/newsletters
Get My Privacy SettingsGET/user/my/privacy
List My ContactsGET/user/my/contacts
Check WhatsApp UserGET/user/check
Get Business ProfileGET/user/business-profile
Send MessagePOST/send/message
Send ImagePOST/send/image
Send AudioPOST/send/audio
Send FilePOST/send/file
Send VideoPOST/send/video
Send StickerPOST/send/sticker
Send ContactPOST/send/contact
Send LinkPOST/send/link
Send LocationPOST/send/location
Send Poll / VotePOST/send/poll
Send PresencePOST/send/presence
Send Chat Presence (Typing Indicator)POST/send/chat-presence
Revoke MessagePOST/message/:message_id/revoke
React MessagePOST/message/:message_id/reaction
Delete MessagePOST/message/:message_id/delete
Edit MessagePOST/message/:message_id/update
Mark Message as ReadPOST/message/:message_id/read
Mark Audio Message as PlayedPOST/message/:message_id/played
Star MessagePOST/message/:message_id/star
Unstar MessagePOST/message/:message_id/unstar
Forward MessagePOST/message/:message_id/forward
Download Message MediaGET/message/:message_id/download
Reject CallPOST/call/reject
Join Group with LinkPOST/group/join-with-link
Get Group Info from LinkGET/group/info-from-link
Get Group InfoGET/group/info
Leave GroupPOST/group/leave
Create GroupPOST/group
List Group ParticipantsGET/group/participants
Add Group ParticipantsPOST/group/participants
Remove Group ParticipantsPOST/group/participants/remove
Promote Group ParticipantsPOST/group/participants/promote
Demote Group ParticipantsPOST/group/participants/demote
Export Group Participants (CSV)GET/group/participants/export
List Group Join RequestsGET/group/participant-requests
Approve Group Join RequestsPOST/group/participant-requests/approve
Reject Group Join RequestsPOST/group/participant-requests/reject
Set Group PhotoPOST/group/photo
Set Group NamePOST/group/name
Lock or Unlock Group SettingsPOST/group/locked
Set Group Announcement ModePOST/group/announce
Set Group TopicPOST/group/topic
Get Group Invite LinkGET/group/invite-link
Unfollow NewsletterPOST/newsletter/unfollow
Get Newsletter MessagesGET/newsletter/messages
Download Newsletter Message MediaGET/newsletter/messages/{server_id}/download
Get Chat ListGET/chats
Get Chat MessagesGET/chat/:chat_jid/messages
Pin ChatPOST/chat/:chat_jid/pin
Archive ChatPOST/chat/:chat_jid/archive
Set Disappearing MessagesPOST/chat/:chat_jid/disappearing
Request Chat History (Load Older Msgs)POST/chat/:chat_jid/history
Chatwoot Sync HistoryPOST/chatwoot/sync
Chatwoot Sync StatusGET/chatwoot/sync/status
List Chatwoot ConfigurationsGET/chatwoot/configs
Get Device Chatwoot ConfigurationGET/devices/:device_id/chatwoot/config
Set Device Chatwoot ConfigurationPUT/devices/:device_id/chatwoot/config
Delete Device Chatwoot ConfigurationDELETE/devices/:device_id/chatwoot/config
Chatwoot Reply WebhookPOST/chatwoot/webhook
Device Chatwoot Reply WebhookPOST/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 בדיקת MCP
  • הגדרת 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_ENABLEDtrueהגשת לוח הבקרה ב-/; ערך false מחזיר כרזת JSON (מצב API בלבד)
APP_UI_AUTO_UPDATEtrueהורדה ורענון מ-GitHub; השבת עבור פריסות מבודדות רשת (air-gapped)
APP_UI_REPOaldinokemal/gowa-uiהמאגר שאחריו עוקב המעדכן, תמיד השחרור האחרון שלו, ולא גרסה נעולה
APP_UI_ASSET_NAMEgowa-ui.htmlשם קובץ הנכס להורדה מתוך השחרור
APP_UI_UPDATE_INTERVAL3hתדירות הבדיקה של 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 הרשמי כאשר אתה זקוק לאינטגרציה נתמכת המתאימה לסביבת ייצור.