המטרה
לעקוב אחר WhatsApp אחרי הודעות עם keywords ולדחוף matches ל-webhook. שתי גרסאות: notification-listener קליל ו-accessibility-service עמוק עם חילוץ שולח + טלפון.
הפתרון
שתי אפליקציות Android. WhatsAppListener עם NotificationListenerService, UI ל-keywords, ID לכל מכשיר, dedup ו-POST ל-webhook. WhatsAppMonitor עם AccessibilityService + Jetpack Compose + Room, עובר על עץ ה-UI של WhatsApp, מחלץ מספרי טלפון עם prefixes מדינה (1/972/…), מתמיד עם DAOs ו-Reps, ו-Compose UI עם navigation. KeyStore משותף לחתימה.
עיקרי הדברים
- שתי רמות הרשאה (notification קליל / accessibility עמוק) במשפחת אפליקציות אחת
- WhatsAppSelectors.kt מרכזי שורד עדכוני WhatsApp עם patch בקובץ אחד
- Dedup בין input paths שומר על ה-webhook שפוי
- Room DB + Compose UI ב-Monitor; Listener קליל לפריסה בסיכון נמוך
האתגר
ל-WhatsApp אין API לקריאת הודעות ב-Android — כל scraping עוין.
שתי אפליקציות לשתי רמות אמון. Listener עם NotificationListenerService (הרשאה מינימלית). Monitor עם AccessibilityService (עץ UI מלא, טלפון + שולח + הקשר — דורש accessibility).
מספרי טלפון גולמיים מה-UI דורשים נרמול עקבי בין אזורים.
setSupportedCountryPrefixes(prefixes) (default ['1','972']) מסיר לא-ספרות ומנרמל + / 0 / country code למספר canonical.
Listener ו-Monitor יכולים לראות את אותה הודעה בשתי דרכים.
Deduplicator.kt עם fingerprint (שולח + טקסט + timestamp bucket) — פעם אחת לחלון.
עץ ה-accessibility של WhatsApp משתנה עם עדכוני app.
WhatsAppSelectors.kt מרכז את כל ה-selectors — עדכון WhatsApp = patch בקובץ אחד.
Android המודרני מגביל וזורק שירותים ארוכים.
NotificationListenerService רץ ב-process של המערכת (חסין ל-Doze); Accessibility רץ על runtime של OS — שניהם חוסכים foreground-service drain.
מה נמסר
- WhatsAppListener/ — app של NotificationListenerService
- WhatsAppMonitor/ — app של AccessibilityService + Compose עם Room
- KeyStore/ — ניהול מפתח חתימה
- שניהם ל-API 26+ / compile SDK 35 / Kotlin 1.9 / Compose
תוצאות
2 + shared KeyStore
אפליקציות
Notification / Accessibility
רמות הרשאה
HTTP webhook POST
פלט
API 26+
Min SDK
מה זה לימד אותי
- מסלול קליל (notification) + מסלול עמוק (accessibility) יותר שימושיים מאחד
- ריכוז selectors של WhatsApp בקובץ אחד הופך עדכון ל-patch
- Dedup בין input paths חובה — אחרת ה-webhook מוצף
