Fetch URL — Externe APIs ohne C¶
Streamer.bot kann externe Web-APIs aufrufen via Core → Network → Fetch URL. Damit baust du Commands die externe Daten holen (Wetter, Witze, Cat-Facts, beliebige JSON-APIs) ohne eine Zeile C#-Code.
Doku: https://docs.streamer.bot/api/sub-actions/core/network/fetch-url
Wichtige Limitation¶
| Was geht | Was nicht geht |
|---|---|
| GET-Requests | POST / PUT / DELETE / PATCH |
| Custom Headers | Request Body |
| JSON-Response parsen | Basic Auth direkt im Sub-Action |
| Status-Code prüfen | Cookies / Sessions |
Für POST/PUT/DELETE musst du C# nutzen. Wir vermeiden hier C# — also bauen wir nur GET-basierte Read-only-Integrationen.
Fetch URL Sub-Action¶
Pfad: Core → Network → Fetch URL
| Feld | Bedeutung |
|---|---|
| URL | Vollständige Ziel-URL inkl. Query-Parameter (?key=value) |
| Variable Name | In welche lokale Variable die Response gespeichert wird |
| Parse result as JSON | Toggle (default: aus). Wenn an → JSON wird in %<varName>.<key>% aufgesplittet |
| Headers | Optional. Custom HTTP-Headers (z.B. User-Agent, Accept) |
Output¶
Ohne JSON-Parsing:
| Variable | Inhalt |
|---|---|
%<variableName>% |
Komplette Response als String |
Mit JSON-Parsing (Toggle an):
| Variable | Inhalt |
|---|---|
%<variableName>.<key>% |
Jeder Top-Level-Key wird zur Variable |
%<variableName>.<key>.<subkey>% |
Nested Keys |
Beispiel: API liefert {"fact": "Katzen schlafen 16h", "length": 23}. Mit Variable Name cat:
%cat.fact%=Katzen schlafen 16h%cat.length%=23
Status-Code prüfen¶
Streamer.bot setzt nach Fetch URL eine Variable für den HTTP-Status. Genauer Name: %fetchUrlStatusCode% (das ist die übliche Schreibweise — Doku-Status check empfohlen wenn unklar).
Pattern für Fehler-Handling:
1. Fetch URL: https://api.example.com/data → meinResult
2. If/Else: %fetchUrlStatusCode% Greater Than 299
├── Send Message: "@%user% API gerade nicht erreichbar (Status %fetchUrlStatusCode%)"
└── Break
3. Send Message: "@%user% Antwort: %meinResult%"
JSON-Parsing Beispiel¶
API: https://catfact.ninja/fact liefert:
Sub-Action:
| Feld | Wert |
|---|---|
| URL | https://catfact.ninja/fact |
| Variable Name | cat |
| Parse result as JSON | ✅ aktiv |
Danach:
- %cat.fact% = A cat's normal pulse is 140-240 beats per minute.
- %cat.length% = 51
Nested-JSON¶
API liefert:
Mit Variable Name data:
- %data.user.name% = Bob
- %data.user.age% = 30
- %data.status% = ok
Arrays in JSON¶
API: {"jokes": [{"text": "Joke 1"}, {"text": "Joke 2"}]} — Index-Zugriff: %data.jokes[0].text% oder %data.jokes.0.text% (Syntax kann je nach SB-Version variieren).
Pragmatisch: Wenn die API ein Array zurückgibt, lieber eine API die einen einzelnen Eintrag liefert nutzen. Macht das Pattern einfacher.
URL-Encoding¶
Wenn User-Input in die URL muss (z.B. !weather München), brauchst du URL-Encoding:
%input0%→München- Für URL:
Münchenmuss zuM%C3%BCnchen(URL-encoded)
Streamer.bot hat dafür Variablen: %input0URLEncoded% (in Command Triggered Trigger) ODER Inline Function $urlencode(text)$.
Beispiel:
Custom Headers¶
User-Agent setzen ist oft sinnvoll (manche APIs blocken Default-Agents):
| Header | Wert |
|---|---|
User-Agent |
AzaCraft Streamer.bot/1.0 |
Accept |
application/json |
Manche APIs verlangen API-Key per Header (z.B. X-API-Key: dein-key). Kein Problem — einfach im Headers-Feld eintragen.
API-Key per Query-Parameter¶
Wenn API-Key in URL geht (z.B. OpenWeatherMap): einfach in URL hardcoden oder per Argument einsetzen:
Security-Tipp: Wenn dein API-Key sensitiv ist, in Persisted Global ablegen statt hartkodieren:
1. Global (Set) weatherApiKey = "abc123" (einmalig manuell)
2. In URL: &appid=~weatherApiKey~
So ist der Key nicht in der Action-Definition selbst.
API-Use-Cases in dieser Sektion¶
| Command | MD | API |
|---|---|---|
!weather <stadt> |
weather.md | wttr.in (kostenlos, kein Key) |
!joke |
joke.md | official-joke-api oder icanhazdadjoke |
!catfact |
catfact.md | catfact.ninja (kostenlos) |
Häufige Fallen¶
- POST/PUT in Fetch URL versuchen — geht nicht, nur GET. Doku lesen oder C# nutzen
- API-Rate-Limit — kostenlose APIs haben oft Limits (z.B. 1000/Tag). Mit Cooldown im Command zähmen
- CORS — irrelevant für Streamer.bot (keine Browser-Anfrage)
- HTTPS-Zertifikat — selten Probleme. Bei Fail: API per Browser-curl prüfen
- JSON-Parse-Toggle vergessen — ohne den Toggle ist
%var%der Raw-String. Mit Toggle wird's gesplittet - Sehr lange Responses — Twitch-Chat hat 500-Zeichen-Limit. Bei langem JSON evtl. nur Teilfeld nutzen, nicht die ganze Response