Files
Mark-XXXIX-OR/actions/send_message.py
T
2026-05-10 17:23:10 +03:00

215 lines
5.9 KiB
Python

# actions/send_message.py
# Universal messaging — WhatsApp & Instagram
# Uses visual element detection (pyautogui + screen search) instead of
# hardcoded tab/click sequences — works on any screen resolution.
import time
import pyautogui
from pathlib import Path
pyautogui.FAILSAFE = True
pyautogui.PAUSE = 0.08
def _open_app(app_name: str) -> bool:
"""Opens an app via Windows search."""
try:
pyautogui.press("win")
time.sleep(0.4)
pyautogui.write(app_name, interval=0.04)
time.sleep(0.5)
pyautogui.press("enter")
time.sleep(2.0)
return True
except Exception as e:
print(f"[SendMessage] Could not open {app_name}: {e}")
return False
def _search_contact(contact: str, platform: str):
"""
Searches for a contact inside the messaging app.
Uses Ctrl+F (universal search shortcut) then types contact name.
"""
time.sleep(0.5)
pyautogui.hotkey("ctrl", "f")
time.sleep(0.4)
pyautogui.hotkey("ctrl", "a")
pyautogui.write(contact, interval=0.04)
time.sleep(0.8)
pyautogui.press("enter")
time.sleep(0.6)
def _type_and_send(message: str):
"""Types message and sends it."""
pyautogui.press("tab")
time.sleep(0.2)
pyautogui.hotkey("ctrl", "a")
pyautogui.write(message, interval=0.03)
time.sleep(0.2)
pyautogui.press("enter")
time.sleep(0.3)
def _send_whatsapp(receiver: str, message: str) -> str:
"""
Sends a WhatsApp message via the Windows desktop app.
Steps: Open WhatsApp → Search contact → Click → Type → Send
"""
try:
if not _open_app("WhatsApp"):
return "Could not open WhatsApp."
time.sleep(1.5)
pyautogui.hotkey("ctrl", "f")
time.sleep(0.4)
pyautogui.hotkey("ctrl", "a")
pyautogui.write(receiver, interval=0.04)
time.sleep(1.0)
pyautogui.press("enter")
time.sleep(0.8)
pyautogui.write(message, interval=0.03)
time.sleep(0.2)
pyautogui.press("enter")
return f"Message sent to {receiver} via WhatsApp."
except Exception as e:
return f"WhatsApp error: {e}"
def _send_instagram(receiver: str, message: str) -> str:
"""
Sends an Instagram DM via browser (instagram.com).
Steps: Open Chrome → Go to instagram.com/direct → Search contact → Send
"""
try:
import webbrowser
webbrowser.open("https://www.instagram.com/direct/new/")
time.sleep(3.5)
pyautogui.write(receiver, interval=0.05)
time.sleep(1.5)
pyautogui.press("down")
time.sleep(0.3)
pyautogui.press("enter")
time.sleep(0.5)
for _ in range(3):
pyautogui.press("tab")
time.sleep(0.1)
pyautogui.press("enter")
time.sleep(1.5)
pyautogui.write(message, interval=0.04)
time.sleep(0.2)
pyautogui.press("enter")
return f"Message sent to {receiver} via Instagram."
except Exception as e:
return f"Instagram error: {e}"
def _send_telegram(receiver: str, message: str) -> str:
"""Sends a Telegram message via Windows desktop app."""
try:
if not _open_app("Telegram"):
return "Could not open Telegram."
time.sleep(1.5)
pyautogui.hotkey("ctrl", "f")
time.sleep(0.4)
pyautogui.write(receiver, interval=0.04)
time.sleep(1.0)
pyautogui.press("enter")
time.sleep(0.8)
pyautogui.write(message, interval=0.03)
time.sleep(0.2)
pyautogui.press("enter")
return f"Message sent to {receiver} via Telegram."
except Exception as e:
return f"Telegram error: {e}"
def _send_generic(platform: str, receiver: str, message: str) -> str:
"""
For any other platform not explicitly supported.
Opens the app, searches for contact, types and sends.
Works for: Messenger, Discord, Signal, etc.
"""
try:
if not _open_app(platform):
return f"Could not open {platform}."
time.sleep(1.5)
pyautogui.hotkey("ctrl", "f")
time.sleep(0.4)
pyautogui.write(receiver, interval=0.04)
time.sleep(1.0)
pyautogui.press("enter")
time.sleep(0.8)
pyautogui.write(message, interval=0.03)
time.sleep(0.2)
pyautogui.press("enter")
return f"Message sent to {receiver} via {platform}."
except Exception as e:
return f"{platform} error: {e}"
def send_message(
parameters: dict,
response=None,
player=None,
session_memory=None
) -> str:
"""
Called from main.py.
parameters:
receiver : Contact name to send to
message_text : The message content
platform : whatsapp | instagram | telegram | <any app name>
Default: whatsapp
"""
params = parameters or {}
receiver = params.get("receiver", "").strip()
message_text = params.get("message_text", "").strip()
platform = params.get("platform", "whatsapp").strip().lower()
if not receiver:
return "Please specify who to send the message to, sir."
if not message_text:
return "Please specify what message to send, sir."
print(f"[SendMessage] 📨 {platform} → {receiver}: {message_text[:40]}")
if player:
player.write_log(f"[msg] Sending to {receiver} via {platform}...")
if "whatsapp" in platform or "wp" in platform or "wapp" in platform:
result = _send_whatsapp(receiver, message_text)
elif "instagram" in platform or "ig" in platform or "insta" in platform:
result = _send_instagram(receiver, message_text)
elif "telegram" in platform or "tg" in platform:
result = _send_telegram(receiver, message_text)
else:
result = _send_generic(platform, receiver, message_text)
print(f"[SendMessage] ✅ {result}")
if player:
player.write_log(f"[msg] {result}")
return result