Sebaiknya kita mulai

dari mana?

Otomasi Facebook Marketplace & Messenger Seller Menggunakan Playwright Python: Dari Relist Hingga Monitoring Unread Chat

Mengelola toko dan listings di Facebook Marketplace secara manual tentu menyita waktu, terutama saat harus melakukan perbarui listing (relist) secara berkala dan memantau pesan masuk dari calon pembeli.

Pada artikel ini, kita akan membahas panduan teknis membangun bot otomasi Facebook Marketplace dan Messenger Seller menggunakan Python dan Playwright.

1. Persiapan Environment & Panduan Menjalankan via Terminal / CMD

Sebelum mengeksekusi skrip otomasi, pastikan lingkungan kerja Python (virtual environment) sudah disiapkan agar dependency tidak bentrok dengan sistem utama.

Buka Command Prompt (CMD) atau Terminal di Windows, lalu ikuti langkah-langkah berikut:

Langkah 1: Masuk ke Folder Proyek Pindah ke direktori tempat file skrip Python agan disimpan:

DOS
cd playwright_demo

Langkah 2: Membuat Virtual Environment (Venv) Buat lingkungan virtual isolasi Python agar library Playwright terinstal secara terpisah (cukup dilakukan sekali di awal):

DOS
python -m venv venv

(Penjelasan: Perintah ini membuat folder terisolasi bernama venv yang menampung interpreter Python & paket pendukung khusus proyek ini).

Langkah 3: Mengaktifkan Virtual Environment Aktifkan virtual environment sebelum menjalankan skrip:

DOS
venv\Scripts\activate

(Penjelasan: Saat aktif, indikator (venv) akan muncul di awal baris CMD agan).

Langkah 4: Menjalankan Skrip Otomasi Jalankan skrip utama dan tunggu hingga seluruh proses otomasi browser berlangsung otomatis:

DOS
python hitung_chat_messenger_marketplace.py

2. Masalah Utama & Solusi Login (Bypass 2FA)

Menggunakan launch_persistent_context bawaan browser sering mengalami eror SingletonLock karena bentrok dengan proses Google Chrome yang sedang aktif.

Solusinya:

  • Menggunakan launch standar dengan injeksi skrip pencegah deteksi bot (--disable-blink-features=AutomationControlled).

  • Mengimpor cookies akun Facebook dari file Netscape (fb_cookies_raw.json) dan mengonversinya ke bentuk JSON Playwright.

  • Menyimpan sesi login yang valid ke file fb_cookies.json (storage_state) sehingga bot bisa login otomatis tanpa perlu memicu verifikasi 2FA atau Captcha berulang kali.

3. Otomasi Perbarui Produk (Auto Relist)

Untuk memperbarui listings yang sudah masuk masa Renew, bot diarahkan langsung ke halaman Selling Dashboard ([https://www.facebook.com/marketplace/you/selling](https://www.facebook.com/marketplace/you/selling)).

Bot diprogram untuk:

  • Mendeteksi tombol utama bertuliskan "Perbarui" / "Renew".

  • Fallback Mechanism: Jika tombol perbarui tidak langsung terlihat, bot akan otomatis mengklik menu titik tiga (...) atau tombol "Tindakan" pada listing untuk mencari opsi Perbarui yang tersembunyi di dalam pop-up menu.

4. Monitoring Pesan Masuk (Marketplace Seller Inbox)

Navigasi pesan diarahkan ke [https://www.facebook.com/messages/t](https://www.facebook.com/messages/t) (Facebook Messenger Web Utama) lalu beralih ke folder/filter Marketplace.

Tantangan Technical & Solusi UI Facebook Modern:

  • Lazy Loading & Virtual Scroll: Facebook menggunakan Virtual DOM yang membuat tombol PageDown biasa tidak memicu pemuatan list chat. Solusinya adalah memindahkan koordinat kursor ke panel kiri (X: 150, Y: 300), mengkliknya untuk memberi fokus, lalu menjalankan perintah page.mouse.wheel(0, 600).

  • Struktur Unread Chat: Pesan unread diidentifikasi melalui kelas font tebal (font-weight: 600), indikator warna titik biru (rgb(8, 102, 255)), serta ekstraksi elemen span terstruktur untuk mengambil data Nama Pembeli dan Detail Barang/Cuplikan Pesan.

5. Kode Python Utama (Full Script Monitoring Inbox)

Python
from playwright.sync_api import sync_playwright
import time

with sync_playwright() as p:
    print("[+] Membuka Chromium dengan session cookies...")
    browser = p.chromium.launch(
        headless=False,
        args=["--disable-blink-features=AutomationControlled"]
    )
    
    context = browser.new_context(
        storage_state="fb_cookies.json",
        user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
        viewport={"width": 1280, "height": 720}
    )

    page = context.new_page()

    # 1. Buka Messenger Web Utama
    print("[+] Membuka Facebook Messenger (messages/t)...")
    page.goto('https://www.facebook.com/messages/t', wait_until='domcontentloaded')
    time.sleep(15)

    # 2. Filter Khusus Pesan Marketplace
    print("[+] Mencari dan mengklik folder/filter 'Marketplace'...")
    try:
        filter_marketplace = page.locator('div[role="navigation"] :text("Marketplace"), span:text("Marketplace")').first
        if filter_marketplace.is_visible():
            filter_marketplace.click()
            print("[✓] Berhasil beralih ke folder Marketplace!")
            time.sleep(15)
    except Exception as e:
        print(f"[!] Gagal berpindah folder: {e}")

    # 3. Focus & Scroll Panel Kiri (Daftar Chat)
    print("[+] Mengarahkan kursor ke panel daftar percakapan...")
    page.mouse.move(150, 300)
    page.mouse.click(150, 300)
    time.sleep(1)

    print("[+] Auto scroll daftar percakapan (8x Scroll)...")
    for i in range(8):
        page.mouse.wheel(0, 600)
        time.sleep(2)

    # Kembalikan scroll ke posisi paling atas
    page.mouse.wheel(0, -5000)
    time.sleep(3)

    # 4. Deteksi Item Percakapan & Status Unread
    list_chat_items = page.locator('div[role="navigation"] div[role="grid"] div[role="row"], div[role="navigation"] a[href*="/messages/t/"]')
    if list_chat_items.count() == 0:
        list_chat_items = page.locator('div[role="navigation"] div[role="link"]')

    total_chat = list_chat_items.count()
    total_unread = 0

    print("\n" + "="*55)
    print("   LAPORAN PESAN MESSENGER (MARKETPLACE)")
    print("="*55)

    jumlah_dilihat = min(total_chat, 15)
    for idx in range(jumlah_dilihat):
        try:
            item = list_chat_items.nth(idx)
            spans = item.locator('span').all_text_contents()
            teks_bersih = [s.strip() for s in spans if s.strip()]
            teks_non_waktu = [t for t in teks_bersih if len(t) > 2 or t.isalpha()]

            nama_user = teks_non_waktu[0] if len(teks_non_waktu) > 0 else "Calon Pembeli"
            detail_pesan = " - ".join(teks_non_waktu[1:3]) if len(teks_non_waktu) > 1 else "Tidak ada cuplikan"

            html_content = item.inner_html()
            is_unread_bold = 'font-weight: 600' in html_content or 'font-weight:bold' in html_content
            has_blue_dot = 'rgb(8, 102, 255)' in html_content or 'rgb(24, 119, 242)' in html_content
            
            if is_unread_bold or has_blue_dot:
                status_label = "[UNREAD 🔵]"
                total_unread += 1
            else:
                status_label = "[DIBACA]"

            print(f" {idx+1}. {status_label} {nama_user}")
            print(f"    └─ Detail/Barang: {detail_pesan}")

        except Exception as e:
            print(f" {idx+1}. [Gagal mengekstrak detail chat: {e}]")

    print("-" * 55)
    print(f" [•] Total Percakapan Dimuat : {total_chat} chat")
    print(f" [•] Total Pesan Unread     : {total_unread} chat")
    print("="*55)

    time.sleep(5)
    browser.close()

Kesimpulan & Rencana Pengembangan

Dengan arsitektur Playwright ini, kita berhasil mengotomatisasi pembaruan stok/listing produk serta pemantauan inbox calon pembeli secara stabil. Tahap selanjutnya dari proyek ini adalah menghubungkan data ekstraksi pesan masuk ke API Google Gemini AI untuk membalas pertanyaan pembeli secara otomatis (Auto-Reply Bot).