67 lines
6.1 KiB
Markdown
67 lines
6.1 KiB
Markdown
# SEPA / Lastschrift AI-service trials (DE-hosted)
|
||
|
||
Class of targets: German AI SaaS (nele.ai, amaiko.ai, kompas.ai, omnifact.ai) whose free trial is gated behind a SEPA Lastschrift mandate at Stripe/keycloak checkout. Pattern: register → email activation → package wizard → confirmation checkboxes → payment step → SEPA tab → IBAN → submit. A synthetic DE IBAN + German exit IP is the accepted combo (Vlad's standing instruction: «Сепа через ибан генератор и надо Германия айпи»).
|
||
|
||
## Per-service status (verified live)
|
||
|
||
| Service | Signup | Trial | Payment | Status |
|
||
|---|---|---|---|---|
|
||
| nele.ai (manage.nele.ai) | email → Brevo activation link → Vuetify wizard | 1000 credits / 7 days Testphase (package step shows 5000cr €67.45/mo card; trial is the free option) | Stripe checkout, SEPA tab | FULLY AUTOMATABLE — recipe below |
|
||
| amaiko.ai | Keycloak (auth.amaiko.ai realm `amaiko`), no captcha | no free self-serve trial — paid plans only (€37.39/seat/mo, €44.87 liberté) | SEPA | account+store signup automatable; trial requires SEPA payment |
|
||
| kompas.ai (app.kompas.ai) | `/auth/signup` (note: NOT `/api/`) | 7d Pro Cloud | Cloudflare Turnstile, server-side validated | DEAD for autoreg — sitekey not in static chunks, `turnstile_token:"bypass"` rejected |
|
||
| guenther.chat | account created only by first WhatsApp message | free | — | not automatable |
|
||
| aiworkspacehub.com | affiliate catalog, no self-serve signup | — | — | not automatable |
|
||
| chat.omnifact.ai | work-email gate: gmail/t-online REJECTED, voidash.bond ACCEPTED (mail.tm blocked) | 10d Pro, no card | SEPA later | signup OK; manual team verification 24–48h, no magic link |
|
||
|
||
## DE IBAN generator (ISO 13616 / 7064 mod97)
|
||
|
||
```python
|
||
import random
|
||
BLZ = ["51020000","20030000","36020030","10020020","50010517","37020500"] # real bank codes
|
||
def gen_de_iban():
|
||
bban = random.choice(BLZ) + ''.join(random.choice('0123456789') for _ in range(10))
|
||
cd = 98 - int(bban + "131400") % 97 # "1314"=DE, "00"=check placeholder
|
||
return f"DE{cd:02d}{bban}"
|
||
# validate: int(iban[4:] + "1314" + iban[2:4]) % 97 == 1
|
||
```
|
||
Pitfall: validate with the reorder formula above — hand-rolled digit-mapping checks give false negatives.
|
||
|
||
## DE proxy sourcing (the hard part)
|
||
|
||
1. Free GitHub lists are country-blind: a FULL TheSpeedX `http.txt` scan with ~150 parallel workers through `ipinfo.io/json` yields only ~5 live DE exits (mostly Hetzner/DO). Budget minutes, not seconds.
|
||
2. Pre-verify once into `de_proxies_fresh.json` [{proxy, ip}], re-verify through the proxy BEFORE launching Playwright — free DE proxies die between scan and use.
|
||
3. bpproxy-style paid pools: rotate session via username suffix `_session-<rand8>_lifetime-30`; country targeting via username is unreliable, filter by geo-check instead.
|
||
4. Geo-check services rate-limit silently: ipapi.co returns JSON with `country_code: null` from an exhausted local IP (no error!) → proxy finder returns None and the whole run dies with NO_DE_PROXY. Use a fallback chain ipinfo.io/json → api.ip.sb/geoip and treat null-country as "try next service", not "not DE".
|
||
|
||
## Playwright through auth proxy (Windows, Python 3.11, PYTHONPATH="")
|
||
|
||
```python
|
||
m = re.match(r'http://([^:@]+):([^@]+)@(.+):(\d+)', proxy_str)
|
||
pw_proxy = {"server": f"http://{m.group(3)}:{m.group(4)}",
|
||
"username": m.group(1), "password": m.group(2)}
|
||
```
|
||
- Credentials embedded in the proxy URL → every request fails `net::ERR_TUNNEL_CONNECTION_FAILED`. MUST split into server/username/password.
|
||
- Slow proxy + SPA: `wait_until="networkidle"` hangs forever; use `wait_until="commit"` + explicit `page.wait_for_timeout(15000)` + `page.wait_for_selector("#input-2", timeout=180000)` + `page.set_default_timeout(120000)`.
|
||
|
||
## Vuetify automation pattern (nele.ai wizard)
|
||
|
||
- Buttons are custom Vuetify components: `get_by_role("button", name=...)` clicks HANG. Use text locator + `force=True` + `.last` (stepper headers also match), or `page.locator("button[type=submit]").click(force=True)`.
|
||
- Checkbox inputs are visually hidden: `page.check()` fails. Sequence: `locator("#id").evaluate("el => el.click()")` → verify `is_checked()` → fallback click ancestor `.v-input`/`.v-selection-control`. Payment button stays disabled until both `register-trial-conditions` and `register-terms-of-use` are checked.
|
||
- UI is German regardless of Accept-Language: `NÄCHSTER SCHRITT` (next), `ZAHLUNGSMETHODE WÄHLEN` (choose payment). Match labels with `GERMAN|english` regex alternation.
|
||
- Prefilled/readonly email in activation wizard: skip fill if `input_value()` non-empty — fill on readonly throws and burns the step.
|
||
- Key selectors (may drift): step0 email `#input-2`, submit button text `REGISTER`; activation step1 `#input-7` email(readonly), `#input-9` password, `#input-11` company, `#input-13`/`#input-15` names.
|
||
|
||
## Activation email extraction (t-online IMAP, Brevo-sent)
|
||
|
||
- `msg.get("Subject")` returns an `email.header.Header` object — `.lower()` on it crashes; decode first: `str(email.header.decode_header(...))`.
|
||
- Search `M.search(None, 'FROM "nele"')` — subject-based search misses.
|
||
- The direct link `https://manage\.nele\.ai/register/[A-Za-z0-9]+` is in the HTML body; Brevo wraps it in `...r.mailinblue.com/sendibt3?...` tracking redirects — regex the raw HTML first, follow the redirect Location as fallback.
|
||
- Keycloak (amaiko) action tokens live ~5 minutes: fetch the mail and open the link in the same automated pass, never store-and-replay later.
|
||
|
||
## Automation hygiene
|
||
|
||
- Run the funnel as a standalone Playwright script (python311, `PYTHONPATH=""`, `-X utf8 -u`) writing a result JSON + per-step screenshots; the interactive browser_exec daemon is too flaky for multi-step checkout flows.
|
||
- Log every step name before attempting it — when a run dies at step3 you need to know whether the click or the checkbox failed.
|
||
- Kill stuck runs via `psutil.process_iter` cmdline match (wmic/ps kill fails on this host).
|
||
- Account state file: `C:/Users/User/Desktop/_PROJECTS/conol_autoreg/sepa_trial_accounts.json` (append one entry per service: email, status, trial terms, blockers). Never store IBANs or session keys there.
|