#!/usr/bin/env python3
"""Batch 1: lengkapi 5 draft StudioSoft jadi artikel standar + gambar + meta + FAQ schema,
lalu jadwalkan tayang 08:00 WIB mulai 24 Sep 2026. Dry run default."""

import base64, json, re, sys, time, urllib.request, urllib.error

S = "https://studiosoft.id"
AUTH = base64.b64encode(b"bambangbot:q26r RePo BVy6 pwU2 F3z7 ouyl").decode()
CAT = {"AI": 1061, "Digital Marketing": 26, "SEO": 330}

WA_BLOK = """
<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>
"""


def artikel(fk, judul_seo, meta, h2_list, cat, tags, pexels, alt):
    isi = "\n".join(h2_list)
    return {
        "fk": fk, "judul_seo": judul_seo, "meta": meta, "isi": isi, "kategori": cat,
        "tags": tags, "pexels": f"https://images.pexels.com/photos/{pexels}/pexels-photo-{pexels}.jpeg",
        "alt": alt,
    }


JOBS = {}

JOBS[7528] = artikel(
    "AI dan pekerjaan digital marketer",
    "AI dan Pekerjaan Digital Marketer: Apa yang Berubah",
    "AI dan pekerjaan digital marketer bukan soal tergantikan, tapi soal porsi kerja yang bergeser. Ini bagian yang hilang, yang tumbuh, dan cara menyiapkan diri.",
    [
        "<p>Pertanyaan ini sering muncul di ruang meeting: kalau AI sudah bisa menulis caption, membuat gambar, dan menganalisis data, apa lagi gunanya digital marketer? Jawaban jujurnya: pekerjaannya tidak hilang, tapi terbelah. Bagian yang bersifat produksi massal memang menyusut, sementara bagian yang butuh penilaian, konteks lokal, dan tanggung jawab hasil justru naik nilainya.</p>",
        "<h2>Bagian pekerjaan yang benar-benar diambil alih AI</h2>",
        "<p>Yang paling cepat tergantikan adalah pekerjaan bervolume tinggi dengan aturan jelas: menulis 30 variasi caption, merapikan laporan bulanan, membuat draft artikel pertama, menerjemahkan materi kampanye, atau membuat gambar pendukung. Semua itu dulu memakan waktu berhari-hari, sekarang selesai dalam hitungan menit.</p>",
        "<p>Perlu dicatat, yang diambil bukan keputusannya — hanya eksekusinya. AI tidak tahu caption mana yang cocok dengan pelanggan setia Anda, dan tidak tahu mana yang justru bisa menyinggung pasar lokal.</p>",
        "<h2>Tiga bagian yang justru bertambah</h2>",
        "<p>Pertama, <strong>penilaian</strong>. Semakin banyak draft yang dihasilkan, semakin besar kebutuhan orang yang bisa memilih mana yang layak tayang. Kedua, <strong>konteks</strong>. AI tidak punya pengalaman lapangan: ia tidak tahu bahwa di Surabaya, jam ramai bengkel adalah Sabtu pagi, atau bahwa istilah tertentu terasa kaku bagi pemilik UMKM. Ketiga, <strong>akuntabilitas</strong>. Kalau kampanye gagal, yang dimintai penjelasan tetap manusia, bukan alat.</p>",
        "<h2>Kenapa strategi tetap urusan manusia</h2>",
        "<p>Riset kata kunci dengan alat AI menghasilkan daftar panjang, tapi tidak memberi tahu mana yang layak dikejar lebih dulu. Prioritas datang dari pemahaman bisnis: margin produk, kapasitas tim, dan siapa yang benar-benar siap membeli bulan ini. Penalaran semacam itu belum bisa diserahkan ke mesin.</p>",
        "<p>Di sisi operasional, kami memang memakai AI untuk mempercepat pekerjaan taktis — dari riset hingga penyusunan draft. Cara kami memadukannya bisa dilihat di <a href=\"https://studiosoft.id/konsultan-ai-surabaya/\">layanan konsultan AI Surabaya</a> yang kami jalankan.</p>",
        "<h2>Data dan konteks lokal tidak bisa dikarang</h2>",
        "<p>AI cenderung mengarang bila kekurangan data. Angka pasar, perilaku pelanggan, dan riwayat kampanye harus datang dari sumber milik Anda sendiri: Search Console, analytics, catatan penjualan, dan pengalaman tim di lapangan. Marketer yang menguasai data ini akan selalu satu langkah di depan orang yang hanya mengandalkan alat.</p>",
        "<h2>Skill yang paling cepat naik nilainya</h2>",
        "<p>Kalau harus memilih apa yang dipelajari tahun ini, ada empat: menyusun perintah (prompt) yang presisi, membaca data dan menarik kesimpulan, mengedit tulisan agar terasa manusiawi, dan merancang alur kerja yang menggabungkan alat dengan proses. Empat keterampilan ini melengkapi AI, bukan bersaing dengannya.</p>",
        "<h2>Bagaimana tim kecil tetap kompetitif</h2>",
        "<p>Tim dua sampai tiga orang sekarang bisa mengerjakan beban kerja yang dulu butuh enam orang — asal membagi peran dengan jelas: satu orang mengurus strategi dan penilaian, satu mengurus produksi dengan bantuan AI, satu mengurus data dan pelaporan. Yang tidak boleh terjadi adalah semua orang memakai AI tanpa ada yang memeriksa hasilnya.</p>",
        "<p>Untuk menggambarkan polanya, kami pernah membahas bagaimana <a href=\"https://studiosoft.id/otomasi-bisnis-dengan-ai/\">otomasi bisnis dengan AI</a> mengubah pembagian kerja di tim pemasaran.</p>",
        "<h2>Langkah praktis untuk marketer</h2>",
        "<p>Mulai dari audit pekerjaan Anda seminggu terakhir. Tandai mana yang berulang dan berbasis aturan — itu kandidat pertama untuk diserahkan ke alat. Sisakan waktu yang Anda hemat untuk hal yang tidak bisa diotomasi: berbicara dengan pelanggan, membaca data, dan menguji ide baru.</p>",
        "<h2>Kesimpulan</h2>",
        "<p>AI tidak menghapus profesi digital marketer; ia menghapus sebagian tugas di dalamnya dan menaikkan standar bagian yang tersisa. Yang tersingkir bukan orang yang memakai AI, melainkan orang yang berhenti belajar menilai pekerjaan mesin.</p>",
        "<h2>Pertanyaan yang sering muncul</h2>",
        "<h3>Apakah AI bisa menggantikan seluruh tim marketing?</h3><p>Tidak. AI bisa mengambil alih produksi massal, tapi keputusan bisnis, hubungan pelanggan, dan tanggung jawab hasil tetap butuh manusia.</p>",
        "<h3>Berapa lama waktu yang bisa dihemat dengan AI?</h3><p>Untuk pekerjaan produksi konten, penghematan 30-60% waktu cukup umum. Angkanya berbeda tiap bisnis, tergantung kerapian alur kerja dan data yang tersedia.</p>",
        "<h3>Apakah pakai AI untuk konten melanggar aturan Google?</h3><p>Tidak, selama kontennya membantu pembaca dan berbasis keahlian nyata. Yang dihukum Google adalah konten massal tanpa nilai tambah.</p>",
        "<h3>Skill apa yang harus dipelajari lebih dulu?</h3><p>Menyusun perintah yang presisi dan membaca data. Dua ini memberi dampak tercepat untuk sebagian besar tim pemasaran.</p>",
        "<h3>Bagaimana UMKM kecil memulainya?</h3><p>Cukup satu alat untuk satu pekerjaan. Misalnya AI untuk menyusun draft caption, lalu Anda yang menyunting dan mengunggah. Satu orang dengan alur sederhana sudah cukup untuk memulai.</p>",
    ],
    "AI", ["AI", "Digital Marketing", "Strategi Konten"], 18799044,
    "Ilustrasi pekerja digital marketer bekerja dengan bantuan AI",
)

JOBS[7529] = artikel(
    "Apa itu GEO generative engine optimization",
    "Apa Itu GEO (Generative Engine Optimization)?",
    "Apa itu GEO generative engine optimization: cara menyusun konten agar dikutip ChatGPT, Perplexity, dan AI Overviews. Ini bedanya dengan SEO biasa.",
    [
        "<p>GEO, singkatan dari Generative Engine Optimization, adalah praktik menyusun konten agar dikutip oleh mesin generatif: ChatGPT, Perplexity, Gemini, dan ringkasan AI di Google. Bedanya dengan SEO biasa: pada SEO kita bersaing untuk peringkat, pada GEO kita bersaing untuk disebut sebagai sumber.</p>",
        "<h2>Kenapa GEO muncul sekarang</h2>",
        "<p>Karena orang mulai bertanya langsung ke asisten AI, bukan menelusuri sepuluh tautan biru. Mereka minta rekomendasi, minta penjelasan, minta perbandingan. Ketika AI menjawab, ia menyebut beberapa sumber saja — dan bisnis yang tidak masuk daftar itu praktis tidak terlihat.</p>",
        "<h2>Tiga pilar utama GEO</h2>",
        "<p><strong>Pertama, kejelasan jawaban.</strong> Konten yang membuka dengan jawaban langsung lebih mudah dikutip daripada tulisan yang berputar-putar di dua paragraf pembuka. <strong>Kedua, struktur yang dapat dibaca mesin</strong> — subjudul yang jelas, daftar, tabel, dan skema pertanyaan-jawaban. <strong>Ketiga, kredibilitas</strong>: nama penulis, pengalaman nyata, angka, dan sumber yang bisa ditelusuri.</p>",
        "<h2>Apa bedanya GEO dan SEO</h2>",
        "<p>SEO mengurus halaman: struktur URL, kecepatan, tautan masuk. GEO mengurus kalimat dan bukti di dalamnya. SEO berhasil bila halaman Anda muncul di hasil pencarian; GEO berhasil bila kalimat Anda diulang oleh AI saat menjawab pertanyaan orang lain.</p>",
        "<p>Keduanya tidak saling menggantikan. Konten yang lemah untuk SEO biasanya juga sulit dikutip AI, karena keduanya bergantung pada kejelasan dan kepercayaan.</p>",
        "<h2>Ciri konten yang sering dikutip AI</h2>",
        "<p>Dari pengamatan kami, konten yang paling sering muncul kembali di jawaban AI punya pola yang mirip: satu paragraf pembuka yang langsung menjawab, angka atau rentang yang spesifik, pengalaman pertama (\"kami menemukan\", bukan \"banyak orang bilang\"), pertanyaan lanjutan yang dijawab singkat, dan tanggal pembaruan yang jelas.</p>",
        "<p>Kami pernah mengangkat topik terkait ini di artikel <a href=\"https://studiosoft.id/bagaimana-ai-mengubah-algoritma-google-dan-strategi-seo-anda/\">bagaimana AI mengubah algoritma Google</a> dan dampaknya pada strategi pencarian.</p>",
        "<h2>Langkah praktis menerapkan GEO</h2>",
        "<p>Mulai dari sepuluh pertanyaan yang paling sering diajukan calon pelanggan Anda. Untuk tiap pertanyaan, tulis satu halaman yang menjawabnya secara langsung di paragraf pertama, lalu lengkapi dengan rincian, contoh, dan pertanyaan lanjutan. Tambahkan skema FAQ agar mesin mudah membacanya.</p>",
        "<h2>Bagaimana mengukurnya</h2>",
        "<p>GEO belum punya alat ukur standar seperti Search Console. Yang bisa dipantau: kemunculan nama merek di jawaban AI, lalu lintas rujukan dari domain AI (di Google Analytics muncul sebagai kanal <em>AI Assistant</em>), dan pertumbuhan pencarian bermerek. Ketiganya indikator tidak langsung, tapi tetap berguna.</p>",
        "<h2>Kesimpulan</h2>",
        "<p>GEO bukan mode baru yang menggantikan SEO. Ia lapisan tambahan: pastikan halaman Anda dioptimasi dengan baik, lalu pastikan kalimat di dalamnya layak dikutip. Bisnis yang mengerjakan keduanya akan tetap terlihat, apa pun bentuk mesin pencarinya nanti.</p>",
        "<h2>Pertanyaan yang sering muncul</h2>",
        "<h3>Apakah GEO hanya untuk bisnis besar?</h3><p>Tidak. Bisnis lokal justru sering dikutip untuk pertanyaan spesifik, misalnya layanan di kota tertentu, karena persaingannya lebih sedikit.</p>",
        "<h3>Apakah perlu alat khusus untuk GEO?</h3><p>Tidak wajib. Yang paling penting: jawaban langsung, data nyata, dan struktur yang mudah dibaca mesin.</p>",
        "<h3>Apakah skema FAQ bisa membantu?</h3><p>Ya. Skema FAQ membantu mesin memahami pasangan pertanyaan dan jawaban, dan sering dipakai sebagai sumber ringkasan.</p>",
        "<h3>Berapa lama hasil GEO terlihat?</h3><p>Bervariasi. Model AI menarik dari korpus yang diperbarui berkala, jadi biasanya hitungan bulan, bukan minggu.</p>",
        "<h3>Apakah konten lama perlu diperbarui?</h3><p>Perlu, bila datanya sudah usang. Artikel yang diperbarui secara berkala lebih sering dipakai sebagai rujukan.</p>",
    ],
    "AI", ["AI", "SEO", "GEO"], 18799047,
    "Ilustrasi optimasi konten untuk mesin generatif seperti ChatGPT",
)

JOBS[7530] = artikel(
    "cara bikin prompt AI yang bagus",
    "Cara Bikin Prompt AI yang Bagus (Bukan Generik)",
    "Cara bikin prompt AI yang bagus: tentukan peran, konteks, batasan, dan format keluaran. Plus contoh prompt yang bisa langsung dipakai untuk bisnis.",
    [
        "<p>Prompt yang bagus bukan prompt yang panjang, tapi prompt yang lengkap. Empat unsur ini yang membedakan hasil generik dari hasil yang bisa dipakai: peran, konteks, batasan, dan format keluaran.</p>",
        "<h2>Kenapa hasil AI sering terasa generik</h2>",
        "<p>Karena pertanyaannya terlalu umum. \"Buatkan caption Instagram\" tidak memberi petunjuk apa pun tentang siapa yang membaca, produk apa yang dijual, dan nada bicara yang diinginkan. AI lalu mengisi kekosongan itu dengan jawaban paling aman — dan jawaban paling aman selalu terdengar seragam.</p>",
        "<h2>Empat unsur prompt yang bekerja</h2>",
        "<p><strong>Peran.</strong> Tentukan siapa yang Anda ajak bicara: \"kamu copywriter yang menulis untuk pemilik bengkel di Surabaya\". <strong>Konteks.</strong> Sebutkan produk, pasar, dan tujuan: \"promo servis berkala untuk mobil keluarga\". <strong>Batasan.</strong> Beri aturan jumlah kata, istilah yang dilarang, dan hal yang wajib ada. <strong>Format.</strong> Jelaskan bentuk keluaran yang Anda inginkan: lima pilihan, masing-masing maksimal 120 karakter, ada ajakan menghubungi.</p>",
        "<h2>Contoh perbandingan yang jelas</h2>",
        "<p>Prompt biasa: \"Buat caption promosi bengkel.\" Hasilnya kalimat umum yang bisa dipakai bengkel mana pun. Prompt yang lengkap: \"Kamu copywriter untuk bengkel mobil keluarga di Surabaya. Buat 5 caption pendek untuk promo servis berkala akhir pekan. Maksimal 120 karakter per caption, tanpa kata 'murah', sertakan ajakan menghubungi via WhatsApp.\" Perbedaan hasilnya langsung terasa.</p>",
        "<h2>Teknik lanjutan yang hemat waktu</h2>",
        "<p>Sertakan satu contoh keluaran yang Anda suka. AI belajar dari pola contoh jauh lebih baik daripada dari penjelasan panjang. Kalau hasilnya belum tepat, jangan ganti seluruh prompt — sebutkan satu hal yang ingin diubah dan minta versi perbaikannya.</p>",
        "<p>Untuk pekerjaan yang berulang, simpan prompt Anda sebagai templat. Kami memakai pendekatan ini pada <a href=\"https://studiosoft.id/ai-untuk-konten-marketing-menulis-artikel-seo-yang-disukai-google/\">produksi konten marketing dengan AI</a> sehari-hari.</p>",
        "<h2>Kesalahan yang perlu dihindari</h2>",
        "<p>Jangan memberi tugas sekaligus sepuluh. Jangan menjelaskan dengan istilah yang Anda sendiri tidak yakin. Dan jangan menganggap keluaran pertama sebagai hasil akhir — AI menyusun draft, Anda yang memutuskan.</p>",
        "<h2>Menyimpan prompt yang berhasil</h2>",
        "<p>Buat catatan sederhana: nama tugas, prompt yang dipakai, dan tautan hasil terbaiknya. Setelah sebulan, Anda akan punya pustaka prompt sendiri yang jauh lebih berguna daripada kumpulan prompt umum di internet.</p>",
        "<h2>Kesimpulan</h2>",
        "<p>Prompt adalah instruksi kerja. Semakin jelas instruksi, semakin layak hasilnya. Kalau Anda ingin tim Anda memakai AI dengan hasil konsisten, mulailah dari menuliskan empat unsur tadi — bukan dari mencari alat baru.</p>",
        "<h2>Pertanyaan yang sering muncul</h2>",
        "<h3>Apakah prompt harus berbahasa Inggris?</h3><p>Tidak. Model AI modern sudah baik menangani bahasa Indonesia. Yang penting konsisten.</p>",
        "<h3>Berapa panjang prompt yang ideal?</h3><p>Seperlunya. Biasanya 3-6 kalimat sudah cukup bila keempat unsur terpenuhi.</p>",
        "<h3>Bagaimana kalau hasilnya masih salah?</h3><p>Perbaiki satu aspek per percobaan, dan tunjukkan contoh keluaran yang Anda inginkan.</p>",
        "<h3>Apakah hasil AI perlu diedit?</h3><p>Selalu. Minimal untuk menyesuaikan gaya bahasa dan memastikan faktanya benar.</p>",
        "<h3>Bisakah prompt yang sama dipakai ulang?</h3><p>Bisa, dan sebaiknya disimpan sebagai templat untuk tugas yang berulang.</p>",
    ],
    "AI", ["AI", "Digital Marketing", "Content Marketing"], 4604607,
    "Ilustrasi penyusunan prompt AI untuk kebutuhan bisnis",
)

JOBS[7531] = artikel(
    "bikin konten pakai AI",
    "Bikin Konten Pakai AI: Boleh, Asal Tahu Batasnya",
    "Bikin konten pakai AI boleh, asal tahu batasnya. Ini panduan Google, tiga risiko yang nyata, dan alur kerja yang aman untuk bisnis lokal.",
    [
        "<p>Boleh. Google tidak melarang konten yang dibuat dengan bantuan AI. Yang dihukum adalah konten massal tanpa nilai tambah — tulisan yang dibuat untuk mengisi halaman, bukan untuk menjawab kebutuhan pembaca.</p>",
        "<h2>Apa yang sebenarnya dinilai Google</h2>",
        "<p>Google menilai manfaat dan keaslian, bukan alat yang dipakai. Halaman yang menjawab pertanyaan dengan pengalaman nyata, data, dan contoh konkret punya peluang sama, entah ditulis tangan atau dibantu AI. Sebaliknya, sepuluh halaman yang isinya saling mengulang akan turun bersama-sama.</p>",
        "<h2>Tiga risiko yang nyata</h2>",
        "<p><strong>Pertama, kesalahan fakta.</strong> AI bisa mengarang angka, nama, dan peraturan. Untuk klaim seperti harga, sertifikasi, atau ketentuan hukum, wajib diverifikasi. <strong>Kedua, kehilangan suara.</strong> Konten yang seluruhnya dihasilkan mesin cenderung datar, sehingga merek Anda tidak punya ciri. <strong>Ketiga, penumpukan konten serupa.</strong> Ini yang paling berbahaya: situs yang menerbitkan banyak artikel bersudut sama justru menurunkan penilaian secara menyeluruh.</p>",
        "<h2>Alur kerja yang aman</h2>",
        "<p>Satu, tentukan topik dari pertanyaan pelanggan nyata, bukan dari daftar ide mesin. Dua, pakai AI untuk menyusun kerangka dan draft kasar. Tiga, isi bagian inti dengan pengalaman Anda: angka internal, nama layanan, kejadian lapangan. Empat, sunting agar terdengar seperti orang, bukan robot. Lima, tambahkan bukti — foto, studi kasus, testimoni.</p>",
        "<p>Kami menerapkan alur ini di <a href=\"https://studiosoft.id/implementasi-ai-untuk-umkm/\">implementasi AI untuk UMKM</a>, dan hasilnya konten yang tetap terasa dikerjakan manusia.</p>",
        "<h2>Berapa porsi AI yang masih aman</h2>",
        "<p>Tidak ada angka resmi. Yang bisa dijadikan patokan: jika Anda tidak dapat menjelaskan isi artikel itu tanpa membaca ulang, berarti porsi AI-nya terlalu besar. Ukurannya bukan persentase, tapi seberapa banyak pengetahuan nyata di dalamnya.</p>",
        "<h2>Peran editor manusia</h2>",
        "<p>Editor memastikan tiga hal: faktanya benar, gayanya konsisten dengan merek, dan isinya layak dibaca sampai habis. Tiga hal ini yang membuat konten berbantuan AI tetap bernilai.</p>",
        "<h2>Kesimpulan</h2>",
        "<p>AI mempercepat produksi, tapi tidak bisa menggantikan pengetahuan. Pakai untuk mempercepat bagian yang membosankan, simpan tenaga Anda untuk bagian yang menentukan: sudut pandang, bukti, dan kejelasan.</p>",
        "<h2>Pertanyaan yang sering muncul</h2>",
        "<h3>Apakah konten AI bisa kena penalti?</h3><p>Yang kena penalti adalah konten massal tanpa nilai, bukan penggunaan AI-nya.</p>",
        "<h3>Perlu menulis keterangan pakai AI?</h3><p>Tidak wajib. Yang penting isinya benar dan bermanfaat bagi pembaca.</p>",
        "<h3>Apakah aman untuk artikel SEO klien?</h3><p>Aman bila melalui penyuntingan manusia dan memuat pengalaman nyata bisnis tersebut.</p>",
        "<h3>Bagaimana menghindari konten kembar?</h3><p>Beri satu sudut berbeda per artikel, dan periksa daftar tulisan yang sudah ada sebelum menulis.</p>",
        "<h3>Apakah gambar AI boleh dipakai?</h3><p>Boleh, tapi foto asli atau stok berkualitas biasanya lebih dipercaya untuk bisnis lokal.</p>",
    ],
    "AI", ["AI", "Content Marketing", "SEO"], 6019019,
    "Ilustrasi penyuntingan konten berbantuan AI oleh tim pemasaran",
)

JOBS[7532] = artikel(
    "tools AI untuk bisnis",
    "Tools AI untuk Bisnis: Pilih Sesuai Kebutuhan",
    "Tools AI untuk bisnis yang benar-benar kepake: riset kata kunci, produksi konten, layanan pelanggan, dan otomasi. Ini panduan memilih per kebutuhan.",
    [
        "<p>Pertanyaan yang lebih berguna bukan \"tools AI apa yang terbaik\", tapi \"pekerjaan mana yang paling menguras waktu tim saya\". Dari situ pilihan alatnya jadi jelas. Berikut empat kelompok kebutuhan yang paling sering muncul di bisnis lokal, beserta jenis alat yang cocok.</p>",
        "<h2>1. Riset dan perencanaan konten</h2>",
        "<p>Yang dibutuhkan: menemukan pertanyaan yang benar-benar dicari orang. Alat yang dipakai biasanya kombinasi data pencarian resmi (Search Console) dengan bantuan AI untuk mengelompokkan topik. Keluarannya berupa daftar prioritas, bukan sekadar daftar panjang kata kunci.</p>",
        "<h2>2. Produksi konten</h2>",
        "<p>Untuk menulis draft, menyusun caption, dan membuat ringkasan. Kuncinya satu: selalu ada manusia yang menyunting. Tanpa itu, konten akan terasa seragam dan kehilangan ciri merek. Prinsip ini juga kami pakai saat <a href=\"https://studiosoft.id/ai-untuk-konten-marketing-menulis-artikel-seo-yang-disukai-google/\">memakai AI untuk konten marketing</a>.</p>",
        "<h2>3. Layanan pelanggan</h2>",
        "<p>Chatbot yang menjawab pertanyaan berulang — jam buka, harga, ketersediaan — bisa menghemat banyak waktu admin. Yang perlu dijaga: jalur ke manusia harus tetap mudah, dan jawabannya harus berdasarkan data resmi bisnis Anda. Kami membahas pola penerapannya di <a href=\"https://studiosoft.id/jasa-chatbot-whatsapp-bisnis/\">layanan chatbot WhatsApp untuk bisnis</a>.</p>",
        "<h2>4. Otomasi pekerjaan administrasi</h2>",
        "<p>Merapikan data pelanggan, menyusun laporan bulanan, mengirim pengingat jadwal. Bagian ini sering memberi penghematan terbesar karena pekerjaannya berulang dan berbasis aturan.</p>",
        "<h2>Cara memilih tanpa terjebak langganan</h2>",
        "<p>Mulai dari satu masalah, satu alat, satu orang penanggung jawab. Uji selama dua pekan, ukur waktu yang dihemat, baru tambah alat lain. Hindari berlangganan lima alat sekaligus — biasanya yang terjadi adalah semua dipakai setengah jalan.</p>",
        "<h2>Tanda alatnya tidak cocok</h2>",
        "<p>Kalau tim kembali ke cara lama setelah dua pekan, atau hasilnya harus diperbaiki berkali-kali, berarti alatnya bukan jawabannya. Masalahnya mungkin di alur kerja, bukan di teknologi.</p>",
        "<h2>Kesimpulan</h2>",
        "<p>Alat AI memberi hasil terbaik ketika dipasang pada proses yang sudah rapi. Rapikan dulu alurnya, tentukan siapa yang menanggung jawab, baru pilih alatnya.</p>",
        "<h2>Pertanyaan yang sering muncul</h2>",
        "<h3>Berapa anggaran yang wajar untuk mulai?</h3><p>Untuk UMKM, mulai dari satu langganan alat saja sudah cukup. Tambahan menyusul setelah ada bukti penghematan.</p>",
        "<h3>Apakah data bisnis aman?</h3><p>Baca kebijakan privasi alatnya, dan jangan masukkan data pelanggan yang sensitif ke alat yang tidak jelas pengelolaannya.</p>",
        "<h3>Apakah perlu tim IT?</h3><p>Tidak untuk alat berbasis langganan. Yang perlu adalah satu orang yang bertanggung jawab atas alurnya.</p>",
        "<h3>Alat mana yang paling cepat berdampak?</h3><p>Yang menangani pekerjaan paling sering dan paling membosankan di tim Anda.</p>",
        "<h3>Apakah bisa dijalankan tanpa AI sama sekali?</h3><p>Bisa. AI bukan keharusan; ia hanya mempercepat bagian tertentu.</p>",
    ],
    "AI", ["AI", "Digital Marketing", "Teknologi Bisnis"], 8294554,
    "Ilustrasi tim bisnis memilih alat AI sesuai kebutuhan operasional",
)

JADWAL = {7528: "2026-09-24", 7529: "2026-09-25", 7530: "2026-09-26", 7531: "2026-09-27", 7532: "2026-09-28"}

# sisipkan bagian tambahan (isi panjang) sebelum bagian FAQ
import importlib.util as _ilu, os as _os
_spec = _ilu.spec_from_file_location("_tam", _os.path.join(_os.path.dirname(_os.path.abspath(__file__)), "ss_batch1_tambahan.py"))
_mod = _ilu.module_from_spec(_spec)
_spec.loader.exec_module(_mod)
for _pid, _a in JOBS.items():
    _tambahan = _mod.TAMBAHAN.get(_pid)
    if _tambahan:
        _anchor = "<h2>Pertanyaan yang sering muncul</h2>"
        _a["isi"] = _a["isi"].replace(_anchor, "\n".join(_tambahan) + "\n" + _anchor)

_spec2 = _ilu.spec_from_file_location("_tam2", _os.path.join(_os.path.dirname(_os.path.abspath(__file__)), "ss_batch1_tambahan2.py"))
_mod2 = _ilu.module_from_spec(_spec2)
_spec2.loader.exec_module(_mod2)
for _pid, _a in JOBS.items():
    _tambahan = _mod2.TAMBAHAN2.get(_pid)
    if _tambahan:
        _anchor = "<h2>Pertanyaan yang sering muncul</h2>"
        _a["isi"] = _a["isi"].replace(_anchor, "\n".join(_tambahan) + "\n" + _anchor)


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"
    r = urllib.request.Request(S + path, data=body, headers=h, method=method)
    for _ in range(3):
        try:
            with urllib.request.urlopen(r, timeout=200) 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(3); continue
            return e.code, e.read().decode()[:250]
        except Exception as e:
            time.sleep(3); err = e
    return 0, str(err)[:150]


dry = "--apply" not in sys.argv
print(f"{'id':>6} {'kata':>5} {'meta':>5} {'fk-awal':<8} {'FAQ':<4} {'link':<5} {'gambar':<6} jadwal 08:00 WIB")
for pid, a in sorted(JOBS.items()):
    kata = len(re.sub(r"<[^>]+>", " ", a["isi"] + WA_BLOK).split())
    faq = a["isi"].count("<h3>")
    link = len(set(re.findall(r'href="https://studiosoft\.id/', a["isi"])))
    ok_meta = 120 <= len(a["meta"]) <= 158 and a["meta"].lower().startswith(a["fk"].lower())
    print(f"{pid:>6} {kata:>5} {len(a['meta']):>5} {'YA' if ok_meta else 'TIDAK':<8} {faq:<4} {link:<5} "
          f"{a['pexels'].split('/')[-1][:12]:<6} {JADWAL[pid]}")

if dry:
    print("\n(dry run — pakai --apply untuk eksekusi)")
    sys.exit(0)

print("\n=== EKSEKUSI ===")
for pid, a in sorted(JOBS.items()):
    print(f"\n#{pid} {a['judul_seo']}")
    # 1. gambar
    try:
        req = urllib.request.Request(a["pexels"] + "?auto=compress&cs=tinysrgb&w=1200", headers={"User-Agent": "Mozilla/5.0"})
        blob = urllib.request.urlopen(req, timeout=90).read()
        fname = re.sub(r"[^a-z0-9]+", "-", a["judul_seo"].lower())[:50].strip("-") + ".jpg"
        h = {"Authorization": f"Basic {AUTH}", "Content-Type": "image/jpeg",
             "Content-Disposition": f'attachment; filename="{fname}"', "User-Agent": "Mozilla/5.0"}
        r = urllib.request.Request(S + "/wp-json/wp/v2/media", data=blob, headers=h, method="POST")
        with urllib.request.urlopen(r, timeout=200) as x:
            media = json.loads(x.read())
        media_id = media["id"]
        api(f"/wp-json/wp/v2/media/{media_id}", {"alt_text": a["alt"], "title": a["judul_seo"]})
        print(f"   gambar: id {media_id} | {fname} ({len(blob)//1024} KB) | alt terisi")
    except Exception as e:
        media_id = 0
        print("   gambar GAGAL:", str(e)[:120])
    # 2. konten: sisipkan skema FAQPage lalu tombol WA
    pasangan = []
    for mm in re.finditer(r"<h3[^>]*>(.*?)</h3>\s*<p>(.*?)</p>", a["isi"], re.S):
        q = re.sub(r"<[^>]+>", " ", mm.group(1)).strip()
        ans = re.sub(r"<[^>]+>", " ", mm.group(2)).strip()
        ans = re.sub(r"\s+", " ", ans)
        if q and ans:
            pasangan.append((q, ans))
    schema = {"@context": "https://schema.org", "@type": "FAQPage",
              "mainEntity": [{"@type": "Question", "name": q, "acceptedAnswer": {"@type": "Answer", "text": t}} for q, t in pasangan]}
    konten = a["isi"] + "\n" + '<script type="application/ld+json">' + json.dumps(schema, ensure_ascii=False) + "</script>\n" + WA_BLOK
    payload = {
        "title": a["judul_seo"], "content": konten, "status": "future",
        "date_gmt": f"{JADWAL[pid]}T01:00:00",
        "categories": [CAT[a["kategori"]]],
        "meta": {"_yoast_wpseo_focuskw": a["fk"], "_yoast_wpseo_title": a["judul_seo"], "_yoast_wpseo_metadesc": a["meta"]},
    }
    if media_id:
        payload["featured_media"] = media_id
    st, _ = api(f"/wp-json/wp/v2/posts/{pid}", payload)
    _, chk = api(f"/wp-json/wp/v2/posts/{pid}?context=edit&_fields=status,date,date_gmt,meta,featured_media,content")
    print(f"   POST {st} | status: {chk.get('status')} | tayang: {chk.get('date')} | gambar: {chk.get('featured_media')} | "
          f"meta: {len(chk.get('meta',{}).get('_yoast_wpseo_metadesc',''))} char")
