From 79934c433709092ac4c62c77c686ab88693f4393 Mon Sep 17 00:00:00 2001 From: Waheed-Mousad Date: Mon, 9 Jun 2025 05:48:10 +0300 Subject: [PATCH] whatsapp notification using Twilio --- __init__.py | 6 +-- __pycache__/__init__.cpython-312.pyc | Bin 382 -> 391 bytes .../notify_whatsapp_twilio.cpython-312.pyc | Bin 0 -> 2532 bytes .../whatsapp_notify_node.cpython-312.pyc | Bin 1038 -> 2491 bytes notify_whatsapp_twilio.py | 40 ++++++++++++++++++ requirements.txt | 1 + whatsapp_notify_node.py | 17 -------- 7 files changed, 44 insertions(+), 20 deletions(-) create mode 100644 __pycache__/notify_whatsapp_twilio.cpython-312.pyc create mode 100644 notify_whatsapp_twilio.py delete mode 100644 whatsapp_notify_node.py diff --git a/__init__.py b/__init__.py index 129a15e..0312984 100644 --- a/__init__.py +++ b/__init__.py @@ -1,9 +1,9 @@ -from .whatsapp_notify_node import WhatsAppNotifyNode +from .notify_whatsapp_twilio import WhatsAppNotifyNodeTwilio NODE_CLASS_MAPPINGS = { - "WhatsAppNotifyNode": WhatsAppNotifyNode, + "WhatsAppNotifyNodeTwilio": WhatsAppNotifyNodeTwilio, } NODE_DISPLAY_NAME_MAPPINGS = { - "WhatsAppNotifyNode": "📲 WhatsApp Notify", + "WhatsAppNotifyNodeTwilio": "📲 WhatsApp (Twilio)", } \ No newline at end of file diff --git a/__pycache__/__init__.cpython-312.pyc b/__pycache__/__init__.cpython-312.pyc index 3bedd6eb6cf71f6643b107824cb5100dc561a3cf..01dd697cdbd98545e8546f772e30973e24d18ecd 100644 GIT binary patch delta 171 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 J86d=P{y%c%c`X0{ delta 594 zcmZ8dL2J}N6n-<4WYcJ}St@H6Aw*D0+>_c%Rg@lVd(eP*5GqBMPPPqnH_J>~SSWN4 zd+147a_GT|o&@PdJQe&2UV8Ab1aJO<)D^rsFY8`>FyDLgzQ^~ynXmJ&P3N0!TcBd| z(dtf}j+_N=LEVml!WwWG0w<>wd4LV*(}0a$)ydLmzv)C~n{s2QZOrv6fjRngeNk6K zOr6P8ffG(S;~Ljvf}9!`Ep diff --git a/notify_whatsapp_twilio.py b/notify_whatsapp_twilio.py new file mode 100644 index 0000000..0e1a346 --- /dev/null +++ b/notify_whatsapp_twilio.py @@ -0,0 +1,40 @@ +from twilio.rest import Client + +class WhatsAppNotifyNodeTwilio: + @classmethod + def INPUT_TYPES(cls): + return { + "required": { + "img": ("IMAGE",), + "message": ("STRING", {"default": "✅ Workflow completed!"}), + "sid": ("STRING", {"default": "Your Twilio SID here"}), + "token": ("STRING", {"default": "Your Twilio Auth Token"}), + "from_number": ("STRING", {"default": "whatsapp:+14155238886"}), # Twilio Sandbox + "to_number": ("STRING", {"default": "whatsapp:+YOUR_PHONE_NUMBER"}), # Your verified number + } + } + + RETURN_TYPES = ("IMAGE",) + FUNCTION = "notify" + CATEGORY = "Notifications" + + def notify(self, img, message, sid, token, from_number, to_number): + try: + # Basic validation + required_fields = [sid, token, from_number, to_number] + if any(v.strip() == "" or "Twilio" in v for v in required_fields): + raise ValueError("One or more required fields are missing or still set to default.") + + client = Client(sid.strip(), token.strip()) + sent = client.messages.create( + from_=from_number.strip(), + body=message.strip(), + to=to_number.strip() + ) + print(f"[📲 WhatsAppNotifyNodeTwilio] ✅ WhatsApp message sent. SID: {sent.sid}") + + except Exception as e: + print("❌ WhatsAppNotifyNodeTwilio Error: ", str(e).split('\n')[0]) + + return (img,) + diff --git a/requirements.txt b/requirements.txt index e69de29..105a686 100644 --- a/requirements.txt +++ b/requirements.txt @@ -0,0 +1 @@ +twilio diff --git a/whatsapp_notify_node.py b/whatsapp_notify_node.py deleted file mode 100644 index f8846be..0000000 --- a/whatsapp_notify_node.py +++ /dev/null @@ -1,17 +0,0 @@ -class WhatsAppNotifyNode: - @classmethod - def INPUT_TYPES(cls): - return { - "required": { - "img": ("IMAGE",), - "message": ("STRING", {"default": "✅ Workflow completed!"}), - } - } - - RETURN_TYPES = ("IMAGE",) - FUNCTION = "notify" - CATEGORY = "Notifications" - - def notify(self, img, message: str): - print(f"[📲 WhatsAppNotifyNode] Message to send: {message}") - return (img,) # Pass image forward so node isn't "useless"