From 912098b66d3d6dbde71d6b72bf8bae1f29106dda Mon Sep 17 00:00:00 2001 From: Claude-51124 Date: Thu, 18 Sep 2025 23:00:00 +0900 Subject: [PATCH 1/3] =?UTF-8?q?docs:=20skill-publish=20reCAPTCHA=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=8B=A4=ED=8C=A8=20=ED=8A=B8?= =?UTF-8?q?=EB=9F=AC=EB=B8=94=EC=8A=88=ED=8C=85=20=EB=AC=B8=EC=84=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Squarespace 로그인 시 reCAPTCHA v3가 Headless 브라우저를 봇으로 감지 - playwright-stealth 라이브러리 사용 시도 및 실패 경험 문서화 - 수동 stealth 스크립트 적용 등 해결 방안 제시 --- ...e_skill-publish_reCAPTCHA_login_failure.md | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 troubleshooting/250918_claude_skill-publish_reCAPTCHA_login_failure.md diff --git a/troubleshooting/250918_claude_skill-publish_reCAPTCHA_login_failure.md b/troubleshooting/250918_claude_skill-publish_reCAPTCHA_login_failure.md new file mode 100644 index 0000000..51bdfa0 --- /dev/null +++ b/troubleshooting/250918_claude_skill-publish_reCAPTCHA_login_failure.md @@ -0,0 +1,111 @@ +# Skill-Publish Squarespace 로그인 실패 문제 + +## 작성일 +2025-09-18 + +## 작성자 +claude + +## 문제 상황 +skill-publish 서비스가 Squarespace에 자동 로그인을 시도할 때 지속적으로 실패하는 문제 발생. + +### 증상 +1. 로그인 버튼 클릭 후 페이지 전환 없음 +2. OAuth 리다이렉션 페이지에서 멈춤 +3. 로그: "CAPTCHA 감지됨!" +4. 실제로는 "The username or password is incorrect" 에러 표시 + +### 로그 분석 +``` +13:33:04 - 이메일 입력: sig*** +13:33:04 - 패스워드 입력 +13:33:05 - 로그인 버튼 클릭 +13:33:05 - OAuth 리다이렉션 페이지 상태 확인을 위해 15초 대기... +13:33:20 - 현재 URL: https://login.squarespace.com/api/1/login/oauth/provider/authorize?... +13:33:20 - CAPTCHA 감지됨! +13:33:55 - Account Dashboard 대기 시간 초과 +``` + +## 원인 분석 + +### 근본 원인: reCAPTCHA v3 차단 +Squarespace 로그인 페이지 하단에 "Secure Login with reCAPTCHA subject to Google Terms & Privacy" 문구 확인. + +### 상세 분석 +1. **reCAPTCHA가 Headless 브라우저를 봇으로 감지** + - Playwright의 Headless 모드는 일반 브라우저와 다른 특징들을 가짐 + - navigator.webdriver 속성 등으로 자동화 도구 감지 + +2. **보안 메시지 위장** + - reCAPTCHA는 봇 감지 시 "CAPTCHA 실패"라고 직접 알리지 않음 + - 대신 "아이디/패스워드 오류" 메시지로 위장 + - 봇에게 탐지 사실을 숨기기 위한 보안 전략 + +3. **코드의 잘못된 CAPTCHA 감지** + - 코드: `if await page.locator('text=/captcha/i').count() > 0` + - 페이지 하단의 "reCAPTCHA" 안내 문구를 CAPTCHA로 오인 + - 실제 CAPTCHA 챌린지는 없음 + +## 시도한 해결책 + +### 1. playwright-stealth 라이브러리 (실패) +- pyproject.toml에 추가하고 stealth_async 적용 +- 문제: 최신 버전이 stealth_async 함수를 제공하지 않음 +- 라이브러리가 2023년 3월 이후 업데이트 중단 (unmaintained) + +### 2. 환경변수 확인 +- .env 파일의 따옴표 처리 확인 +- Docker Compose가 자동으로 따옴표 제거 +- 결과: 환경변수는 정상적으로 읽힘 + +## 해결 방안 + +### 1. 단기 해결책 - Headless 모드 비활성화 +```python +# docker-compose.yml +environment: + - HEADLESS_BROWSER=false +``` +- 실제 브라우저 UI를 표시하여 reCAPTCHA 우회 +- 단점: 서버 환경에서는 사용 불가 + +### 2. 중기 해결책 - 수동 Stealth 스크립트 적용 +```python +# publisher_service.py에 추가 +stealth_script = """ + Object.defineProperty(navigator, 'webdriver', { + get: () => undefined, + }); + Object.defineProperty(navigator, 'languages', { + get: () => ['ko-KR', 'ko'], + }); + Object.defineProperty(navigator, 'plugins', { + get: () => [1, 2, 3, 4, 5], + }); +""" + +# 브라우저 페이지 생성 후 +await page.add_init_script(stealth_script) +``` + +### 3. 장기 해결책 - API 기반 접근 +- Squarespace API 사용 가능성 조사 +- 또는 수동 로그인 후 세션 쿠키 재사용 + +## 교훈 +1. **자동화 탐지 기술의 발전** + - 최신 웹사이트들은 정교한 봇 탐지 시스템 사용 + - Headless 브라우저만으로는 한계 존재 + +2. **에러 메시지 신뢰 불가** + - "패스워드 오류"가 실제 패스워드 문제가 아닐 수 있음 + - 보안 시스템의 의도적인 오도 가능성 고려 + +3. **외부 라이브러리 의존성 주의** + - playwright-stealth처럼 유지보수 중단된 라이브러리 주의 + - 핵심 기능은 공식 API 사용 권장 + +## 참고 자료 +- [Playwright 공식 문서 - add_init_script](https://playwright.dev/python/docs/api/class-page#page-add-init-script) +- [reCAPTCHA v3 작동 방식](https://developers.google.com/recaptcha/docs/v3) +- [Puppeteer Extra Plugin Stealth](https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin-stealth) \ No newline at end of file From 93871d5add6bb8a6d90303decdefa4b2d565c79c Mon Sep 17 00:00:00 2001 From: Claude-51124 Date: Thu, 18 Sep 2025 23:02:39 +0900 Subject: [PATCH 2/3] =?UTF-8?q?docs:=20Xvfb=EB=A5=BC=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=9C=20=EC=84=9C=EB=B2=84=20=ED=99=98=EA=B2=BD=20=ED=95=B4?= =?UTF-8?q?=EA=B2=B0=EC=B1=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 가상 디스플레이(Xvfb)를 사용하여 서버에서 GUI 브라우저 실행 - HEADLESS_BROWSER=false와 함께 사용하여 reCAPTCHA 우회 --- ...e_skill-publish_reCAPTCHA_login_failure.md | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/troubleshooting/250918_claude_skill-publish_reCAPTCHA_login_failure.md b/troubleshooting/250918_claude_skill-publish_reCAPTCHA_login_failure.md index 51bdfa0..feb274e 100644 --- a/troubleshooting/250918_claude_skill-publish_reCAPTCHA_login_failure.md +++ b/troubleshooting/250918_claude_skill-publish_reCAPTCHA_login_failure.md @@ -69,6 +69,26 @@ environment: - 실제 브라우저 UI를 표시하여 reCAPTCHA 우회 - 단점: 서버 환경에서는 사용 불가 +### 1-1. 서버 환경 해결책 - Xvfb (가상 디스플레이) +```dockerfile +# Dockerfile에 추가 +RUN apt-get update && apt-get install -y \ + xvfb \ + && rm -rf /var/lib/apt/lists/* +``` + +```yaml +# docker-compose.yml 수정 +command: xvfb-run python -m uvicorn app.main:app --host 0.0.0.0 --port 8511 +environment: + - HEADLESS_BROWSER=false # 실제 브라우저 사용 +``` + +- **Xvfb(X Virtual Framebuffer)**: 가상 디스플레이 서버 +- 서버 환경에서 GUI 애플리케이션을 메모리상 가상 화면에서 실행 +- 실제 Chrome 브라우저가 가상 디스플레이에서 실행되어 reCAPTCHA 우회 +- 장점: 서버 환경에서도 GUI 브라우저 실행 가능 + ### 2. 중기 해결책 - 수동 Stealth 스크립트 적용 ```python # publisher_service.py에 추가 From 8e1daf7763516b275f70cedff3586ebc05fa386a Mon Sep 17 00:00:00 2001 From: Claude-51124 Date: Thu, 18 Sep 2025 23:21:50 +0900 Subject: [PATCH 3/3] =?UTF-8?q?docs:=20Xvfb=20=EC=A0=81=EC=9A=A9=20?= =?UTF-8?q?=EC=84=B1=EA=B3=B5=20=EA=B2=B0=EA=B3=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 14:18:13 로그인 성공 확인 - 전체 게시 프로세스 정상 작동 - reCAPTCHA 우회 성공 사례 문서화 --- ...e_skill-publish_reCAPTCHA_login_failure.md | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/troubleshooting/250918_claude_skill-publish_reCAPTCHA_login_failure.md b/troubleshooting/250918_claude_skill-publish_reCAPTCHA_login_failure.md index feb274e..2e87dc1 100644 --- a/troubleshooting/250918_claude_skill-publish_reCAPTCHA_login_failure.md +++ b/troubleshooting/250918_claude_skill-publish_reCAPTCHA_login_failure.md @@ -112,6 +112,26 @@ await page.add_init_script(stealth_script) - Squarespace API 사용 가능성 조사 - 또는 수동 로그인 후 세션 쿠키 재사용 +## 해결 결과 + +### Xvfb 적용 후 성공 로그 (2025-09-18 14:17-14:19) +``` +14:17:53 - 로그인 버튼 클릭 +14:18:08 - 현재 URL: https://account.squarespace.com/ +14:18:08 - 페이지 제목: Squarespace — Account Dashboard +14:18:13 - ✅ Squarespace 로그인 성공 - Account Dashboard 도달 +14:18:46 - 뉴스 편집 모드 진입 성공 +14:18:53 - 섹션 복제 완료 +14:19:05 - 썸네일 교체 및 링크 수정 완료 +14:19:17 - 텍스트 편집 완료 +14:19:17 - Save 버튼 클릭 성공 +``` + +**성공 요인:** +- Xvfb로 가상 디스플레이 생성 (DISPLAY=:99) +- HEADLESS_BROWSER=false로 실제 Chrome 브라우저 실행 +- reCAPTCHA가 실제 브라우저로 인식하여 차단하지 않음 + ## 교훈 1. **자동화 탐지 기술의 발전** - 최신 웹사이트들은 정교한 봇 탐지 시스템 사용