OpenSMN/tokenext.py
2025-12-03 07:11:48 -03:00

137 lines
3.6 KiB
Python

import os
import re
import time
from typing import Optional
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
DEFAULT_URL = os.getenv("SMN_URL", "https://www.smn.gob.ar/")
DEFAULT_OUTPUT_FILE = "token"
def extract_token_from_source(source: str) -> Optional[str]:
m = re.search(
r"localStorage\.setItem\(\s*['\"]token['\"]\s*,\s*['\"]([^'\"]+)['\"]\s*\)",
source,
)
if m:
return m.group(1)
m = re.search(r"localStorage\.token\s*=\s*['\"]([^'\"]+)['\"]", source)
if m:
return m.group(1)
return None
def make_chrome_options(headless: bool = True) -> Options:
opts = Options()
if headless:
try:
opts.add_argument("--headless=new")
except Exception:
opts.add_argument("--headless")
opts.add_argument("--no-sandbox")
opts.add_argument("--disable-dev-shm-usage")
opts.add_argument("--disable-gpu")
opts.add_argument("--disable-blink-features=AutomationControlled")
opts.add_argument("--window-size=1920,1080")
opts.add_argument(
"--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/118.0.5993.90 Safari/537.36"
)
return opts
def get_token(
url: str = DEFAULT_URL,
headless: bool = True,
wait_seconds: int = 8,
driver_wait_timeout: int = 20,
chrome_driver_path: Optional[str] = None,
) -> Optional[str]:
options = make_chrome_options(headless=headless)
driver = None
try:
if chrome_driver_path:
driver = webdriver.Chrome(executable_path=chrome_driver_path, options=options)
else:
driver = webdriver.Chrome(options=options)
# load page
driver.get(url)
if wait_seconds:
time.sleep(wait_seconds)
try:
WebDriverWait(driver, driver_wait_timeout).until(
EC.presence_of_element_located((By.TAG_NAME, "body"))
)
except Exception:
pass
token = None
try:
token = driver.execute_script("return window.localStorage.getItem('token');")
except Exception:
token = None
# fallback to searching page source
if not token:
token = extract_token_from_source(driver.page_source)
return token
except Exception as ex:
return None
finally:
if driver:
try:
driver.quit()
except Exception:
pass
def refresh_token(
output_file: str = DEFAULT_OUTPUT_FILE,
**get_token_kwargs,
) -> bool:
token = get_token(**get_token_kwargs)
if token:
try:
with open(output_file, "w", encoding="utf-8") as f:
f.write(token)
return True
except Exception:
return False
return False
if __name__ == "__main__":
import sys
url = DEFAULT_URL
if len(sys.argv) > 1:
url = sys.argv[1]
print(f"Loading URL {url}")
token = get_token(headless=True)
if token:
print(f"\n[+] Token found:\n{token}\n")
try:
with open(DEFAULT_OUTPUT_FILE, "w", encoding="utf-8") as fh:
fh.write(token)
print(f"[+] Saved to {DEFAULT_OUTPUT_FILE}")
except Exception as e:
print("[!] Failed to save token:", e)
else:
print("[!] No token found in localStorage or page source.")