Skip to content

라이브 데모: AI와 대화하고 한 번에 완성된 스크립트 생성하기

이 장에서는 "자연어로 요구사항을 말하는 것"부터 "실행 준비가 완료된 스크립트를 얻는 것"까지의 전체 과정을 실제 사례와 함께 단계별로 보여드립니다.


데모 시나리오

비즈니스 배경: 당신은 20개의 아마존 셀러 계정을 보유하고 있으며, 매일 각 계정의 "Pending(결제 대기)" 주문 수를 확인하여 팀을 위한 엑셀 보고서를 작성해야 합니다.

전통적인 방식: 각 계정에 일일이 하나씩 로그인하고, 주문 수를 기록한 뒤 엑셀에 채워 넣습니다. 이 작업은 약 2시간이 소요됩니다.

AI + Mbbrowser 방식: 요구사항을 설명하면 AI가 스크립트를 생성하고, 스크립트가 나머지 작업을 처리합니다. 설정 시간을 포함하여 총 15분 정도 소요됩니다.


1단계: 준비 작업 (5분)

NOTE

이전 장들을 통해 다음 설정이 완료되었다고 가정합니다:

  • ✅ Cursor 또는 Antigravity가 설치됨.
  • ✅ Mbbrowser Rules 패키지가 Cursor에 로드됨.
  • ✅ Mbbrowser ApiServer가 시작됨 (http://127.0.0.1:8186).
  • ✅ 아마존 계정들이 이미 Mbbrowser 환경 내에서 로그인되어 있음 (쿠키 저장됨).

sessions.txt 파일 준비

프로젝트 폴더에 sessions.txt를 만들고 작업하려는 모든 환경 ID를 입력합니다:

a1b2c3d4e5f6789012345678901234ab
b2c3d4e5f67890123456789012345bcd
c3d4e5f678901234567890123456cde
... (한 줄에 하나의 Session_ID, 총 20줄)

2단계: Cursor에서 요구사항 입력 (30초)

Ctrl + L을 눌러 Cursor Chat을 열고 다음 내용을 입력합니다:

Mbbrowser sessions.txt 파일에 20개의 계정 Session_ID가 한 줄에 하나씩 들어있어.
이 계정들은 이미 Mbbrowser 환경에서 아마존에 로그인되어 있는 상태야.

다음 기능을 가진 Python 스크립트를 생성해 줘:
1. sessions.txt에서 모든 Session_ID를 읽어온다.
2. 모든 환경을 일괄 실행한다 (최대 10개 동시 실행).
3. 각 환경이 Playwright에 연결된 후:
   a. 페이지 로딩을 기다린다 (환경은 보통 마지막으로 닫혔던 페이지에 머물러 있음).
   b. https://www.amazon.com/gp/orders-v2/list (아마존 셀러 주문 페이지)로 이동한다.
   c. .a-row.shipment 요소가 나타날 때까지 기다린다 (주문 목록 로딩 완료 신호).
   d. 페이지 내의 .shipment-status-buyerPending 요소 개수를 센다 (이것이 "Pending" 주문임).
   e. Session_ID의 앞 8자리 + Pending 주문 수를 결과에 기록한다.
4. 모든 작업이 끝나면 모든 환경을 종료한다.
5. 결과를 amazon_orders_[오늘 날짜].xlsx에 저장한다. 
   컬럼 구성: 환경 ID (앞 8자리), Pending 주문 수, 확인 시간, 상태.

예외가 발생하면 errors/ 폴더에 스크린샷을 저장하고 결과 표에 "확인 실패"라고 기록해 줘.

3단계: AI 코드 생성 (약 30초)

요청을 받으면 Cursor의 AI가 전체 코드를 생성합니다. 생성된 결과는 다음과 같은 모습일 것입니다:

python
"""
Mbbrowser + 아마존 주문 확인 스크립트
모든 환경의 결제 대기(Pending) 주문 수를 자동으로 확인합니다.
"""
import threading
import datetime
from pathlib import Path
from concurrent.futures import ThreadPoolExecutor, as_completed
import requests
import openpyxl
from playwright.sync_api import sync_playwright, TimeoutError as PWTimeout

# ==============================
# 설정 (필요에 따라 수정)
# ==============================
APISERVER   = "http://127.0.0.1:8186"
SESSIONS_FILE = "sessions.txt"
MAX_WORKERS  = 10   # 최대 동시 실행 수
ERRORS_DIR   = Path("errors")
ERRORS_DIR.mkdir(exist_ok=True)

results_lock = threading.Lock()
results = []

# ==============================
# APIServer 래퍼 함수
# ==============================
def start_env(session_id: str) -> dict | None:
    try:
        resp = requests.post(
            f"{APISERVER}/api/v1/browser/start",
            json={"Session_ID": [session_id], "isHeadless": False},
            timeout=30
        )
        data = resp.json()
        if data["code"] == 0:
            return data["data"]["listid"][0]
    except Exception as e:
        print(f"[{session_id[:8]}] APIServer 오류: {e}")
    return None

def stop_env(session_id: str):
    try:
        requests.post(
            f"{APISERVER}/api/v1/browser/stop",
            json={"Session_ID": session_id},
            timeout=10
        )
    except Exception:
        pass

# ==============================
# 개별 계정 작업 단위
# ==============================
def check_orders(session_id: str):
    now = datetime.datetime.now().strftime("%H:%M:%S")
    env_short = session_id[:8]
    
    env_data = start_env(session_id)
    if not env_data:
        with results_lock:
            results.append({
                "env_id": env_short,
                "pending_orders": "N/A",
                "check_time": now,
                "status": "환경 실행 실패"
            })
        return
    
    port = env_data.get("browser_CDP_Port")
    ws   = f"ws://127.0.0.1:{port}/json/version"
    
    pw = sync_playwright().start()
    try:
        browser = pw.chromium.connect_over_cdp(ws)
        context = browser.contexts[0]
        page    = context.pages[0] if context.pages else context.new_page()
        
        # 아마존 주문 페이지로 이동
        page.goto(
            "https://www.amazon.com/gp/orders-v2/list",
            wait_until="domcontentloaded",
            timeout=20000
        )
        
        # 주문 목록 로딩 대기
        page.wait_for_selector(".a-row.shipment", timeout=15000)
        
        # Pending 주문 수 카운트
        pending = page.locator(".shipment-status-buyerPending").count()
        print(f"[{env_short}] ✅ Pending 주문 수: {pending}")
        
        with results_lock:
            results.append({
                "env_id": env_short,
                "pending_orders": pending,
                "check_time": now,
                "status": "성공"
            })
        
        browser.close()
        
    except PWTimeout:
        page.screenshot(path=str(ERRORS_DIR / f"{env_short}_timeout.png"))
        with results_lock:
            results.append({
                "env_id": env_short,
                "pending_orders": "N/A",
                "check_time": now,
                "status": "페이지 타임아웃"
            })
    except Exception as e:
        try:
            page.screenshot(path=str(ERRORS_DIR / f"{env_short}_error.png"))
        except Exception:
            pass
        with results_lock:
            results.append({
                "env_id": env_short,
                "pending_orders": "N/A",
                "check_time": now,
                "status": f"예외 발생: {str(e)[:50]}"
            })
    finally:
        try:
            pw.stop()
        except Exception:
            pass
        stop_env(session_id)

# ==============================
# 메인 프로그램
# ==============================
def main():
    # Session_ID 목록 읽기
    session_ids = [
        line.strip()
        for line in Path(SESSIONS_FILE).read_text().splitlines()
        if line.strip()
    ]
    print(f"📋 총 {len(session_ids)}개 계정, 최대 동시 실행 {MAX_WORKERS}")
    
    # 동시 실행 처리
    with ThreadPoolExecutor(max_workers=MAX_WORKERS) as pool:
        futures = {pool.submit(check_orders, sid): sid for sid in session_ids}
        for future in as_completed(futures):
            sid = futures[future]
            try:
                future.result()
            except Exception as e:
                print(f"[{sid[:8]}] 처리되지 않은 예외: {e}")
    
    # 엑셀 보고서 저장
    today = datetime.date.today().strftime("%Y%m%d")
    filename = f"amazon_orders_{today}.xlsx"
    
    wb = openpyxl.Workbook()
    ws = wb.active
    ws.title = "주문 확인 결과"
    ws.append(["환경 ID (앞 8자리)", "Pending 주문 수", "확인 시간", "상태"])
    for r in results:
        ws.append([r["env_id"], r["pending_orders"], r["check_time"], r["status"]])
    
    wb.save(filename)
    
    # 요약 보고
    success = sum(1 for r in results if r["status"] == "성공")
    print(f"\n{'='*40}")
    print(f"✅ 성공: {success} / {len(results)}")
    print(f"📄 보고서 저장 완료: {filename}")
    print(f"❌ 오류 스크린샷 저장: errors/ 폴더")

if __name__ == "__main__":
    main()

4단계: 의존성 설치 및 실행 (2분)

코드 생성 후, AI는 보통 필요한 의존성 설치 방법을 안내합니다:

bash
pip install playwright requests openpyxl

그 다음 바로 실행하면 됩니다:

bash
python check_amazon_orders.py

예상 출력 결과

📋 총 20개 계정, 최대 동시 실행 10
[a1b2c3d4] ✅ Pending 주문 수: 3
[b2c3d4e5] ✅ Pending 주문 수: 0
[c3d4e5f6] ✅ Pending 주문 수: 7
... 
========================================
✅ 성공: 18 / 20
📄 보고서 저장 완료: amazon_orders_20260226.xlsx
❌ 오류 스크린샷 저장: errors/ 폴더

자주 발생하는 문제 및 AI 수정 팁

"스크립트는 실행되는데 주문 요소를 찾지 못해요"

해당 코드를 선택하고 Ctrl + K를 누릅니다. 다음과 같이 입력하세요:

아마존 페이지의 선택자가 변경된 것 같아. 실제 주문 행 선택자는 .order-info이고, 보류 상태 선택자는 .order-status-pending이야. 코드를 업데이트해 줘.

"주문 상세 정보도 수집하는 기능을 추가해 줘"

Chat에서 대화를 이어갑니다:

위 코드에 기반해서, 주문 수량을 수집한 후 각 보류 주문의 주문 ID(.a-fixed-right-grid-col .a-link-normal)와 예상 배송일(.expected-ship-date)도 함께 수집해서 엑셀에 기록해 줘.

"동시 실행이 너무 빨라서 팅겨요; 속도 조절이 필요해"

ThreadPoolExecutor를 사용할 때, 너무 많은 환경이 한꺼번에 열려 메모리 문제가 발생하지 않도록 각 새로운 작업이 시작되기 전에 3초간 대기하는 로직을 추가해 줘.

요약: AI 스크립트 작성을 위한 모범 사례

[ 준비 단계 ]
1. Rules 패키지 주입 → AI가 모든 Mbbrowser 인터페이스를 이해함.
2. ApiServer가 시작되었는지 확인.

[ 요구사항 설명 ]
구체적일수록 좋습니다:
  ✅ "https://xxx에 접속해서 #main-content 요소가 나올 때까지 기다린 후, .order-btn을 클릭하고 성공 팝업이 뜰 때까지 대기해 줘."
  ❌ "주문 관리를 도와줘."

[ 생성 ]
보통 80%는 즉시 사용 가능합니다. 사소한 문제는 추가 대화를 통해 수정하세요.

[ 반복 최적화 ]
"이 코드에 기반해서 xx 기능을 추가해 줘" → AI가 코드를 다시 쓰지 않고 변경 사항만 추가합니다.

IMPORTANT

중요 알림: AI가 생성한 코드에는 때때로 사소한 오류가 있을 수 있습니다. 광범위하게 배포하기 전에 항상 1~2개의 테스트 계정에서 먼저 테스트를 실행하세요. 검증된 후에만 전체 계정으로 확대하세요.


TIP

🎉 축하합니다! 이제 AI 모델을 사용하여 Mbbrowser 자동화 스크립트를 생성하는 전체 방법을 마스터하셨습니다.

문제가 발생했나요? 해당 단원을 다시 참조해 보세요:

  • 인터페이스가 맞지 않나요? → Mbbrowser Rules 패키지에서 ApiServer 사용법을 확인하세요.
  • 스크립트 아이디어가 떠오르지 않나요? → Skills 패키지에서 시나리오별 템플릿을 찾아보세요.