Files

6.1 KiB
Raw Permalink Blame History

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)

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="")

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.