#!/usr/bin/env python3
"""30 caption Google Business Profile untuk StudioSoft, plus kalender dan berkas siap tempel.

Topik diambil dari kueri nyata di Search Console untuk studiosoft.id (90 hari):
«jasa seo surabaya» 795 tayangan 0 klik (pos 29,9) · «digital agency surabaya» 262/4 (28,0) ·
«digital marketing agency surabaya» 209/2 (17,4) · «branding agency surabaya» 170/0 (37,4) ·
«seo surabaya» 168/2 (18,9) · «creative agency surabaya» 117/4 · «jasa pembuatan website surabaya» 81/0 ·
«jasa seo sidoarjo» 46/0 · «pakar seo surabaya» 45/0.
"""
import json, os, re
from datetime import date, timedelta

WS = "/home/mantapman/.hermes/profiles/atun/workspace"
DIR = f"{WS}/drafts/ss_gbp_postingan"
os.makedirs(DIR, exist_ok=True)

POST = [
    # (jenis, judul singkat, caption, saran gambar)
    ("Update", "Perkenalan: digital agency di Surabaya",
     "Kami digital agency yang berbasis di Surabaya. Pekerjaan kami sehari-hari: mengurus SEO, iklan "
     "berbayar, pembuatan website, dan pengelolaan media sosial untuk bisnis yang serius ingin bertumbuh.\n\n"
     "Yang membedakan cara kami bekerja: semuanya dimulai dari data. Sebelum menyarankan pekerjaan, kami "
     "periksa dulu bagaimana bisnis Anda ditemukan orang sekarang, dari mana pengunjungnya datang, dan "
     "halaman mana yang sudah menghasilkan kontak.\n\n"
     "Kalau Anda ingin tahu posisi bisnis Anda di pencarian, tanyakan saja lewat tombol WhatsApp di profil ini.",
     "foto kantor atau tim StudioSoft"),

    ("Update", "Jasa SEO Surabaya: apa yang dikerjakan bulan pertama",
     "\"Jasa SEO\" sering dianggap aktivitas yang tidak jelas. Padahal bulan pertama seharusnya ada "
     "pekerjaan yang bisa diperiksa: audit teknis situs, pemetaan kata kunci yang benar-benar dicari "
     "calon pelanggan, perbaikan judul dan deskripsi halaman, sampai pemasangan pelacakan.\n\n"
     "Hal yang biasanya belum kelihatan di bulan pertama adalah kenaikan pengunjung. Itu wajar, karena "
     "pencarian butuh waktu.\n\n"
     "Kalau penawaran yang Anda terima menjanjikan peringkat nomor satu dalam beberapa pekan, sebaiknya "
     "ditanyakan lebih dulu.",
     "tangkapan layar laporan atau dashboard"),

    ("Update", "Cara memilih digital marketing agency di Surabaya",
     "Tiga pertanyaan ini paling cepat memisahkan agensi yang bekerja serius dengan yang hanya menjual "
     "presentasi.\n\n"
     "Pertama, angka apa yang akan dipantau dan dari mana angkanya diambil. Kedua, siapa yang benar-benar "
     "mengerjakan pekerjaan harian. Ketiga, apa saja yang tidak mereka kerjakan.\n\n"
     "Agensi yang jujur biasanya tidak keberatan menjawab ketiganya.",
     "foto suasana rapat atau konsultasi"),

    ("Update", "Jasa pembuatan website Surabaya",
     "Website yang rapi secara teknis menentukan hasil semua pekerjaan pemasaran berikutnya. Yang kami "
     "kerjakan sejak awal: struktur halaman yang mudah dibaca mesin pencari, kecepatan muat halaman di "
     "ponsel, dan formulir atau tombol kontak yang benar-benar berfungsi.\n\n"
     "Kami juga menjelaskan apa yang kami serahkan di akhir pekerjaan: akses domain, hosting, akun "
     "analitik, dan seluruh berkasnya, semuanya atas nama bisnis Anda.\n\n"
     "Punya rencana membuat atau membenahi website? Mulai dari konsultasi singkat dulu.",
     "tangkapan layar website klien di ponsel"),

    ("Update", "Branding agency Surabaya: kapan rebranding masuk akal",
     "Rebranding bukan sekadar mengganti logo. Yang biasanya mendesak lebih dulu adalah ketika pesan "
     "bisnis Anda tidak lagi cocok dengan pelanggan yang sekarang Anda layani, atau ketika materi promosi "
     "di beberapa kanal saling bertentangan.\n\n"
     "Urutan yang kami sarankan: rapikan dulu identitas dasarnya (nama, warna, tipografi, nada bicara), "
     "baru diterapkan ke kanal yang paling sering dilihat pelanggan.\n\n"
     "Kalau Anda ragu mulai dari mana, mulai dari obrolan singkat soal target pelanggan Anda.",
     "foto contoh materi brand"),

    ("Update", "Social media agency Surabaya: ukuran keberhasilan yang jujur",
     "Jumlah pengikut sering dijadikan ukuran, padahal itu bukan yang menentukan penjualan. Ukuran yang "
     "lebih berguna: berapa percakapan yang terjadi dengan calon pembeli, berapa yang menanyakan harga, "
     "dan berapa yang akhirnya menjadi pelanggan.\n\n"
     "Karena itu laporan kami tidak berhenti di jumlah tayangan. Kami tunjukkan juga pesan masuk dan "
     "sumber kedatangannya, supaya jelas mana yang berkontribusi.",
     "tangkapan layar analitik akun sosial media"),

    ("Update", "Iklan Google untuk bisnis Surabaya",
     "Iklan berbayar bisa memberi hasil tercepat, tetapi justru paling mudah memboroskan anggaran kalau "
     "sasarannya salah. Yang kami periksa lebih dulu: kata kunci yang benar-benar dipakai orang untuk "
     "mencari produk Anda, dan halaman tujuan iklan itu.\n\n"
     "Iklan yang mengarah ke halaman yang membingungkan akan tetap mahal, sekalipun kata kuncinya tepat.\n\n"
     "Kalau anggaran iklan Anda terbatas, kami akan bilang jujur jenis iklan mana yang sebaiknya "
     "didahulukan.",
     "tangkapan layar laporan iklan"),

    ("Update", "Pakar SEO Surabaya: mulai dari audit, bukan dari paket",
     "Banyak pemilik bisnis sudah mencoba SEO sebelumnya dan tidak melihat hasilnya. Sebelum menyarankan "
     "pekerjaan baru, kami periksa dulu apa yang sudah dikerjakan dan apa yang menghambat.\n\n"
     "Sering kali masalahnya bukan pada jumlah artikel, tetapi pada hal teknis: halaman lambat, struktur "
     "tautan berantakan, atau satu kata kunci diperebutkan beberapa halaman sekaligus.\n\n"
     "Audit ini yang menentukan, apakah perlu menambah konten atau justru merapikan yang sudah ada.",
     "foto proses audit di layar komputer"),

    ("Update", "Melayani Surabaya, Sidoarjo, Gresik, dan Malang",
     "Klien kami tersebar di Surabaya, Sidoarjo, Gresik, dan Malang, baik yang kami dampingi langsung "
     "maupun jarak jauh. Untuk pekerjaan pemasaran digital, pertemuan tatap muka tidak wajib.\n\n"
     "Yang penting kedisiplinan dua arah: kami mengerjakan dan melaporkan, Anda mengambil keputusan pada "
     "waktunya. Rapat bulanan bisa dilakukan online dengan rekaman yang bisa Anda simpan.\n\n"
     "Tinggal di luar kota dan ingin dibantu? Silakan hubungi kami lewat WhatsApp.",
     "foto peta jangkauan layanan"),

    ("Update", "Konsultasi online untuk bisnis luar Surabaya",
     "Kalau Anda tinggal di luar Surabaya, konsultasi awal bisa dilakukan online. Yang perlu Anda "
     "siapkan: akses digital yang sudah ada (website, Google Analytics, atau akun iklan), dan gambaran "
     "singkat siapa pelanggan Anda.\n\n"
     "Dalam satu sesi, kami biasanya bisa menunjukkan tiga hal: di mana posisi bisnis Anda sekarang, apa "
     "yang paling menghambat, dan pekerjaan mana yang layak didahulukan.\n\n"
     "Hubungi kami lewat tombol WhatsApp di profil ini untuk menentukan waktunya.",
     "tangkapan layar sesi konsultasi online"),

    ("Update", "Audit SEO: apa saja yang kami periksa",
     "Audit teknis kami mencakup dua belas hal, mulai dari yang paling sering bermasalah: kecepatan "
     "halaman di ponsel, halaman yang tidak terindeks, judul dan deskripsi yang kosong atau kembar, "
     "struktur tautan internal, sampai duplikasi halaman yang berebut kata kunci yang sama.\n\n"
     "Hasilnya kami sampaikan dalam bahasa yang bisa dipakai mengambil keputusan, bukan sekadar daftar "
     "kesalahan teknis.",
     "foto tim sedang audit teknis"),

    ("Update", "Laporan bulanan: angka apa yang Anda lihat",
     "Laporan yang berguna menjawab tiga hal: apa yang dikerjakan bulan ini, hasilnya bagaimana, dan apa "
     "rencana bulan depan. Termasuk bagian yang belum berhasil, karena hampir tiap bulan ada percobaan "
     "yang tidak membuahkan hasil.\n\n"
     "Angka yang kami laporkan biasanya sederhana: pengunjung dari pencarian, jumlah orang yang "
     "menghubungi lewat WhatsApp atau formulir, dan biaya per calon pembeli kalau ada iklan berjalan.\n\n"
     "Kalau agensi Anda melaporkan sesuatu yang tidak bisa Anda periksa sendiri, itu pertanyaan penting.",
     "tangkapan layar halaman laporan bulanan"),

    ("Update", "Kepemilikan aset digital tetap di tangan Anda",
     "Satu hal yang jarang dibicarakan sebelum kontrak: siapa yang memegang aset digital. Akun iklan, "
     "Google Analytics, Search Console, dan akses situs sebaiknya tetap atas nama bisnis Anda.\n\n"
     "Kami bekerja di akun milik klien, bukan di akun kami sendiri. Artinya kalau suatu saat Anda memilih "
     "bekerja dengan pihak lain, tidak ada yang perlu diperebutkan dan riwayat datanya tetap utuh.\n\n"
     "Kalau ada penawaran yang meminta Anda menyerahkan seluruh akun, tanyakan alasannya.",
     "tangkapan layar daftar akun klien"),

    ("Update", "Berapa lama SEO mulai terlihat hasilnya",
     "Jawaban jujurnya: pekerjaan teknis mulai terlihat dalam hitungan pekan, tetapi kenaikan pengunjung "
     "biasanya baru terasa pada bulan ketiga sampai keenam.\n\n"
     "Tanda awal yang lebih cepat terlihat adalah halaman Anda mulai muncul untuk lebih banyak kata "
     "kunci, meskipun posisinya masih jauh. Itu artinya Google mulai mengenali halaman Anda.\n\n"
     "Kami tidak akan menjanjikan hasil dalam hitungan hari, karena itu tidak bisa dipertanggungjawabkan.",
     "ilustrasi grafik tren pengunjung"),

    ("Update", "Website lambat membuat iklan dan SEO boros",
     "Pengunjung yang menunggu halaman terlalu lama akan menutupnya sebelum melihat penawaran Anda. "
     "Artinya biaya per calon pembeli ikut naik, dan pekerjaan SEO kehilangan sebagian hasilnya.\n\n"
     "Perbaikan yang paling sering berdampak: kompresi gambar, mematikan fitur yang tidak terpakai, "
     "pengaturan cache, dan mengurangi skrip dari pihak ketiga.\n\n"
     "Sebelum menambah biaya iklan, ada baiknya memeriksa kecepatan situs Anda lebih dulu.",
     "tangkapan layar skor kecepatan halaman"),

    ("Update", "Profil bisnis Google untuk bisnis lokal",
     "Untuk bisnis yang melayani pelanggan di satu kota, halaman yang paling sering dilihat justru profil "
     "bisnisnya, bukan website-nya. Karena itu profil ini juga kami urus untuk klien.\n\n"
     "Yang berpengaruh: kategori usaha yang tepat, daftar layanan yang lengkap, jam buka yang benar, foto "
     "asli tempat usaha, dan ulasan yang dibalas.\n\n"
     "Satu ulasan yang dibalas dengan baik lebih meyakinkan daripada sepuluh ulasan tanpa tanggapan.",
     "foto profil bisnis di ponsel"),

    ("Update", "Kata kunci lokal: yang dicari orang, bukan yang kita kira",
     "Banyak bisnis salah menebak kata kunci. Mereka mengoptimasi istilah teknis yang tidak pernah "
     "dipakai pelanggan.\n\n"
     "Cara paling cepat menemukan kata kunci yang benar adalah melihat data pencarian yang sudah Anda "
     "miliki. Di Google Search Console, kueri yang memunculkan situs Anda bisa dibaca langsung, termasuk "
     "yang belum menghasilkan klik.\n\n"
     "Dari situ biasanya kelihatan kata kunci mana yang layak digarap lebih dulu.",
     "tangkapan layar data kata kunci"),

    ("Update", "Konten yang benar-benar dicari pelanggan",
     "Menulis artikel SEO bukan soal mengejar jumlah. Yang menentukan adalah apakah artikel itu menjawab "
     "pertanyaan yang orang ketik sebelum membeli.\n\n"
     "Ukuran sederhananya: kalau artikel Anda tidak membuat orang menghubungi Anda atau membandingkan "
     "penawaran, mungkin topiknya terlalu jauh dari keputusan pembelian.\n\n"
     "Kami lebih memilih 20 halaman yang tepat sasaran daripada 100 halaman yang tidak dibaca siapa pun.",
     "foto proses penyusunan konten"),

    ("Update", "Kami menolak sebagian permintaan klien, ini alasannya",
     "Ada tiga permintaan yang biasanya kami tolak: menjamin peringkat nomor satu, membeli tautan massal, "
     "dan menerbitkan puluhan artikel dalam sehari.\n\n"
     "Ketiganya berisiko jangka panjang. Tautan massal dan terbit massal memang bisa menaikkan angka "
     "sementara, lalu berbalik menurunkan kepercayaan situs.\n\n"
     "Kalau sebuah agensi menolak menjanjikan hasil instan, itu biasanya tanda bagus.",
     "foto suasana diskusi dengan klien"),

    ("Update", "Apa yang menentukan biaya jasa digital marketing",
     "Harga jasa pemasaran berbeda-beda karena komposisi pekerjaannya berbeda. Yang biasanya menentukan: "
     "jumlah kanal yang digarap, siapa yang mengerjakan, apakah termasuk penulisan konten, dan berapa "
     "lama kontraknya.\n\n"
     "Pos yang paling sering tidak disebut di awal adalah belanja iklan (terpisah dari biaya jasa) dan "
     "alat berbayar yang dipakai untuk pemantauan.\n\n"
     "Kalau ingin gambaran biayanya, tanyakan lewat WhatsApp dan kami jelaskan rinciannya.",
     "tangkapan layar rincian paket"),

    ("Update", "Muncul di jawaban AI, bukan hanya di Google",
     "Orang mulai bertanya langsung ke AI: \"rekomendasi vendor di Surabaya yang seperti ini\". Kalau "
     "bisnis Anda tidak disebut di situ, peluangnya pindah ke pesaing.\n\n"
     "Yang membuat sebuah bisnis dikutip mesin AI mirip dengan yang membuatnya dipercaya manusia: "
     "informasi yang konsisten di banyak tempat, halaman yang jelas menjawab satu hal, dan penyebutan "
     "dari pihak lain.\n\n"
     "Ini cara pandang baru yang kami pakai di setiap pekerjaan SEO.",
     "ilustrasi tampilan jawaban mesin AI"),

    ("Update", "Riset kata kunci dengan bantuan AI",
     "AI mempercepat bagian membosankan dari riset kata kunci: mengelompokkan ratusan kueri, menyusun "
     "gagasan topik, dan merangkum isi halaman pesaing. Yang tetap harus dilakukan manusia adalah menilai "
     "mana yang cocok dengan bisnis Anda.\n\n"
     "Data yang kami pakai tetap dari sumber resmi (Search Console dan alat pencarian), bukan karangan "
     "model bahasa.\n\n"
     "Kalau Anda ingin mencobanya untuk bisnis sendiri, kami bisa menunjukkan alurnya.",
     "tangkapan layar proses riset kata kunci"),

    ("Update", "Konten yang ditulis dengan AI: batas amannya",
     "AI layak dipakai sebagai alat bantu, asal tahu batasnya. Yang tidak boleh diserahkan: data dan "
     "pengalaman asli bisnis Anda, nama pelanggan, angka, dan hal-hal yang hanya Anda yang tahu.\n\n"
     "Tulisan hasil AI yang dipakai apa adanya biasanya bisa dikenali pembaca, dan itu merugikan kredibilitas.\n\n"
     "Praktik kami: AI untuk kerangka dan riset, manusia untuk isi dan penyuntingan.",
     "foto proses penyuntingan tulisan"),

    ("Update", "Otomasi sederhana yang menghemat waktu UMKM",
     "Sebagian pekerjaan pemasaran bisa diotomatiskan tanpa biaya besar: laporan kunjungan bulanan yang "
     "dikirim otomatis ke email, pengingat membalas ulasan, dan pengumpulan pertanyaan pelanggan dari "
     "WhatsApp ke satu tempat.\n\n"
     "Tujuannya bukan menggantikan orang, tetapi mengembalikan waktu yang habis untuk pekerjaan berulang.\n\n"
     "Kalau Anda penasaran bagian mana yang bisa diotomatiskan di bisnis Anda, tanyakan saja.",
     "tangkapan layar laporan otomatis"),

    ("Update", "SEO untuk klinik dan rumah sakit",
     "Kami menangani beberapa klien layanan kesehatan. Yang membedakan pekerjaan di bidang ini: aturan "
     "isi yang ketat, dan kepercayaan yang harus dibangun lebih dulu.\n\n"
     "Praktiknya: konten harus akurat dan tidak menjanjikan hasil pengobatan, sedangkan halaman yang "
     "paling berdampak biasanya adalah halaman layanan dan profil dokternya.\n\n"
     "Kalau Anda mengelola klinik, kami bisa menunjukkan contoh pendekatannya.",
     "foto suasana klinik klien (dengan izin)"),

    ("Update", "SEO untuk bengkel dan otomotif",
     "Untuk bengkel, pencarian yang paling menentukan justru yang berbunyi \"dekat sini\" dan menyebut "
     "merek mobil. Halaman layanan per merek dan profil bisnis yang aktif biasanya memberi hasil lebih "
     "cepat daripada artikel umum.\n\n"
     "Yang perlu dihindari: menerbitkan banyak artikel bersudut sama dalam waktu singkat. Pola itu justru "
     "menurunkan kepercayaan situs.\n\n"
     "Kami punya pengalaman di sektor ini dan bisa berbagi temuannya.",
     "foto bengkel atau mobil di lift"),

    ("Update", "SEO untuk properti dan agen properti",
     "Pencarian properti hampir selalu menyebut lokasi dan jenis unit. Karena itu struktur halaman yang "
     "rapi per kawasan dan per tipe unit lebih berguna daripada satu halaman besar berisi semuanya.\n\n"
     "Hal kedua yang sering dilewatkan: memperbarui halaman saat unitnya sudah terjual. Stok yang tidak "
     "diperbarui membuat pengunjung kehilangan kepercayaan.\n\n"
     "Butuh pendampingan untuk pemasaran properti? Silakan hubungi kami.",
     "foto properti atau apartemen"),

    ("Update", "SEO untuk B2B dan manufaktur",
     "Di bisnis B2B, pengunjung dari pencarian jumlahnya lebih sedikit, tetapi nilainya lebih besar. "
     "Karena itu keberhasilan tidak diukur dari jumlah kunjungan, melainkan dari jumlah permintaan "
     "penawaran.\n\n"
     "Yang biasanya berpengaruh: halaman teknis yang benar-benar menjelaskan spesifikasi, dan dokumen "
     "yang bisa diunduh calon pembeli.\n\n"
     "Kami bisa membantu memetakan kata kunci yang dipakai pembeli industri Anda.",
     "foto lingkungan pabrik atau gudang"),

    ("Penawaran", "Audit singkat gratis untuk bisnis Anda",
     "Kami membuka audit singkat tanpa biaya untuk bisnis di Surabaya dan sekitarnya. Isinya: pemeriksaan "
     "halaman yang sudah menghasilkan pengunjung, kata kunci yang belum terpakai, dan tiga perbaikan "
     "yang paling cepat berdampak.\n\n"
     "Hasilnya dikirim dalam bentuk ringkasan yang bisa langsung Anda pakai, tidak harus melanjutkan "
     "kerja sama dengan kami.\n\n"
     "Slot terbatas setiap pekan. Hubungi kami lewat tombol WhatsApp di profil ini untuk memilih waktu.",
     "poster penawaran audit gratis"),

    ("Update", "Cara menghubungi kami dan apa yang terjadi setelahnya",
     "Menghubungi kami tidak berlangsung seperti presentasi penjualan. Pertama, kami tanyakan kondisi "
     "bisnis Anda sekarang dan masalah yang sedang dihadapi.\n\n"
     "Setelah itu kami sampaikan temuan awal dan pekerjaan yang layak didahulukan. Kalau ternyata "
     "kebutuhan Anda bisa diselesaikan tanpa jasa kami, itu juga akan kami bilang.\n\n"
     "Hubungi kami lewat tombol WhatsApp di profil ini, atau lihat layanan kami di studiosoft.id.",
     "foto suasana konsultasi dengan klien"),
]

BULAN = ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September",
         "Oktober", "November", "Desember"]
HARI = ["Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu", "Minggu"]

jadwal, t, i = [], date(2026, 10, 9), 0
while i < len(POST):
    if t.weekday() in (4, 1):
        jadwal.append(t)
        i += 1
    t += timedelta(days=1)

semua = ["STUDIOSOFT — 30 POSTINGAN GOOGLE BUSINESS PROFILE",
         "Siap tempel. Ambil teks di antara garis 'salin dari sini' dan 'sampai sini'.", ""]
for (jenis, judul, isi, gambar), tgl in zip(POST, jadwal):
    header = (f"{'=' * 64}\nPOSTINGAN {len([x for x in semua if x.startswith('====')]) + 1:>2} · "
              f"{HARI[tgl.weekday()]} {tgl.day} {BULAN[tgl.month - 1]} {tgl.year} · jenis: {jenis}\n"
              f"Tombol ajakan: WhatsApp   |   Gambar: {gambar}\n{'=' * 64}")
    semua += [header, "--- salin dari sini ---", isi, "--- sampai sini ---", ""]
    nomor = len([x for x in semua if x.startswith("====")])
    with open(f"{DIR}/post_{nomor:02d}.txt", "w") as f:
        f.write(isi + "\n")

open(f"{WS}/drafts/ss_gbp_postingan.txt", "w").write("\n".join(semua))

with open(f"{WS}/drafts/ss_gbp_kalender.md", "w") as f:
    f.write("# StudioSoft — kalender pemasangan 30 caption Google Business Profile\n\n")
    f.write("Dua kali per pekan, Jumat dan Selasa, jam 09:00 WIB. Tempel caption sesuai nomor,\n")
    f.write("pilih tombol ajakan, lalu unggah gambar sesuai saran.\n\n")
    f.write("| # | Tanggal | Judul | Jenis | Saran gambar |\n|---|---|---|---|---|\n")
    for n, ((jenis, judul, _, gambar), tgl) in enumerate(zip(POST, jadwal), 1):
        f.write(f"| {n} | {tgl.strftime('%d %b %Y')} | {judul} | {jenis} | {gambar} |\n")
    f.write(f"\nTotal {len(POST)} pemasangan, selesai {jadwal[-1].strftime('%d %b %Y')}.\n")

kata = [len(x[2].split()) for x in POST]
print(f"postingan: {len(POST)} · kata: min {min(kata)} maks {max(kata)}")
print(f"→ drafts/ss_gbp_postingan.txt · drafts/ss_gbp_kalender.md · drafts/ss_gbp_postingan/post_01..{len(POST):02d}.txt")
