IvanCastl

Bots web

Dec 19th, 2025
479
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.87 KB | Cybersecurity | 0 0
  1. import requests
  2. from bs4 import BeautifulSoup
  3. import re
  4. from urllib.parse import urljoin
  5.  
  6. HEADERS = {"User-Agent": "Mozilla/5.0 (compatible; Bot/1.0)"}
  7. TIMEOUT = 10
  8.  
  9. RE_TOKEN = re.compile(r'(\d{5,20}:[A-Za-z0-9_-]{35,})')
  10. RE_ID_KV = re.compile(
  11.     r'(?:["\']?(?:chat_id|user_id|tg_id|telegram_id)["\']?\s*[:=]\s*["\']?(-?\d{5,20})["\']?)',
  12.     re.IGNORECASE
  13. )
  14. RE_SUSPECT_ID = re.compile(r'(-?100\d{7,12}|-?\d{6,15})')
  15. RE_AT_USERNAME = re.compile(r'@([A-Za-z0-9_]{5,32})(?!\.)')
  16. RE_TME = re.compile(r'(?:t\.me\/|tg:\/\/resolve\?domain=)([A-Za-z0-9_]{5,32})', re.IGNORECASE)
  17.  
  18. KEYWORDS_FOR_SUSPECT = re.compile(r'\btelegram\b|\bbot\b|\bchat_id\b|\buser_id\b|\bsendMessage\b', re.IGNORECASE)
  19.  
  20. def get_context(text, span, radius=60):
  21.     start, end = span
  22.     s = max(0, start - radius)
  23.     e = min(len(text), end + radius)
  24.     prefix = "..." if s > 0 else ""
  25.     suffix = "..." if e < len(text) else ""
  26.     return prefix + text[s:e].replace("\n", " ") + suffix
  27.  
  28. def extraer_de_codigo(js_code):
  29.     tokens = set(RE_TOKEN.findall(js_code))
  30.     ids = set(m.group(1) for m in RE_ID_KV.finditer(js_code))
  31.     sospechosos = set()
  32.     usernames = set(m.group(1) for m in RE_AT_USERNAME.finditer(js_code))
  33.     tme_users = set(m.group(1) for m in RE_TME.finditer(js_code))
  34.  
  35.     # extraer coincidencias con contexto
  36.     context = {
  37.         "tokens": [],
  38.         "ids": [],
  39.         "sospechosos": [],
  40.         "usernames": [],
  41.         "tme_users": []
  42.     }
  43.  
  44.     for m in RE_TOKEN.finditer(js_code):
  45.         context["tokens"].append((m.group(1), get_context(js_code, m.span())))
  46.     for m in RE_ID_KV.finditer(js_code):
  47.         context["ids"].append((m.group(1), get_context(js_code, m.span())))
  48.     for m in RE_AT_USERNAME.finditer(js_code):
  49.         context["usernames"].append((m.group(1), get_context(js_code, m.span())))
  50.     for m in RE_TME.finditer(js_code):
  51.         context["tme_users"].append((m.group(1), get_context(js_code, m.span())))
  52.  
  53.     if not ids:
  54.         if KEYWORDS_FOR_SUSPECT.search(js_code):
  55.             for m in RE_SUSPECT_ID.finditer(js_code):
  56.                 sospechosos.add(m.group(1))
  57.                 context["sospechosos"].append((m.group(1), get_context(js_code, m.span())))
  58.  
  59.     return tokens, ids, sospechosos, usernames, tme_users, context
  60.  
  61. def obtener_js_desde_src(base_url, src):
  62.     src_full = urljoin(base_url, src)
  63.     try:
  64.         r = requests.get(src_full, headers=HEADERS, timeout=TIMEOUT)
  65.         r.raise_for_status()
  66.         return src_full, r.text
  67.     except requests.RequestException:
  68.         return src_full, None
  69.  
  70. def analizar_url(url):
  71.     try:
  72.         r = requests.get(url, headers=HEADERS, timeout=TIMEOUT)
  73.         r.raise_for_status()
  74.     except requests.RequestException as e:
  75.         print(f"❌ Error al acceder a {url}: {e}")
  76.         return
  77.  
  78.     soup = BeautifulSoup(r.text, "html.parser")
  79.     scripts = soup.find_all("script")
  80.  
  81.     resumen = {
  82.         "tokens": [],
  83.         "ids": [],
  84.         "sospechosos": [],
  85.         "usernames": [],
  86.         "tme_users": []
  87.     }
  88.  
  89.     for i, script in enumerate(scripts):
  90.         js_code = ""
  91.         source = ""
  92.  
  93.         if script.get("src"):
  94.             source, js_code = obtener_js_desde_src(url, script["src"])
  95.             if js_code is None:
  96.                 continue
  97.         else:
  98.             js_code = script.string or script.text or ""
  99.             source = f"[INLINE #{i}]"
  100.  
  101.         tokens, ids, sospechosos, usernames, tme_users, context = extraer_de_codigo(js_code)
  102.  
  103.         if tokens or ids or sospechosos or usernames or tme_users:
  104.             print("\n====================")
  105.             print("Fuente:", source)
  106.             if context["tokens"]:
  107.                 print("\n🧾 Tokens encontrados:")
  108.                 for t, ctx in context["tokens"]:
  109.                     print(" -", t)
  110.                     print("   contexto:", ctx)
  111.             if context["ids"]:
  112.                 print("\n🆔 IDs explícitos:")
  113.                 for id_, ctx in context["ids"]:
  114.                     print(" -", id_)
  115.                     print("   contexto:", ctx)
  116.             if context["sospechosos"]:
  117.                 print("\n❓ IDs sospechosos:")
  118.                 for s, ctx in context["sospechosos"]:
  119.                     print(" -", s)
  120.                     print("   contexto:", ctx)
  121.             if context["usernames"]:
  122.                 print("\n📣 Usernames con @:")
  123.                 for u, ctx in context["usernames"]:
  124.                     print(" - @"+u)
  125.                     print("   contexto:", ctx)
  126.             if context["tme_users"]:
  127.                 print("\n🔗 Enlaces t.me / tg resolve:")
  128.                 for u, ctx in context["tme_users"]:
  129.                     print(" -", u)
  130.                     print("   contexto:", ctx)
  131.  
  132.             # actualizar resumen global (sin contexto)
  133.             resumen["tokens"].extend(list(tokens))
  134.             resumen["ids"].extend(list(ids))
  135.             resumen["sospechosos"].extend(list(sospechosos))
  136.             resumen["usernames"].extend(list(usernames))
  137.             resumen["tme_users"].extend(list(tme_users))
  138.  
  139.     # imprimir resumen único
  140.     print("\n====================")
  141.     print("RESUMEN ÚNICO (solo valores detectados):")
  142.     if resumen["tokens"]:
  143.         print("Tokens:", sorted(set(resumen["tokens"])))
  144.     if resumen["ids"]:
  145.         print("IDs:", sorted(set(resumen["ids"])))
  146.     if resumen["sospechosos"]:
  147.         print("IDs sospechosos:", sorted(set(resumen["sospechosos"])))
  148.     if resumen["usernames"]:
  149.         print("Usernames @:", ["@"+u for u in sorted(set(resumen["usernames"]))])
  150.     if resumen["tme_users"]:
  151.         print("t.me / tg resolve:", sorted(set(resumen["tme_users"])))
  152.     if not any(resumen.values()):
  153.         print("✅ No se encontraron tokens, IDs ni usernames relacionados con Telegram.")
  154.  
  155. if __name__ == "__main__":
  156.     url = input("🌐 Ingresa la URL a analizar: ").strip()
  157.     analizar_url(url)
Advertisement
Add Comment
Please, Sign In to add comment