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:
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):
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:
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:
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
launchstandar 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
PageDownbiasa tidak memicu pemuatan list chat. Solusinya adalah memindahkan koordinat kursor ke panel kiri (X: 150, Y: 300), mengkliknya untuk memberi fokus, lalu menjalankan perintahpage.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 elemenspanterstruktur untuk mengambil data Nama Pembeli dan Detail Barang/Cuplikan Pesan.
5. Kode Python Utama (Full Script Monitoring Inbox)
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).
