Post

크롬 웹 스토어 확장을 다운로드해보자

웹 스토어 확장을 CRX로 내려받아 폴더로 풀어 셀레니움에 올릴 수 있게 만들어보자

크롬 웹 스토어 확장을 다운로드해보자

크롬 웹 스토어 확장을 다운로드해보자

웹 스토어 확장을 CRX로 내려받아 폴더로 풀어, 셀레니움 --load-extension에 바로 올릴 수 있게 만들어보자.

1. 서론 (Introduction)

  • 문제/상황 (Problem):
    • 웹 스토어는 브라우저 설치 버튼만 제공한다. 셀레니움 자동화에 확장을 쓰려면 압축 해제된 확장 폴더가 필요한데, 그 폴더를 손에 넣을 방법이 마땅치 않다.
  • 목적 (Purpose):
    • 확장 ID만으로 CRX를 내려받아 폴더로 풀어, 자동화 드라이버에 그대로 넘길 수 있는 도구를 만든다.
  • 대상 (Target Audience):
    • 셀레니움에 특정 확장(차단기·VPN·수집 도우미 등)을 올려 자동화하려는 개발자

2. 방법 및 과정 (Methods & Process)

  • 배경 조사 및 데이터 (Data Collection):
    • 웹 스토어는 비공식 update2 엔드포인트로 CRX를 직접 내려준다. CRX는 헤더 뒤에 ZIP이 붙은 형식이라, 헤더만 건너뛰면 일반 ZIP처럼 풀린다.
단계설명
ID 추출웹 스토어 URL에서 32자(a~p) 확장 ID를 뽑는다
CRX 다운로드update2 엔드포인트에 prodversion을 충분히 높여 요청한다
CRX → ZIP매직(Cr24)·버전 확인 후 헤더 길이만큼 건너뛴다
압축 해제남은 ZIP 본문을 폴더로 풀어 --load-extension에 사용
  • 접근 방법 (Approach Methods):
    • [방법 1]: update2 엔드포인트에 redirect 응답으로 CRX를 받는다. prodversion이 낮으면 204(No Content)가 오므로 충분히 높게 둔다.
    • [방법 2]: CRX2와 CRX3는 헤더 구조가 다르므로 버전을 읽어 오프셋을 계산한 뒤 ZIP 본문만 추출한다.
  • 분석 및 해결 프로세스 (Analysis Flow):
    • 도구/기술: Python, requests, zipfile, struct
    • 주요 단계: ID 추출 $\rightarrow$ CRX 다운로드 $\rightarrow$ CRX 헤더 건너뛰기 $\rightarrow$ ZIP 압축 해제 $\rightarrow$ manifest 확인
    • 결과 도출 및 검증: 공개 확장(uBlock Origin Lite)을 받아 9.9MB CRX를 내려받고, CRX3 헤더를 건너뛰어 압축 해제한 뒤 manifest.json(version 2026.625.2148)을 읽는 데 성공했다.

3. 결과 (Results)

  • 분석 결과 요약:
    • 확장 ID 하나로 압축 해제된 확장 폴더를 얻어, 셀레니움 드라이버에 extensions=[폴더]로 넘길 준비가 끝났다.
    • CRX2·CRX3를 모두 처리하므로 최신 확장에도 동작한다.

4. 인사이트 및 액션 (Insights & Action)

  • 인사이트 (Insight):
    • 비공식 엔드포인트는 prodversion이 낮으면 조용히 204를 돌려준다. 빈 응답을 받으면 버전부터 의심한다.
    • CRX는 단순 ZIP이 아니라 헤더가 붙은 형식이다. 옛 코드처럼 4바이트만 건너뛰면 CRX3에서 깨지므로 버전별 오프셋을 계산해야 한다.
  • 실행 방안 (Action Plan):
    • 자동화에 필요한 확장은 미리 이 도구로 받아 폴더로 보관하고, 드라이버 생성 시 경로만 넘긴다.
  • 한 줄 결론 (Key Takeaway):
    • 확장 ID만 있으면 CRX를 받아 폴더로 풀어 셀레니움에 올릴 수 있다. 샘플 코드
  • 다음 스텝 (Next Step):
    • 이렇게 받은 VPN 확장을 셀레니움에 올려, 국가를 골라 우회 IP가 바뀌는지 확인해보자.
This post is licensed under CC BY 4.0 by the author.