DevOps & Skalierung

GitHub Actions + CaptchaAI: CI/CD CAPTCHA-Test

Durch CAPTCHA geschützte Seiten unterbrechen automatisierte Tests. CaptchaAI lässt sich in GitHub Actions integrieren, um CAPTCHAs während CI/CD-Testläufen zu lösen und so Ihre Pipeline umweltfreundlich zu halten.


GitHub-Aktionsworkflow

# .github/workflows/captcha-tests.yml
name: CAPTCHA Integration Tests

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
  schedule:

    - cron: "0 6 * * 1"  # Weekly Monday 6 AM

jobs:
  captcha-tests:
    runs-on: ubuntu-latest
    timeout-minutes: 15

    steps:

      - uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"

      - name: Install dependencies
        run: pip install requests pytest

      - name: Run CAPTCHA integration tests
        env:
          CAPTCHAAI_KEY: ${{ secrets.CAPTCHAAI_KEY }}
        run: pytest tests/test_captcha.py -v --tb=short

Speichern Sie den API-Schlüssel als GitHub-Geheimnis

  1. Gehen Sie zu Einstellungen → Geheimnisse und Variablen → Aktionen
  2. Klicken Sie auf Neues Repository-Geheimnis
  3. Name: CAPTCHAAI_KEY
  4. Wert: Ihr CaptchaAI-API-Schlüssel
  5. Klicken Sie auf Geheimnis hinzufügen

Testdatei

# tests/test_captcha.py
import os
import time
import pytest
import requests


API_KEY = os.environ.get("CAPTCHAAI_KEY")
BASE_URL = "https://ocr.captchaai.com"


def solve_recaptcha(site_key, page_url, timeout=90):
    """Solve reCAPTCHA v2 via CaptchaAI."""
    resp = requests.post(f"{BASE_URL}/in.php", data={
        "key": API_KEY,
        "method": "userrecaptcha",
        "googlekey": site_key,
        "pageurl": page_url,
        "json": 1,
    }, timeout=30)
    result = resp.json()
    assert result.get("status") == 1, f"Submit failed: {result}"

    task_id = result["request"]
    start = time.time()

    while time.time() - start < timeout:
        time.sleep(5)
        resp = requests.get(f"{BASE_URL}/res.php", params={
            "key": API_KEY,
            "action": "get",
            "id": task_id,
            "json": 1,
        }, timeout=15)
        data = resp.json()
        if data["request"] != "CAPCHA_NOT_READY":
            assert data.get("status") == 1, f"Solve failed: {data}"
            return data["request"]

    pytest.fail("CAPTCHA solve timed out")


@pytest.mark.skipif(not API_KEY, reason="CAPTCHAAI_KEY not set")
class TestCaptchaIntegration:
    """Integration tests for CAPTCHA-protected flows."""

    def test_recaptcha_v2_solve(self):
        """Verify CaptchaAI can solve reCAPTCHA v2."""
        token = solve_recaptcha(
            site_key="6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-",
            page_url="https://www.google.com/recaptcha/api2/demo",
        )
        assert len(token) > 100
        assert token.isascii()

    def test_balance_sufficient(self):
        """Ensure account balance is enough for test suite."""
        resp = requests.get(f"{BASE_URL}/res.php", params={
            "key": API_KEY,
            "action": "getbalance",
            "json": 1,
        })
        balance = float(resp.json()["request"])
        assert balance > 0.50, f"Low balance: ${balance}"

    def test_api_key_valid(self):
        """Verify API key is accepted."""
        resp = requests.get(f"{BASE_URL}/res.php", params={
            "key": API_KEY,
            "action": "getbalance",
            "json": 1,
        })
        result = resp.json()
        assert result.get("status") == 1, f"Invalid key: {result}"

Matrixtests (mehrere CAPTCHA-Typen)

jobs:
  captcha-matrix:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        captcha-type: [recaptcha-v2, turnstile, image]
      fail-fast: false

    steps:

      - uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"

      - name: Install dependencies
        run: pip install requests pytest

      - name: Run ${{ matrix.captcha-type }} tests
        env:
          CAPTCHAAI_KEY: ${{ secrets.CAPTCHAAI_KEY }}
          CAPTCHA_TYPE: ${{ matrix.captcha-type }}
        run: pytest tests/test_${{ matrix.captcha-type }}.py -v

Testergebnisse zwischenspeichern

Vermeiden Sie redundante CAPTCHA-Lösungen für unveränderten Code:


      - name: Cache test results
        uses: actions/cache@v4
        with:
          path: .test-cache
          key: captcha-tests-${{ hashFiles('tests/**') }}

      - name: Skip if cached
        id: check-cache
        run: |
          if [ -f .test-cache/passed ]; then
            echo "skip=true" >> $GITHUB_OUTPUT
          fi

      - name: Run tests
        if: steps.check-cache.outputs.skip != 'true'
        env:
          CAPTCHAAI_KEY: ${{ secrets.CAPTCHAAI_KEY }}
        run: |
          pytest tests/test_captcha.py -v
          mkdir -p .test-cache && touch .test-cache/passed

Slack-Benachrichtigung bei Fehler


      - name: Notify on failure
        if: failure()
        uses: slackapi/slack-github-action@v1
        with:
          payload: |
            {
              "text": "CAPTCHA tests failed on ${{ github.ref }}",
              "blocks": [
                {
                  "type": "section",
                  "text": {
                    "type": "mrkdwn",
                    "text": "CAPTCHA tests *failed* on `${{ github.ref }}`\n<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View run>"
                  }
                }
              ]
            }
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}

Fehlerbehebung

Problem Ursache Lösung
Tests werden mit „CAPTCHAAI_KEY nicht festgelegt“ übersprungen. Geheimnis nicht konfiguriert Geheimnis in den Repo-Einstellungen hinzufügen
Zeitüberschreitung in CI, funktioniert aber lokal Latenz des Runner-Netzwerks Timeout auf 120 Sekunden erhöhen
Die Überprüfung des Kontostands schlägt fehl Problem mit dem Schlüsselformat Stellen Sie sicher, dass der geheime Wert kein Leerzeichen enthält
Der Workflow wird nie ausgeführt Falsche branch/trigger-Konfiguration Überprüfen Sie den on:-Block in YAML

FAQ

Wie viel kostet die Durchführung von CAPTCHA-Tests in CI?

Eine typische Testsuite, die 3–5 CAPTCHAs löst, kostet 0,01–0,03 US-Dollar pro Durchgang. Wöchentlich geplante Läufe kosten etwa 0,10–0,15 $/month.

Sollte ich bei jedem PR CAPTCHA-Tests durchführen?

Führen Sie bei jedem PR eine Kontostand- und Schlüsselvalidierung durch. Führen Sie vollständige CAPTCHA-Lösungstests bei der Zusammenführung mit der Hauptversion oder nach einem wöchentlichen Zeitplan durch, um die Kosten zu minimieren.

Kann ich dies mit anderen CI-Plattformen verwenden?

Ja. Der Python-Testcode funktioniert in GitLab CI, CircleCI oder Jenkins genauso. Lediglich die Workflow-YAML-Syntax unterscheidet sich.


Verwandte Leitfäden

  • Erstellen Sie eine automatisierte Testpipeline
  • CAPTCHA in CI-Testsuiten

Pipeline grün halten – Holen Sie sich CaptchaAI für CI/CD.

Diskussionen (0)

Noch keine Kommentare.