reporter
This commit is contained in:
108
2025-11-30 final reporter/Functions.py
Normal file
108
2025-11-30 final reporter/Functions.py
Normal file
@@ -0,0 +1,108 @@
|
||||
# Function.py
|
||||
import os
|
||||
import time
|
||||
import requests
|
||||
from dotenv import load_dotenv
|
||||
|
||||
# Load .env variables once
|
||||
load_dotenv()
|
||||
|
||||
WHATSAPP_TOKEN = os.getenv("WHATSAPP_TOKEN")
|
||||
WHATSAPP_PHONE_ID = os.getenv("WHATSAPP_PHONE_NUMBER_ID")
|
||||
WHATSAPP_RECIPIENT = os.getenv("WHATSAPP_RECIPIENT_NUMBER")
|
||||
|
||||
WAPI_URL = f"https://graph.facebook.com/v21.0/{WHATSAPP_PHONE_ID}/messages"
|
||||
|
||||
|
||||
def SendWhatsAppMessage(message: str, retries: int = 3, delay: int = 2) -> bool:
|
||||
"""
|
||||
Sends a WhatsApp message using the WhatsApp Cloud API test number.
|
||||
Automatically retries on failure.
|
||||
|
||||
:param message: Text to send.
|
||||
:param retries: Number of retry attempts.
|
||||
:param delay: Delay between retries (seconds).
|
||||
:return: True if message sent successfully, False otherwise.
|
||||
"""
|
||||
|
||||
# --- safety check: missing config ---
|
||||
if not WHATSAPP_TOKEN or not WHATSAPP_PHONE_ID or not WHATSAPP_RECIPIENT:
|
||||
print("❌ WhatsApp API configuration missing in .env")
|
||||
return False
|
||||
|
||||
headers = {
|
||||
"Authorization": f"Bearer {WHATSAPP_TOKEN}",
|
||||
"Content-Type": "application/json"
|
||||
}
|
||||
|
||||
payload = {
|
||||
"messaging_product": "whatsapp",
|
||||
"to": WHATSAPP_RECIPIENT,
|
||||
"type": "text",
|
||||
"text": {"body": message}
|
||||
}
|
||||
|
||||
# --- retry loop ---
|
||||
for attempt in range(1, retries + 1):
|
||||
try:
|
||||
response = requests.post(WAPI_URL, headers=headers, json=payload, timeout=15)
|
||||
status = response.status_code
|
||||
|
||||
if status == 200:
|
||||
print(f"📨 WhatsApp message sent successfully (attempt {attempt})")
|
||||
return True
|
||||
|
||||
else:
|
||||
print(f"⚠️ WhatsApp API error (attempt {attempt}): {status} {response.text}")
|
||||
|
||||
except requests.RequestException as e:
|
||||
print(f"⚠️ Network error (attempt {attempt}): {e}")
|
||||
|
||||
time.sleep(delay)
|
||||
|
||||
print("❌ Failed to send WhatsApp message after retries.")
|
||||
return False
|
||||
|
||||
# -----------------------------------------------------
|
||||
# Find Dropbox root by reading official info.json
|
||||
# -----------------------------------------------------
|
||||
|
||||
def get_dropbox_root() -> str | None:
|
||||
# """
|
||||
# Returns the absolute Dropbox folder path by reading:
|
||||
# C:\Users\<user>\AppData\Local\Dropbox\info.json
|
||||
# This is 100% reliable even if Dropbox changes drive letter.
|
||||
# """
|
||||
|
||||
import os
|
||||
import json
|
||||
|
||||
localapp = os.environ.get("LOCALAPPDATA")
|
||||
if not localapp:
|
||||
print("⚠️ LOCALAPPDATA not found.")
|
||||
return None
|
||||
|
||||
info_path = os.path.join(localapp, "Dropbox", "info.json")
|
||||
|
||||
if not os.path.exists(info_path):
|
||||
print(f"⚠️ Dropbox info.json not found at: {info_path}")
|
||||
return None
|
||||
|
||||
try:
|
||||
with open(info_path, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
|
||||
# Most users: `personal`
|
||||
if "personal" in data and "path" in data["personal"]:
|
||||
return data["personal"]["path"]
|
||||
|
||||
# Business Dropbox if used
|
||||
if "business" in data and "path" in data["business"]:
|
||||
return data["business"]["path"]
|
||||
|
||||
print("⚠️ Dropbox info.json missing 'path' in personal/business")
|
||||
return None
|
||||
|
||||
except Exception as e:
|
||||
print(f"⚠️ Error reading Dropbox info.json: {e}")
|
||||
return None
|
||||
Reference in New Issue
Block a user