- wholesale 패키지 연동 (SooinSession, GeoYoungSession) - Flask Blueprint 분리 (sooin_api.py, geoyoung_api.py) - order_context 스키마 확장 (wholesaler_id, internal_code 등) - 수인약품 개별 취소 기능 (cancel_item, restore_item) - 문서 추가: WHOLESALE_API_INTEGRATION.md - 테스트 스크립트들
86 lines
3.1 KiB
Python
86 lines
3.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""지오영 JS 파일 다운로드 및 분석"""
|
|
|
|
import requests
|
|
import asyncio
|
|
from playwright.async_api import async_playwright
|
|
import re
|
|
|
|
async def download_and_analyze():
|
|
async with async_playwright() as p:
|
|
browser = await p.chromium.launch(headless=True)
|
|
page = await browser.new_page()
|
|
|
|
# 로그인
|
|
await page.goto('https://gwn.geoweb.kr/Member/Login')
|
|
await page.fill('input[type="text"]', '7390')
|
|
await page.fill('input[type="password"]', 'trajet6640')
|
|
await page.click('button, input[type="submit"]')
|
|
await page.wait_for_load_state('networkidle')
|
|
|
|
cookies = await page.context.cookies()
|
|
await browser.close()
|
|
|
|
# 세션 설정
|
|
session = requests.Session()
|
|
for c in cookies:
|
|
session.cookies.set(c['name'], c['value'])
|
|
|
|
# JS 파일 다운로드
|
|
js_urls = [
|
|
'https://gwn.geoweb.kr/bundles/order_product_cart?v=JPwFQ8DWaNMW1VmbtWYKTJqxT-5255z351W5iZE1qew1',
|
|
'https://gwn.geoweb.kr/bundles/order?v=PGhSOAjQ9z6ruAJgJUFuhW9tGQSiJeX6ek-ky3E-tOk1'
|
|
]
|
|
|
|
for url in js_urls:
|
|
print(f"\n{'='*60}")
|
|
print(f"분석: {url.split('/')[-1].split('?')[0]}")
|
|
print('='*60)
|
|
|
|
resp = session.get(url)
|
|
content = resp.text
|
|
|
|
# 장바구니/주문 관련 함수 찾기
|
|
patterns = [
|
|
(r'function\s+(fn\w*Cart\w*|add\w*Cart\w*|insert\w*Order\w*)\s*\([^)]*\)', 'function'),
|
|
(r'(fn\w*Cart\w*|add\w*Cart\w*)\s*=\s*function', 'var function'),
|
|
(r'url\s*:\s*["\']([^"\']*(?:Cart|Order|Add)[^"\']*)["\']', 'ajax url'),
|
|
(r'\$\.(?:ajax|post|get)\s*\(\s*["\']([^"\']+)["\']', 'ajax call'),
|
|
]
|
|
|
|
found = {}
|
|
for pattern, name in patterns:
|
|
matches = re.findall(pattern, content, re.IGNORECASE)
|
|
if matches:
|
|
for m in matches:
|
|
if m not in found:
|
|
found[m] = name
|
|
|
|
for item, ptype in found.items():
|
|
print(f"[{ptype}] {item}")
|
|
|
|
# InsertOrder 함수 찾기
|
|
if 'InsertOrder' in content or 'insertOrder' in content:
|
|
print("\n--- InsertOrder 함수 발견! ---")
|
|
# 해당 부분 추출
|
|
idx = content.lower().find('insertorder')
|
|
if idx > 0:
|
|
snippet = content[max(0, idx-100):idx+500]
|
|
print(snippet[:600])
|
|
|
|
# AddCart 패턴 찾기
|
|
add_patterns = re.findall(r'.{50}AddCart.{100}|.{50}addCart.{100}', content, re.IGNORECASE)
|
|
if add_patterns:
|
|
print("\n--- AddCart 관련 ---")
|
|
for p in add_patterns[:3]:
|
|
print(p)
|
|
|
|
# ajax 호출 상세
|
|
ajax_pattern = r'\$\.ajax\s*\(\s*\{[^}]{50,500}(Cart|Order)[^}]{0,200}\}'
|
|
ajax_matches = re.findall(ajax_pattern, content, re.IGNORECASE | re.DOTALL)
|
|
if ajax_matches:
|
|
print(f"\n--- AJAX 호출 {len(ajax_matches)}개 발견 ---")
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(download_and_analyze())
|