diff --git a/.github/workflows/docker-publish-beta.yml b/.github/workflows/docker-publish-beta.yml new file mode 100644 index 0000000..8fec6ac --- /dev/null +++ b/.github/workflows/docker-publish-beta.yml @@ -0,0 +1,55 @@ +name: Build and Push Beta Docker Image + +on: + push: + branches: + - beta + workflow_dispatch: + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build-and-push-beta: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=raw,value=beta + + - name: Build and push Docker image (beta) + uses: docker/build-push-action@v5 + with: + context: . + file: Dockerfile.headed + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha,scope=beta + cache-to: type=gha,mode=max,scope=beta diff --git a/.gitignore b/.gitignore index 4c133db..4e6507d 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,8 @@ tmp/ config/setting.toml config/setting_warp.toml config/setting_warp_example.toml + +# 测试文件 +test_* +tests/__pycache__/ +*.har diff --git a/Dockerfile.headed b/Dockerfile.headed index 56e2804..42d8674 100644 --- a/Dockerfile.headed +++ b/Dockerfile.headed @@ -4,24 +4,33 @@ WORKDIR /app ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ - PLAYWRIGHT_BROWSERS_PATH=0 \ - ALLOW_DOCKER_HEADED_CAPTCHA=true \ - DISPLAY=:99 \ - XVFB_WHD=1920x1080x24 + ALLOW_DOCKER_HEADED_CAPTCHA=true +# 安装 Chrome 运行依赖(无头模式仍需要这些系统库) COPY requirements.txt ./ -# 有头模式基础依赖:虚拟显示、窗口管理器。 RUN apt-get update \ && apt-get install -y --no-install-recommends \ ca-certificates \ curl \ - xvfb \ - fluxbox \ + libnss3 \ + libnspr4 \ + libatk1.0-0 \ + libatk-bridge2.0-0 \ + libcups2 \ + libdrm2 \ + libxkbcommon0 \ + libxcomposite1 \ + libxdamage1 \ + libxfixes3 \ + libxrandr2 \ + libgbm1 \ + libpango-1.0-0 \ + libcairo2 \ + libasound2 \ && rm -rf /var/lib/apt/lists/* -RUN pip install --no-cache-dir --root-user-action=ignore -r requirements.txt \ - && python -m playwright install --with-deps chromium +RUN pip install --no-cache-dir --root-user-action=ignore -r requirements.txt COPY . . COPY docker/entrypoint.headed.sh /usr/local/bin/entrypoint.headed.sh diff --git a/docker-compose.headed.yml b/docker-compose.headed.yml index dcf489d..67f6a7c 100644 --- a/docker-compose.headed.yml +++ b/docker-compose.headed.yml @@ -16,7 +16,5 @@ services: environment: - PYTHONUNBUFFERED=1 - ALLOW_DOCKER_HEADED_CAPTCHA=true - - DISPLAY=:99 - - XVFB_WHD=1920x1080x24 shm_size: "2gb" restart: unless-stopped diff --git a/docker/entrypoint.headed.sh b/docker/entrypoint.headed.sh index 706b8cc..c238bdd 100644 --- a/docker/entrypoint.headed.sh +++ b/docker/entrypoint.headed.sh @@ -1,33 +1,5 @@ #!/bin/sh set -eu -export DISPLAY="${DISPLAY:-:99}" -export ALLOW_DOCKER_HEADED_CAPTCHA="${ALLOW_DOCKER_HEADED_CAPTCHA:-true}" -export XVFB_WHD="${XVFB_WHD:-1920x1080x24}" - -echo "[entrypoint] starting Xvfb on ${DISPLAY} (${XVFB_WHD})" -Xvfb "${DISPLAY}" -screen 0 "${XVFB_WHD}" -ac -nolisten tcp +extension RANDR >/tmp/xvfb.log 2>&1 & - -sleep 1 - -echo "[entrypoint] starting Fluxbox" -fluxbox >/tmp/fluxbox.log 2>&1 & - -if [ -z "${BROWSER_EXECUTABLE_PATH:-}" ]; then - BROWSER_EXECUTABLE_PATH="$(python - <<'PY' -from playwright.sync_api import sync_playwright - -try: - with sync_playwright() as p: - print(p.chromium.executable_path) -except Exception: - print("") -PY -)" - if [ -n "${BROWSER_EXECUTABLE_PATH}" ]; then - export BROWSER_EXECUTABLE_PATH - echo "[entrypoint] browser executable: ${BROWSER_EXECUTABLE_PATH}" - fi -fi - +echo "[entrypoint] starting flow2api (headless browser mode)" exec python main.py diff --git a/src/services/browser_captcha_personal.py b/src/services/browser_captcha_personal.py index 20d24c1..94094bb 100644 --- a/src/services/browser_captcha_personal.py +++ b/src/services/browser_captcha_personal.py @@ -446,7 +446,7 @@ class BrowserCaptchaService: def __init__(self, db=None): """初始化服务""" - self.headless = False # nodriver 有头模式 + self.headless = True # 无头模式 self.browser = None self._initialized = False self.website_key = "6LdsFiUsAAAAAIjVDZcuLhaHiDn5nnHVXVRQGeMV"