#!/usr/bin/env python3
"""Artikel harian TSC: «Kapan Tahi Lalat Perlu Diperiksa ke Dokter» (1.000-1.300 kata).

Topik dari tsc_topik_bank.json (entri 5). Entri 4 («Gejala PMS ...») dilewati karena
di situs ini PMS dipakai untuk Penyakit Menular Seksual (artikel #8871, #8881, #1700)
sehingga judulnya benturan; lihat catatan di bank.

Pakai:
  python3 tsc_artikel_kapan_tahi_lalat_perlu_diperiksa.py            (dry run: hitung kata)
  python3 tsc_artikel_kapan_tahi_lalat_perlu_diperiksa.py --draft    (buat draf + meta + gambar unggulan)
  python3 tsc_artikel_kapan_tahi_lalat_perlu_diperiksa.py --schedule 2026-10-19
"""
import base64, importlib.util, json, os, re, sys, time, urllib.error, urllib.request
from xml.sax.saxutils import escape

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
spec = importlib.util.spec_from_file_location("cfg", f"{WS}/cfg_tsc.py")
m = importlib.util.module_from_spec(spec)
spec.loader.exec_module(m)
CFG = m.CFG
DOM = CFG["domain"]
USER, SANDI = CFG["user"], CFG["pass"]
AUTH = base64.b64encode(f"{USER}:{SANDI}".encode()).decode()
UA = {"User-Agent": "Mozilla/5.0"}
PID_BERKAS = f"{WS}/drafts/tsc_pid_tahi_lalat.json"

JUDUL = "Kapan Tahi Lalat Perlu Diperiksa ke Dokter"
SLUG = "kapan-tahi-lalat-perlu-diperiksa"
FOKUS = "tahi lalat berbahaya"
META_JUDUL = "Kapan Tahi Lalat Perlu Diperiksa ke Dokter"
META_DESC = ("Tahi lalat tidak selalu berbahaya. Kenali tanda yang perlu diperiksa dokter, "
             "dari perubahan bentuk dan warna sampai keluhan yang menyertainya.")

WA = ("https://wa.me/6285117444417?text=Saya%20ingin%20konsultasi%20masalah%20kulit%20di%20"
      "The%20Skin%20Code%20Clinic")
TOMBOL = ('<p style="text-align:center;margin:32px 0 8px"><a class="wp-block-button__link '
          'wp-element-button" href="' + WA + '" target="_blank" rel="noopener" '
          'style="display:inline-block;background-color:#0f2557;color:#ffffff;padding:15px 34px;'
          'font-size:18px;font-weight:bold;text-decoration:none;border-radius:6px;">'
          'KONSULTASI GRATIS</a></p>')

ISI = """
<p>Sebagian orang baru menyadari ada yang berbeda pada tahi lalatnya saat sedang bercermin. Bentuknya
tidak lagi bulat, warnanya bertambah gelap, atau ukurannya membesar dibanding foto setahun lalu. Karena
tidak nyeri dan tidak mengganggu aktivitas, sering kali hal itu dibiarkan dulu, dengan harapan akan
kembali seperti semula.</p>

<p>Padahal pada sebagian kasus, perubahan kecil seperti itulah yang membuat sebuah tahi lalat perlu
diperiksa. Sebagian besar tahi lalat memang tidak berbahaya dan tidak perlu ditangani. Yang menjadi
perhatian dokter bukan keberadaannya, melainkan perubahan pada tahi lalat yang sudah lama ada atau tahi
lalat baru yang muncul setelah usia dewasa.</p>

<p>Halaman ini membahas cara membedakan tahi lalat yang wajar dan yang perlu diwaspadai, tanda apa saja
yang layak diperiksakan, serta apa yang dilakukan dokter saat memeriksanya.</p>

<h2>Apa Sebenarnya Tahi Lalat</h2>
<p>Tahi lalat terbentuk dari kumpulan sel penghasil pigmen yang disebut melanosit. Sel-sel ini tumbuh
berkelompok di lapisan kulit, dan kelompok itulah yang tampak sebagai bercak cokelat atau hitam di
permukaan tubuh. Sebagian tahi lalat sudah ada sejak lahir, sebagian muncul kemudian, dan jumlahnya bisa
bertambah sampai usia sekitar tiga puluh tahun.</p>

<p>Orang dewasa umumnya memiliki 10 sampai 40 tahi lalat di seluruh tubuh, dan jumlah itu berbeda pada
setiap orang. Tahi lalat yang wajar biasanya berwarna seragam, tepinya rata, bentuknya bulat atau oval,
serta berukuran tidak lebih dari 6 milimeter atau sekitar ujung pensil. Yang paling menentukan bukan
ukurannya, melainkan apakah bentuk dan warnanya berubah dari waktu ke waktu.</p>

<h2>Tanda Tahi Lalat yang Perlu Diperiksa</h2>
<p>Dokter kulit biasa memakai lima patokan berikut untuk menilai apakah sebuah tahi lalat perlu diperiksa
lebih lanjut. Patokan ini mudah diingat karena disingkat dari A sampai E.</p>

<ul>
<li>Asimetri. Bayangkan garis tengah membelah tahi lalat. Kalau sisi kiri dan sisi kanannya tidak
sepadan, bentuknya disebut asimetris.</li>
<li>Batas tepi. Tepi tahi lalat yang tidak rata, bergerigi, atau mengabur ke kulit sekitarnya perlu
dicurigai.</li>
<li>Warna. Warna yang tidak seragam, misalnya bercampur cokelat, hitam, kemerahan, atau kebiruan dalam
satu tahi lalat.</li>
<li>Diameter. Ukuran yang melebihi 6 milimeter, atau yang jelas membesar dibandingkan sebelumnya.</li>
<li>Evolusi. Perubahan pada bentuk, warna, atau ukuran yang terjadi dalam hitungan pekan sampai bulan,
termasuk rasa gatal dan perih yang baru muncul.</li>
</ul>

<p>Ada satu hal lagi yang perlu dicatat. Tahi lalat yang berdarah sendiri, berkerak, terasa gatal terus
menerus, atau nyeri saat disentuh umumnya bukan gambaran tahi lalat jinak. Begitu pula tahi lalat yang
tepinya melebar atau warnanya bertambah gelap dalam waktu singkat. Keluhan seperti itu layak diperiksakan
lebih cepat, tanpa menunggu munculnya tanda yang berikutnya.</p>

<p>Pemantauan di rumah tetap berguna, tetapi tidak menggantikan pemeriksaan dokter. Bagian terpenting dari
pemeriksaan tahi lalat sebenarnya sederhana, yaitu mengenali perubahannya lebih dulu. Perubahan yang
terlihat dini memberi ruang lebih luas untuk penanganan yang tepat.</p>

<h2>Perubahan yang Sering Dianggap Biasa</h2>
<p>Ada beberapa anggapan yang membuat orang menunda pemeriksaan. Salah satunya menganggap tahi lalat yang
kecil pasti aman. Ukuran memang salah satu patokan, tetapi bukan penentu tunggal, karena tahi lalat kecil
pun bisa berubah warna atau tepinya menjadi tidak rata.</p>

<p>Anggapan kedua, tahi lalat yang tidak nyeri tidak perlu diperiksa. Sebagian besar perubahan awal justru
tidak menimbulkan nyeri, sehingga keluhan rasa sakit bukan syarat untuk datang memeriksakan diri.</p>

<p>Yang juga sering luput adalah letak tahi lalat. Punggung, bagian belakang lengan dan kaki, sela jari
kaki, telapak kaki, serta area di bawah kuku jarang terlihat saat bercermin. Padahal di situlah perubahan
sering kali terlambat disadari. Kalau Anda sulit menjangkau area tersebut, minta bantuan orang di rumah
untuk memeriksanya secara berkala, atau tunjukkan ke dokter.</p>

<p>Tahi lalat yang baru muncul setelah usia dewasa juga layak diperhatikan, terutama bila tumbuh cepat
dalam beberapa pekan. Pada orang dewasa, kulit seharusnya tidak lagi banyak menghasilkan tahi lalat baru.</p>

<h2>Faktor yang Meningkatkan Risiko</h2>
<p>Risiko kanker kulit, termasuk melanoma yang bisa berkembang dari tahi lalat, lebih tinggi pada orang
dengan kulit terang dan mudah terbakar sinar matahari, orang yang pernah mengalami luka bakar matahari
sampai melepuh, serta orang dengan riwayat kanker kulit di keluarga. Orang yang memiliki lebih dari 50
tahi lalat di tubuhnya juga termasuk kelompok yang perlu memantau diri lebih rapi.</p>

<p>Kebiasaan menyamak kulit atau memakai alat tanning menambah paparan sinar ultraviolet, dan paparan itu
termasuk faktor risiko yang bisa dihindari. Faktor-faktor di atas bukan berarti Anda pasti mengalami
penyakit tersebut. Fungsinya hanya membantu menentukan seberapa ketat pemantauan yang perlu Anda jalani.
Orang tanpa faktor risiko tetap perlu memeriksakan tahi lalat yang berubah.</p>

<h2>Apa yang Terjadi Saat Tahi Lalat Diperiksa</h2>
<p>Pemeriksaan dimulai dari cerita Anda: sejak kapan tahi lalat itu muncul dan perubahan apa yang
diperhatikan. Kalau ada foto lama, membawanya sangat membantu karena dokter bisa membandingkan bentuk dan
warnanya secara langsung.</p>

<p>Selanjutnya kulit diperiksa memakai dermoskopi, alat pembesar khusus yang memperlihatkan struktur warna
dan pembuluh darah di dalam tahi lalat. Pemeriksaan ini tidak nyeri, hanya alat yang ditempelkan di
permukaan kulit. Dari situ dokter menilai apakah ada gambaran yang mencurigakan.</p>

<p>Kalau hasil pemeriksaan menimbulkan kecurigaan, dokter biasanya menyarankan biopsi, yaitu pengambilan
sedikit jaringan untuk diperiksa di laboratorium. Ini satu-satunya cara memastikan apakah selnya jinak
atau tidak. Sebagian besar tahi lalat yang diperiksa hasilnya jinak, dan itu kabar baik. Tetapi memastikan
lewat pemeriksaan tetap jauh lebih tenang daripada menebak-nebak sendiri di rumah.</p>

<p>Kalau hasilnya jinak dan tidak ada keluhan, Anda cukup memantau di rumah sambil melakukan kontrol
berkala sesuai anjuran dokter.</p>

<h2>Memeriksa karena Alasan Medis, Menghapus karena Alasan Tampilan</h2>
<p>Dua tujuan ini sering tertukar. Pemeriksaan medis menilai apakah ada risiko keganasan pada tahi lalat.
Sedangkan penghapusan umumnya dilakukan karena alasan tampilan, atau karena letaknya sering tergesek
pakaian dan terasa mengganggu. Keduanya sama-sama dikerjakan dokter, tetapi jalurnya berbeda.</p>

<p>Kalau Anda mempertimbangkan penghapusan tahi lalat, sebaiknya tetap didahului pemeriksaan. Penjelasan
soal tindakan tersebut ada di halaman
<a href="https://www.theskincodeclinic.com/solusi-tahi-lalat-mengganggu-prosedur-medis-cepat-di-the-skin-code-clinic/">solusi tahi lalat yang mengganggu</a>
dan
<a href="https://www.theskincodeclinic.com/hapus-tahi-lalat-aman-estetis-kulit-lebih-percaya-diri/">penghapusan tahi lalat yang aman</a>.
Untuk keluhan kulit lain yang perlu dinilai dokter, mulai dari
<a href="https://www.theskincodeclinic.com/kapan-harus-ke-dokter-kulit/">tanda kulit yang wajib diperiksa</a>.</p>

""" + TOMBOL + """

<h2>Pertanyaan yang Sering Diajukan</h2>

<h3>Apakah semua tahi lalat harus diperiksa dokter?</h3>
<p>Tidak. Tahi lalat yang bentuk dan warnanya stabil, tidak menimbulkan keluhan, dan tidak berubah sejak
lama cukup diamati di rumah. Yang perlu diperiksa adalah tahi lalat yang berubah atau memunculkan keluhan
baru.</p>

<h3>Bagaimana cara memantau tahi lalat sendiri di rumah?</h3>
<p>Foto tahi lalat dari jarak sekitar 15 sentimeter di tempat terang, tanpa filter, dan sertakan pembanding
ukuran seperti penggaris di sisi gambar. Simpan fotonya dengan tanggal pengambilan, lalu ulangi setiap
beberapa bulan. Yang penting konsisten, karena perubahan kecil justru paling mudah terlihat saat
dibandingkan dengan foto lama, bukan dari ingatan.</p>

<h3>Apakah bisa konsultasi tanpa langsung menjalani tindakan?</h3>
<p>Bisa. Pemeriksaan dan konsultasi berdiri sendiri. Tindakan baru dilakukan kalau memang dibutuhkan,
disetujui, dan setelah Anda memahami pertimbangannya. Kalau tahi lalat Anda cukup dipantau, dokter akan
mengatakannya apa adanya.</p>

<h3>Kalau muncul tahi lalat baru, apakah langsung berbahaya?</h3>
<p>Belum tentu. Tahi lalat baru pada orang dewasa bisa jinak, tetapi karena muncul di usia yang seharusnya
sudah jarang terbentuk tahi lalat baru, sebaiknya diperiksa, lebih-lebih kalau tumbuh cepat atau warnanya
tidak seragam.</p>

<h2>Baca juga</h2>
<p>Panduan berobat ke dokter kulit di Sidoarjo, termasuk apa yang perlu disiapkan sebelum datang, ada di
<a href="https://www.theskincodeclinic.com/dokter-kulit-sidoarjo-panduan-berobat/">panduan berobat dan cara membuat janji</a>.
Sedangkan pertimbangan memilih klinik kulit di Krian dan Sidoarjo kami rangkum di
<a href="https://www.theskincodeclinic.com/5-klinik-kecantikan-di-krian-sidoarjo-standar-medis/">daftar klinik kecantikan berstandar medis</a>.</p>

<p>Kalau Anda memiliki tahi lalat yang berubah bentuk atau menimbulkan keluhan, langkah paling tenang
adalah memeriksakannya lebih dulu, bukan menebak sendiri. Siapkan foto lama tahi lalat itu bila ada,
lalu tanyakan langsung kepada dokter apakah kondisinya perlu ditindaklanjuti.</p>
"""


# ---------- bantu ----------
def rest(path, method="GET", data=None, timeout=180):
    h = {"Authorization": f"Basic {AUTH}", **UA}
    body = None
    if data is not None:
        body = json.dumps(data).encode()
        h["Content-Type"] = "application/json"
    r = urllib.request.Request(f"https://{DOM}{path}", data=body, headers=h, method=method)
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=timeout) as x:
                return x.status, json.loads(x.read())
        except urllib.error.HTTPError as e:
            return e.code, e.read().decode()[:300]
        except Exception:
            time.sleep(4)
    return 0, "gagal"


def rpc(method, params=()):
    def val(v):
        if isinstance(v, bool):
            return f"<value><boolean>{1 if v else 0}</boolean></value>"
        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", **UA}, method="POST")
    with urllib.request.urlopen(r, timeout=180) as x:
        return x.read().decode("utf-8", "replace")


def fault(isi):
    mm = re.search(r"<name>faultString</name><value><string>(.*?)</string>", isi, re.S)
    return mm.group(1) if mm else None


def isi_bersih():
    t = re.sub(r"<[^>]+>", " ", ISI)
    for nama, pola in (("em dash", "—"), ("kutip melengkung", "[“”‘’]"),
                       ("CJK", "[\u3000-\u9fff\uac00-\ud7af]"), ("tanda seru", "!")):
        n = re.findall(pola, t)
        if n:
            print(f"   ⛔ {nama}: {len(n)}×")
            return False
    return True


# ---------- dry run ----------
kata = len(re.sub(r"<[^>]+>", " ", ISI).split())
if os.path.exists(PID_BERKAS):
    pid_lama = json.load(open(PID_BERKAS)).get("id")
else:
    pid_lama = None

print(f"=== {JUDUL}")
print(f"   slug   : {SLUG}")
print(f"   fokus  : {FOKUS}")
print(f"   kata   : {kata} (target 1.000-1.300)")
print(f"   meta judul : {len(META_JUDUL)} karakter (maks 60)")
print(f"   meta desc  : {len(META_DESC)} karakter (target 140-158)")
print(f"   H2: {ISI.count('<h2')} · H3: {ISI.count('<h3')} · tombol WA: {'ada' if 'wa.me' in ISI else 'TIDAK ADA'}")
print(f"   tautan internal: {len(re.findall('theskincodeclinic[.]com', ISI))}")
print(f"   bersih pola: {'ya' if isi_bersih() else 'TIDAK'}")

if not (sys.argv[1:2] and sys.argv[1] in ("--draft", "--schedule")):
    print("\n(dry run)")
    sys.exit(0)


# ---------- langkah draf ----------
def buat_draf():
    st, d = rest("/wp-json/wp/v2/posts", "POST", {"title": JUDUL, "slug": SLUG, "content": ISI,
                                                  "status": "draft", "comment_status": "closed"})
    if not isinstance(d, dict) or "id" not in d:
        print(f"   ❌ draf gagal: {st} {str(d)[:200]}")
        return None
    pid = d["id"]
    json.dump({"id": pid, "slug": SLUG}, open(PID_BERKAS, "w"))
    print(f"   ✅ draf #{pid} · {d.get('link')}")

    # meta Yoast lewat XML-RPC, kirim ULANG seluruh custom field
    p = rpc("wp.getPost", [1, USER, SANDI, pid])
    if fault(p):
        print(f"   ❌ XML-RPC getPost: {fault(p)[:120]}")
        return pid
    cf = re.findall(r"<member><name>key</name><value><string>(.*?)</string></value></member>\s*"
                    r"<member><name>value</name><value><string>(.*?)</string>", p, re.S)
    cf = [{"key": k, "value": v} for k, v in cf]
    buang = {"_yoast_wpseo_title", "_yoast_wpseo_metadesc", "_yoast_wpseo_focuskw"}
    baru = [x for x in cf if x["key"] not in buang]
    baru += [{"key": "_yoast_wpseo_title", "value": META_JUDUL},
             {"key": "_yoast_wpseo_metadesc", "value": META_DESC},
             {"key": "_yoast_wpseo_focuskw", "value": FOKUS}]
    res = rpc("wp.editPost", [1, USER, SANDI, pid, {"custom_fields": baru}])
    f = fault(res)
    print(f"   meta Yoast: {'❌ ' + f[:120] if f else '✅ terkirim (field lama: ' + str(len(cf)) + ')'}")
    time.sleep(2)
    p2 = rpc("wp.getPost", [1, USER, SANDI, pid])
    simpan = dict(re.findall(r"<member><name>key</name><value><string>(_yoast[^<]*)</string></value>"
                             r"</member>\s*<member><name>value</name><value><string>(.*?)</string>", p2, re.S))
    for k in buang:
        v = simpan.get(k)
        print(f"        {k}: {'✅ ' + v[:60] if v else '❌ KOSONG'}")
    return pid


def buat_gambar(pid):
    from PIL import Image, ImageDraw, ImageFont
    FONTS = os.path.expanduser("~/.fonts")
    NAVY, BIRU, ABU, PUTIH = (11, 31, 58), (30, 64, 175), (100, 116, 139), (255, 255, 255)
    W, H, PAD = 1000, 567, 62
    fn = lambda n, u: ImageFont.truetype(os.path.join(FONTS, n), u)
    img = Image.new("RGB", (W, H), PUTIH)
    d = ImageDraw.Draw(img)
    panel = int(W * 0.34)
    d.rectangle([W - panel, 0, W, H], fill=BIRU)
    for i, r in enumerate((150, 110, 70)):
        x, y = W - panel // 2, H // 2
        d.ellipse([x - r, y - r, x + r, y + r], outline=PUTIH, width=3 if i == 2 else 2)
    d.ellipse([W - panel // 2 - 12, H // 2 - 12, W - panel // 2 + 12, H // 2 + 12], fill=PUTIH)
    d.rectangle([0, 0, 10, H], fill=BIRU)
    d.text((PAD, PAD - 6), "THE SKIN CODE CLINIC", font=fn("Poppins-SemiBold.ttf", 24), fill=BIRU)
    d.text((PAD, PAD + 26), "Krian, Sidoarjo", font=fn("Poppins-Regular.ttf", 20), fill=ABU)

    def bungkus(teks, font, maks):
        kata_, baris, kini = teks.split(), [], ""
        for k in kata_:
            coba = (kini + " " + k).strip()
            if font.getlength(coba) <= maks:
                kini = coba
            else:
                baris.append(kini)
                kini = k
        if kini:
            baris.append(kini)
        return baris

    maks = W - panel - PAD - 46
    y = 168
    for b in bungkus("Tahi Lalat Berbahaya", fn("Poppins-Bold.ttf", 62), maks):
        d.text((PAD, y), b, font=fn("Poppins-Bold.ttf", 62), fill=NAVY)
        y += 74
    y += 6
    for b in bungkus("Kapan perlu diperiksa dokter", fn("Poppins-Regular.ttf", 27), maks):
        d.text((PAD, y), b, font=fn("Poppins-Regular.ttf", 27), fill=ABU)
        y += 38
    d.rectangle([PAD, H - 96, PAD + 74, H - 92], fill=BIRU)
    d.text((PAD, H - 78), "theskincodeclinic.com", font=fn("Poppins-SemiBold.ttf", 23), fill=NAVY)
    d.text((PAD, H - 46), "Konsultasi lewat WhatsApp", font=fn("Poppins-Regular.ttf", 20), fill=ABU)
    out = f"{WS}/tsc_feat_kapan-tahi-lalat-perlu-diperiksa.webp"
    img.save(out, "WEBP", quality=92, method=6)
    print(f"   gambar: {out} · {img.size} · {os.path.getsize(out)//1024} KB")

    data = open(out, "rb").read()
    h = {"Authorization": f"Basic {AUTH}", **UA, "Content-Type": "image/webp",
         "Content-Disposition": f'attachment; filename="{os.path.basename(out)}"'}
    r = urllib.request.Request(f"https://{DOM}/wp-json/wp/v2/media", data=data, headers=h, method="POST")
    try:
        with urllib.request.urlopen(r, timeout=300) as x:
            med = json.loads(x.read())
    except urllib.error.HTTPError as e:
        print(f"   ❌ unggah media: HTTP {e.code} {e.read().decode()[:150]}")
        return
    print(f"   ✅ media #{med['id']} · {med.get('source_url')}")
    st2, _ = rest(f"/wp-json/wp/v2/media/{med['id']}", "POST",
                  {"alt_text": "Tahi lalat berbahaya: kapan perlu diperiksa dokter",
                   "title": "Gambar unggulan: Kapan Tahi Lalat Perlu Diperiksa"})
    st3, d3 = rest(f"/wp-json/wp/v2/posts/{pid}", "POST", {"featured_media": med["id"]})
    print(f"   pasang unggulan: HTTP {st3} · featured_media = {d3.get('featured_media') if isinstance(d3, dict) else d3}")


if sys.argv[1] == "--draft":
    pid = buat_draf()
    if pid:
        buat_gambar(pid)
    sys.exit(0)

if sys.argv[1] == "--schedule":
    tgl = sys.argv[2]
    if not pid_lama:
        sys.exit("belum ada draf (jalankan --draft dulu)")
    # zona situs = UTC (date == date_gmt) → 08:00 WIB = 01:00 UTC
    st, d = rest(f"/wp-json/wp/v2/posts/{pid_lama}", "POST",
                 {"status": "future", "date": f"{tgl}T01:00:00"})
    print(f"   jadwalkan #{pid_lama} → {tgl}T01:00:00 (UTC) · HTTP {st}")
    time.sleep(3)
    st2, cek = rest(f"/wp-json/wp/v2/posts/{pid_lama}?context=edit")
    if not isinstance(cek, dict):
        sys.exit(f"   ❌ baca balik gagal: {st2}")
    isi_asli = cek.get("content", {}).get("raw", "")
    print(f"   status: {cek.get('status')} · date: {cek.get('date')} · slug: {cek.get('slug')}")
    print(f"   judul : {cek.get('title', {}).get('raw')}")
    print(f"   kata  : {len(re.sub(r'<[^>]+>', ' ', isi_asli).split())} · tombol WA: {'ada' if 'wa.me' in isi_asli else 'TIDAK ADA'}")
    print(f"   unggulan: {cek.get('featured_media')} · tautan internal: {len(re.findall('theskincodeclinic', isi_asli))}")
