#!/usr/bin/env python3
"""TSLaw: lihat struktur mentah respons wp.getPost untuk menemukan letak meta Yoast."""
import base64, re, urllib.request, urllib.error
from xml.sax.saxutils import escape

DOM = "tslaw.id"
USER, PASS = "bambangbot", "EFKm EYGx VQCP Y9go ncPr uM2Y"
AUTH = base64.b64encode(f"{USER}:{PASS}".encode()).decode()


def rpc(method, params=()):
    def val(v):
        if isinstance(v, int):
            return f"<value><int>{v}</int></value>"
        if isinstance(v, list):
            return "<value><array><data>" + "".join(val(x) for x in v) + "</data></array></value>"
        if isinstance(v, dict):
            return "<value><struct>" + "".join(f"<member><name>{escape(str(k))}</name>{val(x)}</member>"
                                               for k, x in v.items()) + "</struct></value>"
        return f"<value><string>{escape(str(v))}</string></value>"
    body = ("<?xml version=\"1.0\"?><methodCall><methodName>" + method + "</methodName><params>" +
            "".join(f"<param>{val(p)}</param>" for p in params) + "</params></methodCall>").encode()
    r = urllib.request.Request(f"https://www.{DOM}/xmlrpc.php", data=body,
                               headers={"Content-Type": "text/xml", "User-Agent": "Mozilla/5.0",
                                        "Authorization": f"Basic {AUTH}"}, method="POST")
    with urllib.request.urlopen(r, timeout=150) as x:
        return x.read().decode("utf-8", "replace")


isi = rpc("wp.getPost", [1, USER, PASS, 834])
print(f"panjang respons: {len(isi)} karakter")
print("jumlah kemunculan 'yoast':", len(re.findall(r"yoast", isi, re.I)))
for m in list(re.finditer(r"yoast", isi, re.I))[:5]:
    print("\n...", re.sub(r"\s+", " ", isi[max(0, m.start()-200):m.start()+260]), "...")

print("\n=== nama field yang terbaca (member > name) ===")
nama = re.findall(r"<member><name>([^<]+)</name>", isi)
print(f"total {len(nama)} field")
for n in nama:
    if "yoast" in n.lower() or n.startswith("_") or "meta" in n.lower():
        print("   ", n)
