#!/usr/bin/env python3
"""Konsolidasi klaster klinik/RS (23 Jul): 1 pilar + 2 pendukung, 7 artikel ke trash."""
import base64, html, importlib.util, json, os, re, sys, time, urllib.request, urllib.error

S = "https://studiosoft.id"
AUTH = base64.b64encode(b"bambangbot:q26r RePo BVy6 pwU2 F3z7 ouyl").decode()
WA = """
<style>
.ss-cta-wa{display:inline-flex;align-items:center;gap:10px;background-color:#6878d6;color:#ffffff !important;
font-family:'Open Sans',sans-serif;font-weight:600;font-size:17px;padding:15px 30px;border-radius:8px;
text-decoration:none !important;line-height:1.2;box-shadow:0 2px 8px rgba(104,120,214,.35)}}
.ss-cta-wa:hover{background-color:#4d61d6;color:#ffffff !important}
</style>
<p style="text-align:center;margin:34px 0 6px">
<a class="ss-cta-wa" href="https://wa.me/6281935000624?text=Halo%20StudioSoft%2C%20saya%20ingin%20konsultasi%20gratis%20untuk%20bisnis%20saya" target="_blank" rel="noopener" role="button">WhatsApp: Konsultasi Gratis</a>
</p>
<p style="text-align:center;font-size:14px;color:#5b5b6b;margin:0 0 26px">Dibalas langsung oleh tim StudioSoft, tanpa biaya dan tanpa komitmen.</p>
"""

# ============ PILAR: #5970 ============
PILAR = {
    "judul": "Digital Marketing Rumah Sakit & Klinik: Panduan Lengkap 2026",
    "fk": "digital marketing rumah sakit",
    "meta": "Digital marketing rumah sakit dan klinik: strategi konten etis, SEO lokal, Google Business Profile, iklan, sampai evaluasi datanya. Panduan lengkap 2026.",
    "isi": """
<p>Digital marketing rumah sakit dan klinik berbeda dari promosi bisnis biasa. Ada aturan etik, tanggung jawab atas informasi kesehatan, dan pembaca yang sedang cemas mencari jawaban. Panduan ini merangkum apa yang benar-benar bekerja untuk RS dan klinik di Indonesia: dari konten edukasi, SEO lokal, Google Business Profile, media sosial, iklan berbayar, sampai cara mengevaluasi hasilnya.</p>

<h2>Pasien modern tidak lagi mencari lewat brosur</h2>
<p>Sepuluh tahun lalu orang bertanya ke tetangga atau membuka buku telepon. Sekarang mereka membuka Google, mengetik "dokter spesialis jantung Surabaya", lalu membandingkan tiga rumah sakit dari website dan ulasan. Keputusan pertama diambil di layar ponsel, bukan di meja pendaftaran. Konsekuensinya sederhana: kalau informasi Anda tidak muncul atau sulit dibaca, pasien itu berpindah ke klinik lain sebelum pernah menghubungi Anda.</p>

<h2>Tiga aturan dasar sebelum mulai</h2>
<p><strong>Etika.</strong> Jangan menjanjikan kesembuhan, jangan menakut-nakuti pembaca agar segera berobat, dan jangan membandingkan diri dengan fasilitas lain secara merendahkan. <strong>Akurasi.</strong> Setiap klaim medis sebaiknya ditinjau dokter atau tenaga medis di institusi Anda, dan cantumkan nama peninjau. <strong>Izin.</strong> Foto pasien, testimoni, dan data apa pun yang bisa mengidentifikasi seseorang hanya boleh dipakai dengan persetujuan tertulis.</p>

<h2>Konten edukasi: marketing paling halus</h2>
<p>Ketika rumah sakit atau klinik rajin membagikan edukasi — bukan promosi — kepercayaan terbangun sendiri. Pembaca melihat institusi Anda sebagai sumber yang membantu, bukan yang menjual. Efeknya memang tidak instan, tetapi inilah jenis konten yang paling sering dibagikan ulang dan paling sering dikutip mesin pencari.</p>
<p>Contoh bentuk konten yang aman dan berguna: penjelasan gejala umum, panduan kapan harus ke dokter, tanya jawab dengan dokter, tips gaya hidup, penjelasan prosedur medis dengan bahasa awam, dan profil dokter beserta keahliannya. Untuk daftar lebih lengkap, lihat <a href="https://studiosoft.id/9-contoh-konten-digital-marketing-rumah-sakit-yang-edukatif-dan-tetap-etis/">9 contoh konten digital marketing rumah sakit</a> yang edukatif dan tetap etis.</p>

<h2>Website yang benar-benar menghasilkan pasien</h2>
<p>Banyak website RS dan klinik hadir di internet tapi tidak menghasilkan apa-apa. Masalahnya biasanya empat: informasi layanan tidak lengkap, jadwal dan cara mendaftar tidak jelas, halaman lambat dibuka di ponsel, dan tidak ada jalur kontak yang langsung terlihat. Perbaikan yang paling cepat berdampak adalah memastikan nomor telepon dan WhatsApp terlihat dalam sekali lihat, jadwal praktik diperbarui, serta setiap halaman layanan menjawab pertanyaan "apa, untuk siapa, berapa, dan bagaimana mendaftar".</p>

<h2>SEO lokal: supaya ditemukan pasien sekitar</h2>
<p>Mayoritas pencarian layanan kesehatan bersifat lokal: "klinik kulit terdekat", "dokter anak Surabaya", "rumah sakit dengan layanan jantung". Untuk menang di situ, tiga hal wajib rapi: halaman layanan yang menyebut area yang dilayani, data alamat dan jam buka yang konsisten di seluruh kanal, serta ulasan pasien yang aktif. Panduan lebih rinci ada di <a href="https://studiosoft.id/panduan-seo-untuk-klinik-dan-rumah-sakit/">panduan SEO untuk klinik dan rumah sakit</a>.</p>

<h2>Google Business Profile: aset gratis yang paling sering dilupakan</h2>
<p>Profil bisnis Google adalah pintu masuk pertama bagi sebagian besar pasien lokal, dan pengelolaannya gratis. Yang perlu dilakukan rutin: lengkapi layanan dan jam buka, unggah foto fasilitas dan tim, jawab ulasan termasuk yang negatif, dan kirim pembaruan singkat setiap pekan. Data pada menu Insight juga menunjukkan pencarian mana yang paling sering membawa orang ke profil Anda. Langkahnya kami bahas di <a href="https://studiosoft.id/google-business-profile-untuk-klinik/">Google Business Profile untuk klinik</a>.</p>

<h2>Media sosial: pilih sesuai tujuan, bukan sekadar ada akun</h2>
<p>Punya akun di semua platform tanpa rencana hanya menghasilkan konten yang itu-itu saja: foto dokter, banner promo, ucapan hari besar. Lebih baik memilih satu platform utama sesuai tempat calon pasien berkumpul. Instagram cocok untuk membangun kedekatan visual, TikTok untuk menjangkau pasien baru yang lebih muda, dan LinkedIn relevan bila Anda menyasar kerja sama korporasi atau rujukan perusahaan.</p>

<h2>Iklan berbayar yang tetap etis</h2>
<p>Iklan layanan kesehatan diizinkan, dengan catatan. Hindari klaim berlebihan dan superlatif, jangan menampilkan sebelum-sesudah yang bisa menyesatkan, dan pastikan setiap iklan mengarah ke halaman yang benar-benar menjelaskan layanannya. Iklan paling aman biasanya yang bersifat informatif — misalnya pengingat vaksinasi atau skrining rutin — dengan sasaran wilayah yang sempit.</p>

<h2>Evaluasi: dari data ke keputusan</h2>
<p>RS dan klinik menghasilkan data setiap hari: kunjungan website, interaksi di media sosial, panggilan masuk, permintaan rute di Google Maps, dan umpan balik pasca-periksa. Yang sering terjadi, data itu tidak pernah dibaca. Tiga angka yang paling layak dipantau: jumlah permintaan arah atau telepon dari profil Google, halaman layanan yang paling banyak dibuka, dan pertanyaan yang paling sering muncul di layanan pelanggan. Dari situ Anda tahu layanan mana yang perlu ditonjolkan bulan depan.</p>

<h2>Lima kesalahan yang paling mahal</h2>
<p><strong>Satu</strong>, berhenti setelah kampanye pertama karena belum terlihat hasilnya. <strong>Dua</strong>, menyerahkan urusan konten kesehatan ke orang yang tidak memahami aturan etik. <strong>Tiga</strong>, membiarkan website lambat dan tidak ramah ponsel. <strong>Empat</strong>, mengabaikan ulasan, terutama ulasan negatif. <strong>Lima</strong>, menargetkan seluruh kota padahal pasien Anda datang dari radius beberapa kilometer.</p>

<h2>Langkah 30 hari pertama</h2>
<p>Pekan pertama: rapikan Google Business Profile dan pastikan alamat, jam, serta nomor kontak konsisten. Pekan kedua: perbarui halaman layanan utama sehingga menjawab pertanyaan pasien. Pekan ketiga: mulai konten edukasi dua kali sepekan. Pekan keempat: baca data, catat pertanyaan yang paling sering muncul, lalu jadikan bahan konten bulan berikutnya.</p>

<h2>Pertanyaan yang sering muncul</h2>
<h3>Apakah rumah sakit boleh beriklan di media sosial?</h3><p>Boleh, selama isinya tidak menjanjikan kesembuhan, tidak menyesatkan, dan sesuai kode etik kedokteran. Iklan informatif biasanya paling aman.</p>
<h3>Berapa lama hasilnya mulai terlihat?</h3><p>Perbaikan Google Business Profile bisa terasa dalam beberapa pekan. SEO dan konten edukasi umumnya 3-6 bulan, tergantung persaingan kata kuncinya.</p>
<h3>Apakah perlu membuat akun di semua platform sosial media?</h3><p>Tidak. Fokus pada satu platform utama yang sesuai dengan tempat calon pasien Anda, lalu tambah platform lain setelah alurnya stabil.</p>
<h3>Bagaimana memakai testimoni pasien dengan aman?</h3><p>Minta izin tertulis, jangan tampilkan identitas yang mudah dilacak, dan hindari klaim berlebihan soal hasil pengobatan.</p>
<h3>Apakah klinik kecil perlu digital marketing?</h3><p>Justru paling diuntungkan, karena satu pasien baru berdampak besar bagi klinik kecil, dan persaingan kata kunci lokalnya jauh lebih ringan.</p>
""",
}

# ============ PENDUKUNG 1: #5974 SEO klinik & RS ============
P1 = {
    "judul": "Panduan SEO untuk Klinik dan Rumah Sakit: Biar Mudah Ditemukan Pasien",
    "fk": "seo untuk klinik",
    "meta": "SEO untuk klinik dan rumah sakit: cara supaya layanan Anda muncul saat pasien mencari dokter atau perawatan di sekitar. Langkah praktis dan terukur.",
    "tambah": """
<h2>Kenapa SEO berbeda untuk layanan kesehatan</h2>
<p>Pencarian layanan kesehatan hampir selalu punya dua ciri: sakali bersifat mendesak, dan kedua berbasis lokasi. Orang mencari "dokter kulit terdekat" saat keluhan sudah mengganggu, bukan sambil menimbang-nimbang. Karena itu, halaman yang muncul harus langsung memberi tiga hal: layanan apa yang tersedia, di mana lokasinya, dan bagaimana cara menghubungi.</p>

<h2>Empat jenis kata kunci yang perlu dikuasai</h2>
<p><strong>Layanan umum + kota</strong> ("klinik kulit Surabaya") — persaingan paling berat, biasanya dipegang halaman utama. <strong>Layanan spesifik</strong> ("laser pigmentasi") — lebih ringan, cocok untuk halaman layanan. <strong>Pertanyaan gejala</strong> ("gatal di kulit apakah berbahaya") — volume besar, cocok sebagai artikel edukasi. <strong>Nama dokter atau merek</strong> — harus dimenangkan, karena orang sudah mencari Anda.</p>

<h2>Halaman yang wajib ada di situs klinik</h2>
<p>Satu halaman per layanan utama, lengkap dengan penjelasan siapa yang menanganinya, estimasi biaya, dan cara mendaftar. Satu halaman jadwal dokter yang diperbarui setiap bulan. Satu halaman lokasi dan kontak yang menyebut area layanan. Dan satu halaman tentang fasilitas serta izin operasional — ini yang membangun kepercayaan pada kunjungan pertama.</p>

<h2>Struktur teknis yang sering terlewat</h2>
<p>Gunakan satu domain dan satu versi URL (tanpa perbedaan www dan non-www), pastikan setiap halaman punya judul dan deskripsi yang unik, dan tambahkan struktur data untuk profil layanan. Kecepatan juga penting: halaman yang lambat membuat calon pasien kembali ke hasil pencarian. Untuk data lengkap adalah melalui Search Console, yang menunjukkan halaman mana yang muncul dan untuk pencarian apa.</p>

<h2>Ulasan dan kredibilitas</h2>
<p>Ulasan memengaruhi keputusan pasien sekaligus sinyal bagi mesin pencari. Pola yang bekerja: minta ulasan beberapa hari setelah kunjungan lewat pesan singkat, balas semua ulasan termasuk yang negatif dengan bahasa tenang, dan tampilkan ulasan terbaru di halaman yang relevan. Jangan menulis ulasan sendiri — risikonya tidak sebanding.</p>

<h2>Konten edukasi dan batas etikanya</h2>
<p>Artikel edukasi menarik banyak pencarian dan membangun kepercayaan, tetapi harus lolos tiga pemeriksaan: tidak mendiagnosis dari jauh, tidak menjanjikan hasil, dan menyebut kapan pembaca perlu segera menemui dokter. Sebaiknya setiap artikel ditinjau tenaga medis dan mencantumkan nama peninjau.</p>

<h2>Cara mengukur hasil</h2>
<p>Pantau tiga hal setiap bulan: jumlah pencarian yang mengarah ke halaman layanan, jumlah klik ke nomor telepon atau permintaan rute dari profil bisnis Google, dan jumlah formulir atau pesan masuk. Kalau pencarian naik tapi kontak tidak, masalahnya biasanya di halaman layanan, bukan di peringkat.</p>
""",
}

# ============ PENDUKUNG 2: #5977 Google Business Profile ============
P2 = {
    "judul": "Google Business Profile untuk Klinik: Cara Biar Pasien Gampang Nemu Lokasi Anda",
    "fk": "google business profile klinik",
    "meta": "Google business profile klinik yang dioptimasi membantu pasien menemukan lokasi dan menghubungi Anda. Ini langkah pengisian, foto, ulasan, dan gejalanya.",
    "tambah": """
<h2>Kenapa GBP menentukan untuk layanan kesehatan</h2>
<p>Saat seseorang mengetik "klinik terdekat", Google sering menjawab langsung dari daftar profil bisnis, tanpa perlu membuka website. Di situ hanya tiga profil teratas yang terlihat. Kalau profil klinik Anda tidak lengkap, peluang itu hilang tanpa jejak — dan Anda tidak akan pernah tahu berapa banyak pasien yang berpindah.</p>

<h2>Bagian profil yang wajib diisi lengkap</h2>
<p>Kategori utama harus sesuai layanan sebenarnya, lalu tambahkan kategori sekunder bila relevan. Isi jam operasional termasuk jam khusus, nomor telepon utama, tautan ke halaman pendaftaran, dan daftar layanan satu per satu. Cantumkan juga atribut seperti akses kursi roda, parkir, atau layanan antar-jemput bila tersedia.</p>

<h2>Foto yang membuat orang yakin</h2>
<p>Sertakan minimal sepuluh foto: bagian depan fasilitas, ruang tunggu, ruang periksa, peralatan utama, tim medis dengan seragam, dan papan nama. Perbarui setiap beberapa bulan. Foto asli dari ponsel biasanya lebih dipercaya daripada foto stok yang terlihat sempurna.</p>

<h2>Ulasan: cara meminta dan menjawabnya</h2>
<p>Minta ulasan dua sampai tiga hari setelah kunjungan lewat pesan singkat berisi tautan langsung, bukan tautan ke halaman profil umum. Balas semua ulasan dalam dua hari kerja. Untuk ulasan negatif, balas dengan tenang, akui masalahnya, dan tawarkan jalur penyelesaian yang jelas — calon pasien membaca cara Anda merespons, bukan hanya bintangnya.</p>

<h2>Kirim pembaruan rutin</h2>
<p>Fitur pembaruan memungkinkan klinik mengunggah informasi singkat, misalnya penambahan jadwal dokter, program skrining, atau perubahan jam layanan saat libur panjang. Kirim minimal setiap pekan; profil yang aktif lebih sering muncul dibanding yang pasif.</p>

<h2>Membaca Insight untuk mengambil keputusan</h2>
<p>Menu Insight menunjukkan berapa banyak orang melihat profil, dari pencarian apa, dan aksi apa yang mereka lakukan. Tiga angka yang paling berguna: permintaan rute (minat datang), klik telepon (minat menghubungi), dan pencarian non-merek (pasien yang belum mengenal klinik Anda). Dari data ini Anda tahu layanan mana yang perlu ditonjolkan bulan berikutnya.</p>

<h2>Kesalahan yang sering terjadi</h2>
<p>Alamat duplikat untuk satu klinik, jam operasional tidak pernah diperbarui, foto seadanya, ulasan tidak dijawab, dan tautan yang mengarah ke halaman error. Kelimanya mudah diperbaiki, tetapi jarang diperiksa karena tidak ada yang memantau secara rutin.</p>
""",
}



# tambahan isi (dari ss_klinik_tambahan.py)
_spec = importlib.util.spec_from_file_location("_tamk", os.path.join(os.path.dirname(os.path.abspath(__file__)), "ss_klinik_tambahan.py"))
_modk = importlib.util.module_from_spec(_spec)
_spec.loader.exec_module(_modk)
PILAR["isi"] = PILAR["isi"].replace("<h2>Pertanyaan yang sering muncul</h2>", _modk.TAMBAHAN_PILAR + "\n<h2>Pertanyaan yang sering muncul</h2>")
P1["tambah"] = P1["tambah"] + _modk.TAMBAHAN_P1
P2["tambah"] = P2["tambah"] + _modk.TAMBAHAN_P2

def api(path, data=None, method=None):
    method = method or ("POST" if data is not None else "GET")
    h = {"Authorization": f"Basic {AUTH}", "User-Agent": "Mozilla/5.0"}
    body = None
    if data is not None:
        body = json.dumps(data).encode(); h["Content-Type"] = "application/json"
    err = None
    r = urllib.request.Request(S + path, data=body, headers=h, method=method)
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=240) as x:
                return x.status, json.loads(x.read())
        except urllib.error.HTTPError as e:
            if e.code in (404, 500, 502, 503, 504):
                time.sleep(4); continue
            return e.code, e.read().decode()[:200]
        except Exception as e:
            err = e; time.sleep(4)
    return 0, str(err)[:150] if err else "gagal"


def faq_schema(pasangan):
    return ('<script type="application/ld+json">' +
            json.dumps({"@context": "https://schema.org", "@type": "FAQPage",
                        "mainEntity": [{"@type": "Question", "name": q,
                                        "acceptedAnswer": {"@type": "Answer", "text": a}} for q, a in pasangan]},
                       ensure_ascii=False) + "</script>")


def pasang_pilar():
    isi = PILAR["isi"]
    pasangan = []
    for m in re.finditer(r"<h3[^>]*>(.*?)</h3>\s*<p>(.*?)</p>", isi, re.S):
        q = re.sub(r"<[^>]+>", " ", m.group(1)).strip()
        a = re.sub(r"\s+", " ", re.sub(r"<[^>]+>", " ", m.group(2))).strip()
        pasangan.append((q, a))
    konten = isi + "\n" + faq_schema(pasangan) + "\n" + WA
    st, _ = api("/wp-json/wp/v2/posts/5970", {
        "title": PILAR["judul"], "content": konten,
        "meta": {"_yoast_wpseo_focuskw": PILAR["fk"], "_yoast_wpseo_title": PILAR["judul"],
                 "_yoast_wpseo_metadesc": PILAR["meta"]}})
    _, chk = api("/wp-json/wp/v2/posts/5970?context=edit&_fields=content,meta")
    raw = chk["content"]["raw"]
    print(f"PILAR #5970 POST {st} | {len(html.unescape(re.sub(r'<[^>]+>', ' ', raw)).split())} kata | "
          f"FAQ {raw.count('<h3>')} Q | meta {len(chk['meta'].get('_yoast_wpseo_metadesc',''))}")


def pasang_pendukung(pid, konf):
    st, p = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=content")
    raw = p["content"]["raw"]
    if konf["tambah"][:60] in raw:
        print(f"  #{pid} sudah ditambah — skip"); return
    # sisipkan sebelum bagian FAQ/CTA/skema bila ada, kalau tidak sebelum penutup
    m = re.search(r"\n<h2[^>]*>\s*(Pertanyaan|FAQ|Kesimpulan)", raw, re.I)
    baru = (raw[:m.start()] + konf["tambah"] + "\n" + raw[m.start():]) if m else (raw.rstrip() + "\n" + konf["tambah"])
    st2, _ = api(f"/wp-json/wp/v2/posts/{pid}", {
        "title": konf["judul"], "content": baru,
        "meta": {"_yoast_wpseo_focuskw": konf["fk"], "_yoast_wpseo_title": konf["judul"],
                 "_yoast_wpseo_metadesc": konf["meta"]}})
    _, chk = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=content")
    print(f"  #{pid} POST {st2} | {len(html.unescape(re.sub(r'<[^>]+>', ' ', chk['content']['raw'])).split())} kata | {konf['judul'][:52]}")


BUANG = [5971, 5972, 5973, 5975, 5976, 5978, 5979]

if "--apply" not in sys.argv:
    print("PILAR #5970 →", PILAR["judul"])
    print(f"   {len(html.unescape(re.sub(r'<[^>]+>', ' ', PILAR['isi'])).split())} kata, "
          f"{PILAR['isi'].count('<h3>')} FAQ, meta {len(PILAR['meta'])} char")
    print("PENDUKUNG: #5974 (SEO klinik → tambah", len(html.unescape(re.sub(r'<[^>]+>', ' ', P1['tambah'])).split()), "kata)")
    print("           #5977 (GBP klinik → tambah", len(html.unescape(re.sub(r'<[^>]+>', ' ', P2['tambah'])).split()), "kata)")
    print(f"TRASH: {BUANG}")
    sys.exit(0)

pasang_pilar()
pasang_pendukung(5974, P1)
pasang_pendukung(5977, P2)
print("\nmemindahkan ke trash:")
for pid in BUANG:
    st, _ = api(f"/wp-json/wp/v2/posts/{pid}", method="DELETE")
    _, chk = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=status")
    print(f"  #{pid} DELETE {st} | status: {chk.get('status') if isinstance(chk, dict) else chk}")
