#!/usr/bin/env python3
"""Cari dua hal di seluruh isi StudioSoft: (1) tautan tak terlihat <a></a>, (2) tautan luar yang tidak wajar."""
import base64, json, re, sys, time, urllib.request

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
S = "https://studiosoft.id"
A = base64.b64encode(b"bambangbot:q26r RePo BVy6 pwU2 F3z7 ouyl").decode()
H = {"Authorization": f"Basic {A}", "User-Agent": "Mozilla/5.0", "Content-Type": "application/json"}
UA = {"User-Agent": "Mozilla/5.0"}
GO = "--go" in sys.argv

# domain yang wajar dijadikan rujukan
BOLEH = ("studiosoft.id", "google.com", "google.co.id", "blog.google", "developers.google.com",
         "yoast.com", "schema.org", "w3.org", "kemkes.go.id", "wipo.int", "instagram.com",
         "facebook.com", "youtube.com", "wa.me", "whatsapp.com", "linkedin.com", "tiktok.com",
         "bpom.go.id", "kemenkumham.go.id", "perplexity.ai", "seoptimer.com", "ahrefs.com",
         "moz.com", "semrush.com", "shopee.co.id", "tokopedia.com", "kompas.com", "detik.com",
         "antaranews.com", "kontan.co.id", "katadata.co.id", "cnbcindonesia.com", "bisnis.com",
         "tribunnews.com", "suara.com", "jawapos.com", "surabaya.go.id", "kemdikbud.go.id",
         "ui.ac.id", "its.ac.id", "unair.ac.id", "wikipedia.org", "halodoc.com", "alodokter.com")


def rest(p, ulang=3):
    akhir = ""
    for i in range(ulang):
        try:
            return json.loads(urllib.request.urlopen(urllib.request.Request(S + p, headers=H), timeout=150).read())
        except Exception as e:
            akhir = str(e)[:40]
            time.sleep(5 + i * 5)
    raise RuntimeError(akhir)


daftar = []
for jenis in ("posts", "pages"):
    hal = 1
    while hal <= 12:
        try:
            d = rest(f"/wp-json/wp/v2/{jenis}?per_page=50&page={hal}&status=publish&_fields=id,slug")
        except Exception:
            break
        if not isinstance(d, list) or not d:
            break
        daftar += [(jenis, x["id"], x["slug"]) for x in d]
        if len(d) < 50:
            break
        hal += 1
print(f"memeriksa {len(daftar)} artikel/halaman")

kosong, luaran = [], []
for i, (jenis, pid, slug) in enumerate(daftar, 1):
    try:
        isi = rest(f"/wp-json/wp/v2/{jenis}/{pid}?context=edit&_fields=content")["content"]["raw"]
    except Exception:
        continue
    for mo in re.finditer(r'<a\b([^>]*)>(.*?)</a>', isi, re.S):
        attr = mo.group(1)
        teks = re.sub(r"\s+", " ", re.sub("<[^>]+>", "", mo.group(2))).strip()
        m = re.search(r'href="([^"]+)"', attr)
        u = m.group(1) if m else ""
        if not teks and u:
            kosong.append((jenis, pid, slug, u))
        elif u.startswith("http") and not any(b in u for b in BOLEH):
            luaran.append((jenis, pid, slug, u, teks[:50]))
    if i % 50 == 0:
        print(f"   … {i}/{len(daftar)}")

print(f"\n=== tautan tak terlihat (tanpa teks): {len(kosong)} ===")
for jenis, pid, slug, u in kosong[:40]:
    print(f"   #{pid} [{jenis}] {slug[:44]:<46} {u[:70]}")

print(f"\n=== tautan luar di luar daftar wajar: {len(luaran)} ===")
for jenis, pid, slug, u, teks in luaran[:40]:
    print(f"   #{pid} [{jenis}] {slug[:40]:<42} {u[:60]} «{teks}»")

json.dump({"kosong": [list(x) for x in kosong], "luaran": [list(x) for x in luaran]},
          open(f"{WS}/drafts/ss_tautan_mencurigakan.json", "w"), ensure_ascii=False, indent=1)
print("\n→ drafts/ss_tautan_mencurigakan.json")
