termux-playwright 1.61.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- termux_playwright-1.61.0/PKG-INFO +69 -0
- termux_playwright-1.61.0/README.md +47 -0
- termux_playwright-1.61.0/setup.cfg +4 -0
- termux_playwright-1.61.0/setup.py +39 -0
- termux_playwright-1.61.0/termux_playwright/__init__.py +2 -0
- termux_playwright-1.61.0/termux_playwright/installer.py +69 -0
- termux_playwright-1.61.0/termux_playwright.egg-info/PKG-INFO +69 -0
- termux_playwright-1.61.0/termux_playwright.egg-info/SOURCES.txt +8 -0
- termux_playwright-1.61.0/termux_playwright.egg-info/dependency_links.txt +1 -0
- termux_playwright-1.61.0/termux_playwright.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: termux-playwright
|
|
3
|
+
Version: 1.61.0
|
|
4
|
+
Summary: Automated Playwright installer for Android Termux (aarch64)
|
|
5
|
+
Home-page: https://github.com/uno-km/termux-playwright-demo
|
|
6
|
+
Author: uno-km (쌩초보코딩단)
|
|
7
|
+
Author-email: hosequelbo@gmail.com
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Requires-Python: >=3.8
|
|
13
|
+
Description-Content-Type: text/markdown
|
|
14
|
+
Dynamic: author
|
|
15
|
+
Dynamic: author-email
|
|
16
|
+
Dynamic: classifier
|
|
17
|
+
Dynamic: description
|
|
18
|
+
Dynamic: description-content-type
|
|
19
|
+
Dynamic: home-page
|
|
20
|
+
Dynamic: requires-python
|
|
21
|
+
Dynamic: summary
|
|
22
|
+
|
|
23
|
+
# Termux-Playwright Automated Integration (S7 Edge Crawler)
|
|
24
|
+
|
|
25
|
+
## 1. 개요 (Overview)
|
|
26
|
+
본 프로젝트는 자원이 제한적인 안드로이드 디바이스(Samsung Galaxy S7)의 가상 리눅스 환경(Termux)에서 최신 동적 웹 스크래핑 프레임워크인 **Playwright**를 구동하기 위한 인프라 구축 및 자동화 데모 프로젝트입니다.
|
|
27
|
+
일반적으로 aarch64 안드로이드 환경에서는 공식 Playwright 바이너리가 호환되지 않아 구동이 불가능하지만, 본 프로젝트는 의존성 우회 설치 및 코어 엔진 패치를 통해 이 한계를 극복하고 24/7 무인 자동화 데이터 수집(Crawling)을 가능하게 합니다.
|
|
28
|
+
|
|
29
|
+
## 2. 기술 (Technology Stack)
|
|
30
|
+
* **OS & Environment**: Android 8.0 (Termux), Linux (aarch64)
|
|
31
|
+
* **Language**: Python 3.11+, Node.js (v20+)
|
|
32
|
+
* **Framework**: Playwright (Async API)
|
|
33
|
+
* **Browser**: Chromium (Termux native package)
|
|
34
|
+
* **Infrastructure**: Bash Shell Scripting (`node_manager.sh`)
|
|
35
|
+
|
|
36
|
+
## 3. 로직 (Architecture & Logic)
|
|
37
|
+
본 시스템은 안드로이드 아키텍처의 한계를 우회하기 위해 다음과 같은 3단계 핵심 로직으로 구성됩니다.
|
|
38
|
+
|
|
39
|
+
1. **의존성(Dependency) 속임수 기법 (Wheel Renaming)**
|
|
40
|
+
- PyPI에서 제공하는 `manylinux_2_17_aarch64` 규격의 Playwright 휠(Wheel) 파일을 강제로 다운로드합니다.
|
|
41
|
+
- 단말기의 OS 종속성 검사를 피하기 위해 파일명을 `none-any.whl`로 변조하여 강제 설치(`--force-reinstall --no-deps`)를 수행합니다.
|
|
42
|
+
|
|
43
|
+
2. **코어 엔진 런타임 패치 (Runtime Injection)**
|
|
44
|
+
- Playwright 내부의 Node.js 구동 엔진(`coreBundle.js`)은 시스템 환경이 `android`로 식별될 경우 즉시 `process.exit(1)`을 호출하여 실행을 중단합니다.
|
|
45
|
+
- Python 스크립트를 통해 `coreBundle.js` 내부 최상단에 `Object.defineProperty(process, "platform", {value: "linux"});` 코드를 주입(Inject)하여 플랫폼 검증 로직을 무력화합니다.
|
|
46
|
+
|
|
47
|
+
3. **환경 변수 매핑 및 브라우저 샌드박스 비활성화**
|
|
48
|
+
- Playwright가 내장 브라우저가 아닌 Termux 패키지의 순정 Chromium(`PLAYWRIGHT_CHROMIUM_PATH`)과 Node.js(`PLAYWRIGHT_NODEJS_PATH`)를 사용하도록 환경변수를 바인딩합니다.
|
|
49
|
+
- 런타임 실행 시 안드로이드 커널과의 충돌을 방지하기 위해 샌드박스 해제 플래그(`--no-sandbox`, `--disable-setuid-sandbox`)를 반드시 포함합니다.
|
|
50
|
+
|
|
51
|
+
## 4. 트러블슈팅 및 롤백 히스토리 (History of Failures)
|
|
52
|
+
본 인프라가 안정화되기까지 겪었던 기술적 실패와 해결 과정의 기록입니다.
|
|
53
|
+
|
|
54
|
+
* **[실패 1] 순정 `pip install playwright` 시도**
|
|
55
|
+
- **현상**: 컴파일 에러 및 브라우저 바이너리 다운로드 실패.
|
|
56
|
+
- **원인**: Playwright가 지원하는 aarch64 빌드는 Ubuntu/Debian 베이스를 상정하며, 안드로이드 Bionic libc와 호환되지 않음.
|
|
57
|
+
- **해결**: Termux 패키지 관리자(`pkg`)가 제공하는 네이티브 `chromium`을 사용하도록 경로를 수동 할당함.
|
|
58
|
+
|
|
59
|
+
* **[실패 2] Node.js 실행 거부 (Platform Exception)**
|
|
60
|
+
- **현상**: Python 스크립트 실행 시 `Error: Unsupported platform: android` 발생 후 크래시.
|
|
61
|
+
- **원인**: Playwright의 Node.js 브릿지가 안드로이드를 식별하여 명시적으로 차단함.
|
|
62
|
+
- **해결**: 런타임 환경에서 `process.platform`을 `linux`로 강제 오버라이딩하는 자바스크립트 주입 패치 고안.
|
|
63
|
+
|
|
64
|
+
* **[실패 3] 브라우저 Launch 시 Zombie Process 생성 및 타임아웃**
|
|
65
|
+
- **현상**: 브라우저 인스턴스는 생성되나 페이지 이동이 불가능하고 30초 후 타임아웃 됨.
|
|
66
|
+
- **원인**: 안드로이드 OS 커널의 권한 통제 메커니즘이 Chromium의 샌드박스(Sandbox) 프로세스 생성을 차단함.
|
|
67
|
+
- **해결**: Launch Args에 `--no-sandbox` 및 `--disable-setuid-sandbox` 플래그를 추가하여 권한 충돌 해소.
|
|
68
|
+
|
|
69
|
+
이러한 수많은 시행착오 끝에, 단일 스크립트(`node_manager.sh`) 실행만으로 안드로이드 디바이스를 완전한 무인 크롤링 서버로 변환할 수 있는 파이프라인이 완성되었습니다.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Termux-Playwright Automated Integration (S7 Edge Crawler)
|
|
2
|
+
|
|
3
|
+
## 1. 개요 (Overview)
|
|
4
|
+
본 프로젝트는 자원이 제한적인 안드로이드 디바이스(Samsung Galaxy S7)의 가상 리눅스 환경(Termux)에서 최신 동적 웹 스크래핑 프레임워크인 **Playwright**를 구동하기 위한 인프라 구축 및 자동화 데모 프로젝트입니다.
|
|
5
|
+
일반적으로 aarch64 안드로이드 환경에서는 공식 Playwright 바이너리가 호환되지 않아 구동이 불가능하지만, 본 프로젝트는 의존성 우회 설치 및 코어 엔진 패치를 통해 이 한계를 극복하고 24/7 무인 자동화 데이터 수집(Crawling)을 가능하게 합니다.
|
|
6
|
+
|
|
7
|
+
## 2. 기술 (Technology Stack)
|
|
8
|
+
* **OS & Environment**: Android 8.0 (Termux), Linux (aarch64)
|
|
9
|
+
* **Language**: Python 3.11+, Node.js (v20+)
|
|
10
|
+
* **Framework**: Playwright (Async API)
|
|
11
|
+
* **Browser**: Chromium (Termux native package)
|
|
12
|
+
* **Infrastructure**: Bash Shell Scripting (`node_manager.sh`)
|
|
13
|
+
|
|
14
|
+
## 3. 로직 (Architecture & Logic)
|
|
15
|
+
본 시스템은 안드로이드 아키텍처의 한계를 우회하기 위해 다음과 같은 3단계 핵심 로직으로 구성됩니다.
|
|
16
|
+
|
|
17
|
+
1. **의존성(Dependency) 속임수 기법 (Wheel Renaming)**
|
|
18
|
+
- PyPI에서 제공하는 `manylinux_2_17_aarch64` 규격의 Playwright 휠(Wheel) 파일을 강제로 다운로드합니다.
|
|
19
|
+
- 단말기의 OS 종속성 검사를 피하기 위해 파일명을 `none-any.whl`로 변조하여 강제 설치(`--force-reinstall --no-deps`)를 수행합니다.
|
|
20
|
+
|
|
21
|
+
2. **코어 엔진 런타임 패치 (Runtime Injection)**
|
|
22
|
+
- Playwright 내부의 Node.js 구동 엔진(`coreBundle.js`)은 시스템 환경이 `android`로 식별될 경우 즉시 `process.exit(1)`을 호출하여 실행을 중단합니다.
|
|
23
|
+
- Python 스크립트를 통해 `coreBundle.js` 내부 최상단에 `Object.defineProperty(process, "platform", {value: "linux"});` 코드를 주입(Inject)하여 플랫폼 검증 로직을 무력화합니다.
|
|
24
|
+
|
|
25
|
+
3. **환경 변수 매핑 및 브라우저 샌드박스 비활성화**
|
|
26
|
+
- Playwright가 내장 브라우저가 아닌 Termux 패키지의 순정 Chromium(`PLAYWRIGHT_CHROMIUM_PATH`)과 Node.js(`PLAYWRIGHT_NODEJS_PATH`)를 사용하도록 환경변수를 바인딩합니다.
|
|
27
|
+
- 런타임 실행 시 안드로이드 커널과의 충돌을 방지하기 위해 샌드박스 해제 플래그(`--no-sandbox`, `--disable-setuid-sandbox`)를 반드시 포함합니다.
|
|
28
|
+
|
|
29
|
+
## 4. 트러블슈팅 및 롤백 히스토리 (History of Failures)
|
|
30
|
+
본 인프라가 안정화되기까지 겪었던 기술적 실패와 해결 과정의 기록입니다.
|
|
31
|
+
|
|
32
|
+
* **[실패 1] 순정 `pip install playwright` 시도**
|
|
33
|
+
- **현상**: 컴파일 에러 및 브라우저 바이너리 다운로드 실패.
|
|
34
|
+
- **원인**: Playwright가 지원하는 aarch64 빌드는 Ubuntu/Debian 베이스를 상정하며, 안드로이드 Bionic libc와 호환되지 않음.
|
|
35
|
+
- **해결**: Termux 패키지 관리자(`pkg`)가 제공하는 네이티브 `chromium`을 사용하도록 경로를 수동 할당함.
|
|
36
|
+
|
|
37
|
+
* **[실패 2] Node.js 실행 거부 (Platform Exception)**
|
|
38
|
+
- **현상**: Python 스크립트 실행 시 `Error: Unsupported platform: android` 발생 후 크래시.
|
|
39
|
+
- **원인**: Playwright의 Node.js 브릿지가 안드로이드를 식별하여 명시적으로 차단함.
|
|
40
|
+
- **해결**: 런타임 환경에서 `process.platform`을 `linux`로 강제 오버라이딩하는 자바스크립트 주입 패치 고안.
|
|
41
|
+
|
|
42
|
+
* **[실패 3] 브라우저 Launch 시 Zombie Process 생성 및 타임아웃**
|
|
43
|
+
- **현상**: 브라우저 인스턴스는 생성되나 페이지 이동이 불가능하고 30초 후 타임아웃 됨.
|
|
44
|
+
- **원인**: 안드로이드 OS 커널의 권한 통제 메커니즘이 Chromium의 샌드박스(Sandbox) 프로세스 생성을 차단함.
|
|
45
|
+
- **해결**: Launch Args에 `--no-sandbox` 및 `--disable-setuid-sandbox` 플래그를 추가하여 권한 충돌 해소.
|
|
46
|
+
|
|
47
|
+
이러한 수많은 시행착오 끝에, 단일 스크립트(`node_manager.sh`) 실행만으로 안드로이드 디바이스를 완전한 무인 크롤링 서버로 변환할 수 있는 파이프라인이 완성되었습니다.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
from setuptools import setup, find_packages
|
|
2
|
+
from setuptools.command.install import install
|
|
3
|
+
import sys
|
|
4
|
+
import os
|
|
5
|
+
|
|
6
|
+
class TermuxInstallCommand(install):
|
|
7
|
+
def run(self):
|
|
8
|
+
# 1. 일반적인 설치 진행
|
|
9
|
+
install.run(self)
|
|
10
|
+
|
|
11
|
+
# 2. 패키지가 설치된 경로를 찾아서 커스텀 설치 스크립트 실행
|
|
12
|
+
try:
|
|
13
|
+
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
14
|
+
from termux_playwright.installer import run_post_install
|
|
15
|
+
run_post_install()
|
|
16
|
+
except Exception as e:
|
|
17
|
+
print(f"[!] Termux 커스텀 설치 로직 실행 중 에러 발생 (무시됨): {e}")
|
|
18
|
+
|
|
19
|
+
setup(
|
|
20
|
+
name="termux-playwright",
|
|
21
|
+
version="1.61.0",
|
|
22
|
+
description="Automated Playwright installer for Android Termux (aarch64)",
|
|
23
|
+
long_description=open("README.md", encoding="utf-8").read(),
|
|
24
|
+
long_description_content_type="text/markdown",
|
|
25
|
+
author="uno-km (쌩초보코딩단)",
|
|
26
|
+
author_email="hosequelbo@gmail.com",
|
|
27
|
+
url="https://github.com/uno-km/termux-playwright-demo",
|
|
28
|
+
packages=find_packages(),
|
|
29
|
+
cmdclass={
|
|
30
|
+
'install': TermuxInstallCommand,
|
|
31
|
+
},
|
|
32
|
+
classifiers=[
|
|
33
|
+
"Programming Language :: Python :: 3",
|
|
34
|
+
"License :: OSI Approved :: MIT License",
|
|
35
|
+
"Operating System :: POSIX :: Linux",
|
|
36
|
+
"Environment :: Console",
|
|
37
|
+
],
|
|
38
|
+
python_requires=">=3.8",
|
|
39
|
+
)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import sys
|
|
3
|
+
import subprocess
|
|
4
|
+
import urllib.request
|
|
5
|
+
import site
|
|
6
|
+
|
|
7
|
+
def run_post_install():
|
|
8
|
+
print("="*50)
|
|
9
|
+
print("[RUN] Termux-Playwright (aarch64) 자동 설치 시작...")
|
|
10
|
+
print("="*50)
|
|
11
|
+
|
|
12
|
+
# 1. Termux 환경 확인
|
|
13
|
+
if "com.termux" not in os.environ.get("PREFIX", ""):
|
|
14
|
+
print("[!] 현재 환경이 Termux가 아닙니다. 기본 Playwright 설치로 진행합니다.")
|
|
15
|
+
os.system(f"{sys.executable} -m pip install playwright==1.61.0")
|
|
16
|
+
return
|
|
17
|
+
|
|
18
|
+
# 2. 시스템 패키지 설치 (chromium, nodejs)
|
|
19
|
+
print("[1/4] 기본 시스템 패키지(Chromium, Node.js) 설치 중...")
|
|
20
|
+
subprocess.run(["pkg", "install", "-y", "chromium", "nodejs"], check=False)
|
|
21
|
+
|
|
22
|
+
# 3. 우회 휠 다운로드 및 설치
|
|
23
|
+
print("[2/4] Playwright 1.61.0 휠 다운로드 및 우회 설치 중...")
|
|
24
|
+
whl_original = "playwright-1.61.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl"
|
|
25
|
+
whl_renamed = "playwright-1.61.0-py3-none-any.whl"
|
|
26
|
+
url = "https://files.pythonhosted.org/packages/b7/eb/e3f922348ec17c315f98c463f72faa1181a1c3de0bfe31a8d2edf6561723/" + whl_original
|
|
27
|
+
|
|
28
|
+
try:
|
|
29
|
+
if not os.path.exists(whl_renamed):
|
|
30
|
+
urllib.request.urlretrieve(url, whl_renamed)
|
|
31
|
+
os.system(f"{sys.executable} -m pip install {whl_renamed} --force-reinstall --no-deps -q")
|
|
32
|
+
os.remove(whl_renamed)
|
|
33
|
+
except Exception as e:
|
|
34
|
+
print(f"[X] 휠 다운로드 또는 설치 실패: {e}")
|
|
35
|
+
return
|
|
36
|
+
|
|
37
|
+
# 4. 일반 패키지 종속성 해결
|
|
38
|
+
print("[3/4] 파이썬 의존성 패키지 설치 중...")
|
|
39
|
+
os.system(f"{sys.executable} -m pip install greenlet pyee")
|
|
40
|
+
|
|
41
|
+
# 5. coreBundle.js 자동 패치 (안드로이드 차단 우회)
|
|
42
|
+
print("[4/4] Playwright 안드로이드 차단 우회(coreBundle.js) 패치 중...")
|
|
43
|
+
try:
|
|
44
|
+
site_packages = [p for p in site.getsitepackages() if os.path.isdir(p)][0]
|
|
45
|
+
core_bundle = os.path.join(site_packages, "playwright", "driver", "package", "lib", "coreBundle.js")
|
|
46
|
+
|
|
47
|
+
if os.path.exists(core_bundle):
|
|
48
|
+
with open(core_bundle, 'r', encoding='utf-8') as f:
|
|
49
|
+
content = f.read()
|
|
50
|
+
|
|
51
|
+
injection = 'Object.defineProperty(process, "platform", {value: "linux"});\nObject.defineProperty(require("os"), "platform", {value: () => "linux"});\n'
|
|
52
|
+
|
|
53
|
+
if injection.split('\n')[0] not in content:
|
|
54
|
+
with open(core_bundle, 'w', encoding='utf-8') as f:
|
|
55
|
+
f.write(injection + content)
|
|
56
|
+
print("[OK] coreBundle.js 패치 성공!")
|
|
57
|
+
else:
|
|
58
|
+
print("[OK] 이미 패치되어 있습니다.")
|
|
59
|
+
else:
|
|
60
|
+
print(f"[!] coreBundle.js 파일을 찾을 수 없습니다: {core_bundle}")
|
|
61
|
+
except Exception as e:
|
|
62
|
+
print(f"[X] 패치 적용 실패: {e}")
|
|
63
|
+
|
|
64
|
+
print("\n[SUCCESS] 모든 설치가 완료되었습니다!")
|
|
65
|
+
print("[NOTICE] 사용하실 때 파이썬 코드에서 os.environ['PLAYWRIGHT_CHROMIUM_PATH']를 반드시 지정해 주세요.")
|
|
66
|
+
print("="*50 + "\n")
|
|
67
|
+
|
|
68
|
+
if __name__ == "__main__":
|
|
69
|
+
run_post_install()
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: termux-playwright
|
|
3
|
+
Version: 1.61.0
|
|
4
|
+
Summary: Automated Playwright installer for Android Termux (aarch64)
|
|
5
|
+
Home-page: https://github.com/uno-km/termux-playwright-demo
|
|
6
|
+
Author: uno-km (쌩초보코딩단)
|
|
7
|
+
Author-email: hosequelbo@gmail.com
|
|
8
|
+
Classifier: Programming Language :: Python :: 3
|
|
9
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
10
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Requires-Python: >=3.8
|
|
13
|
+
Description-Content-Type: text/markdown
|
|
14
|
+
Dynamic: author
|
|
15
|
+
Dynamic: author-email
|
|
16
|
+
Dynamic: classifier
|
|
17
|
+
Dynamic: description
|
|
18
|
+
Dynamic: description-content-type
|
|
19
|
+
Dynamic: home-page
|
|
20
|
+
Dynamic: requires-python
|
|
21
|
+
Dynamic: summary
|
|
22
|
+
|
|
23
|
+
# Termux-Playwright Automated Integration (S7 Edge Crawler)
|
|
24
|
+
|
|
25
|
+
## 1. 개요 (Overview)
|
|
26
|
+
본 프로젝트는 자원이 제한적인 안드로이드 디바이스(Samsung Galaxy S7)의 가상 리눅스 환경(Termux)에서 최신 동적 웹 스크래핑 프레임워크인 **Playwright**를 구동하기 위한 인프라 구축 및 자동화 데모 프로젝트입니다.
|
|
27
|
+
일반적으로 aarch64 안드로이드 환경에서는 공식 Playwright 바이너리가 호환되지 않아 구동이 불가능하지만, 본 프로젝트는 의존성 우회 설치 및 코어 엔진 패치를 통해 이 한계를 극복하고 24/7 무인 자동화 데이터 수집(Crawling)을 가능하게 합니다.
|
|
28
|
+
|
|
29
|
+
## 2. 기술 (Technology Stack)
|
|
30
|
+
* **OS & Environment**: Android 8.0 (Termux), Linux (aarch64)
|
|
31
|
+
* **Language**: Python 3.11+, Node.js (v20+)
|
|
32
|
+
* **Framework**: Playwright (Async API)
|
|
33
|
+
* **Browser**: Chromium (Termux native package)
|
|
34
|
+
* **Infrastructure**: Bash Shell Scripting (`node_manager.sh`)
|
|
35
|
+
|
|
36
|
+
## 3. 로직 (Architecture & Logic)
|
|
37
|
+
본 시스템은 안드로이드 아키텍처의 한계를 우회하기 위해 다음과 같은 3단계 핵심 로직으로 구성됩니다.
|
|
38
|
+
|
|
39
|
+
1. **의존성(Dependency) 속임수 기법 (Wheel Renaming)**
|
|
40
|
+
- PyPI에서 제공하는 `manylinux_2_17_aarch64` 규격의 Playwright 휠(Wheel) 파일을 강제로 다운로드합니다.
|
|
41
|
+
- 단말기의 OS 종속성 검사를 피하기 위해 파일명을 `none-any.whl`로 변조하여 강제 설치(`--force-reinstall --no-deps`)를 수행합니다.
|
|
42
|
+
|
|
43
|
+
2. **코어 엔진 런타임 패치 (Runtime Injection)**
|
|
44
|
+
- Playwright 내부의 Node.js 구동 엔진(`coreBundle.js`)은 시스템 환경이 `android`로 식별될 경우 즉시 `process.exit(1)`을 호출하여 실행을 중단합니다.
|
|
45
|
+
- Python 스크립트를 통해 `coreBundle.js` 내부 최상단에 `Object.defineProperty(process, "platform", {value: "linux"});` 코드를 주입(Inject)하여 플랫폼 검증 로직을 무력화합니다.
|
|
46
|
+
|
|
47
|
+
3. **환경 변수 매핑 및 브라우저 샌드박스 비활성화**
|
|
48
|
+
- Playwright가 내장 브라우저가 아닌 Termux 패키지의 순정 Chromium(`PLAYWRIGHT_CHROMIUM_PATH`)과 Node.js(`PLAYWRIGHT_NODEJS_PATH`)를 사용하도록 환경변수를 바인딩합니다.
|
|
49
|
+
- 런타임 실행 시 안드로이드 커널과의 충돌을 방지하기 위해 샌드박스 해제 플래그(`--no-sandbox`, `--disable-setuid-sandbox`)를 반드시 포함합니다.
|
|
50
|
+
|
|
51
|
+
## 4. 트러블슈팅 및 롤백 히스토리 (History of Failures)
|
|
52
|
+
본 인프라가 안정화되기까지 겪었던 기술적 실패와 해결 과정의 기록입니다.
|
|
53
|
+
|
|
54
|
+
* **[실패 1] 순정 `pip install playwright` 시도**
|
|
55
|
+
- **현상**: 컴파일 에러 및 브라우저 바이너리 다운로드 실패.
|
|
56
|
+
- **원인**: Playwright가 지원하는 aarch64 빌드는 Ubuntu/Debian 베이스를 상정하며, 안드로이드 Bionic libc와 호환되지 않음.
|
|
57
|
+
- **해결**: Termux 패키지 관리자(`pkg`)가 제공하는 네이티브 `chromium`을 사용하도록 경로를 수동 할당함.
|
|
58
|
+
|
|
59
|
+
* **[실패 2] Node.js 실행 거부 (Platform Exception)**
|
|
60
|
+
- **현상**: Python 스크립트 실행 시 `Error: Unsupported platform: android` 발생 후 크래시.
|
|
61
|
+
- **원인**: Playwright의 Node.js 브릿지가 안드로이드를 식별하여 명시적으로 차단함.
|
|
62
|
+
- **해결**: 런타임 환경에서 `process.platform`을 `linux`로 강제 오버라이딩하는 자바스크립트 주입 패치 고안.
|
|
63
|
+
|
|
64
|
+
* **[실패 3] 브라우저 Launch 시 Zombie Process 생성 및 타임아웃**
|
|
65
|
+
- **현상**: 브라우저 인스턴스는 생성되나 페이지 이동이 불가능하고 30초 후 타임아웃 됨.
|
|
66
|
+
- **원인**: 안드로이드 OS 커널의 권한 통제 메커니즘이 Chromium의 샌드박스(Sandbox) 프로세스 생성을 차단함.
|
|
67
|
+
- **해결**: Launch Args에 `--no-sandbox` 및 `--disable-setuid-sandbox` 플래그를 추가하여 권한 충돌 해소.
|
|
68
|
+
|
|
69
|
+
이러한 수많은 시행착오 끝에, 단일 스크립트(`node_manager.sh`) 실행만으로 안드로이드 디바이스를 완전한 무인 크롤링 서버로 변환할 수 있는 파이프라인이 완성되었습니다.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
termux_playwright
|