Von der Community getragen, kostenlose KI-Tools, TTS und APIs für Twitch-Streamer
Von der Community getragen, kostenlose KI-Tools, TTS und APIs für Twitch-Streamer

Wie man KI-Bilder in Streamer.bot mit einem benutzerdefinierten Skript erzeugt

Erfahren Sie, wie Sie kostenlose KI-Bilder für Ihren Twitch-Stream direkt in Streamer.bot generieren, indem Sie ein benutzerdefiniertes Execute Code-Skript hinzufügen - keine Middleware von Drittanbietern erforderlich.
Diese Seite wurde aus dem Englischen von unseren hochmotivierten KI-Praktikanten zu Ihrer Bequemlichkeit übersetzt. Sie lernen noch, daher können einige Fehler durchgerutscht sein. Für die genauesten Informationen lesen Sie bitte die englische Version.
Heim How-To-Anleitungen Wie man KI-Bilder in Streamer.bot mit einem benutzerdefinierten Skript erzeugt

PotatoHotDog bietet eine kostenlose API zum Generieren von KI-Bildern an, die Sie direkt aus Streamer.bot heraus aufrufen können, ohne Middleware von Drittanbietern zu benötigen. In dieser Anleitung zeigen wir Ihnen, wie Sie ein kleines benutzerdefiniertes C#-Skript zu einer Streamer.bot Execute Code-Unteraktion hinzufügen, das aus einem Textprompt ein KI-Bild generiert und es auf die Festplatte herunterlädt.

Das Skript benötigt nur deinen PotatoHotDog API-Schlüssel und eine Beschreibung des Bildes, das generiert werden soll, und speichert das heruntergeladene Bild in einem dedizierten Ordner innerhalb deines Streamer.bot-Installationsverzeichnisses.

API-Schlüssel vorbereiten

Falls Sie noch keinen API-Schlüssel haben, generieren Sie ihn über Ihr Dashboard und halten Sie ihn bereit - Sie benötigen ihn im nächsten Schritt.

Zu API-Schlüsseln gehen Erstelle einen API-Schlüssel im PotatoHotDog-Dashboard

Voraussetzungsargumente

Um ein AI-Bild zu erzeugen, müssen in Streamer.bot vor der Ausführung der Execute Code-Unteraktion zwei Argumente angegeben werden. Oder anders gesagt: Diese beiden Dinge müssen angegeben werden:

  • Ein API-Schlüssel.
  • Die Prompt-Anweisungen, die das Bild beschreiben, das Sie generieren möchten.

Diese entsprechen den folgenden Streamer.bot-Argumenten:

  • potatoKey
  • potatoInstructions

Sie geben Argumente in Ihrer Aktion an, indem Sie mit der rechten Maustaste auf Unteraktionen klicken, dann Hinzufügen, Kern, Argumente auswählen und schließlich Argument festlegen.

Füge eine Unteraktion 'Set Argument' in Streamer.bot hinzu

Eine Execute-Code-Aktion in Streamer.bot hinzufügen.

Öffne Streamer.bot und gehe zum Reiter Aktionen. Erstelle eine neue Aktion oder öffne eine bestehende und gib ihr einen Namen, den du später wiedererkennst, zum Beispiel "PotatoHotDog AI Image".

Mit der ausgewählten Aktion klicken Sie unter Sub Actions auf Hinzufügen, dann wählen Sie Core gefolgt von Execute C# Code. Dies fügt eine Unteraktion hinzu, in der Sie rohen C#-Code einfügen können, den Streamer.bot kompiliert und direkt ausführt.

Fügen Sie eine Unteraktion 'Execute C# Code' in Streamer.bot hinzu

Füge das unten stehende Skript in den Code-Editor ein. Es liest die potatoKey- und potatoInstructions-Argumente, ruft unsere Generate AI Image API auf, um das Bild zu erzeugen und seine URL abzurufen, und lädt anschließend das resultierende Bild in einen Ordner namens temp_potatohotdog_images in deinem Streamer.bot-Installationsverzeichnis herunter.

using System; using System.IO; using System.Net.Http; using Newtonsoft.Json.Linq; public class CPHInline { // Tracks the version of this script for troubleshooting and support. private const string VERSION = "1.0.0"; // Base URL for the endpoint that generates an AI image. private const string BASE_URL_GENERATE = "https://api-generate-image-v1.potatohotdog.com/"; // Tracks the next numbered log argument. private int logIndex = 0; // Reuses one HTTP client for all API requests. private static readonly HttpClient httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(30) }; // Adds a log message as a numbered action argument. private void Log(string message) { // Stores the message under a numbered key. CPH.SetArgument($"potatoLog{logIndex}", message); // Advances the log index for the next message. logIndex++; // Keeps the total log count in sync. CPH.SetArgument("potatoLogCount", logIndex); } // Ensures a required action argument exists and is not empty. private bool RequireArgument(string name, out string value) { // Fails when the argument is missing or blank. if (!CPH.TryGetArg(name, out value) || string.IsNullOrWhiteSpace(value)) { value = ""; return false; } return true; } // URL-encodes a value so it can safely be used in a query string. private string EncodeUrlValue(string value) { // Escapes reserved characters for safe use in a URL. return Uri.EscapeDataString(value); } // Performs an HTTP GET request and returns the response body. private string HttpGet(string url) { try { Log($"GET {url}"); // Sends the HTTP request synchronously. HttpResponseMessage response = httpClient.GetAsync(url).GetAwaiter().GetResult(); // Reads the complete response body. string responseBody = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); Log($"HTTP status: {(int)response.StatusCode} {response.ReasonPhrase}"); // Stops when the server returns an unsuccessful status code. if (!response.IsSuccessStatusCode) { Log($"Error: HTTP request failed with status {(int)response.StatusCode} {response.ReasonPhrase}."); // Logs the server error response when available. if (!string.IsNullOrWhiteSpace(responseBody)) { Log($"Error response: {responseBody}"); } return null; } Log($"Received {responseBody.Length} characters."); return responseBody; } catch (Exception exception) { // Logs network, timeout, and other HTTP-related exceptions. Log($"Error: HTTP request failed: {exception.Message}"); return null; } } // Downloads a file from a URL and saves it to disk. private bool DownloadFile(string url, string destinationPath) { try { Log($"Downloading image from \"{url}\"."); Log($"Saving image to \"{destinationPath}\"."); // Sends the image download request. HttpResponseMessage response = httpClient.GetAsync(url).GetAwaiter().GetResult(); Log($"Image download HTTP status: {(int)response.StatusCode} {response.ReasonPhrase}"); // Reads the complete image response into memory. byte[] fileData = response.Content.ReadAsByteArrayAsync().GetAwaiter().GetResult(); // Stops when the image server returns an unsuccessful status. if (!response.IsSuccessStatusCode) { Log($"Error: Image download failed with status {(int)response.StatusCode} {response.ReasonPhrase}."); return false; } // Rejects an empty image response. if (fileData == null || fileData.Length == 0) { Log("Error: The downloaded image file is empty."); return false; } // Writes the downloaded image bytes to the destination file. File.WriteAllBytes(destinationPath, fileData); Log($"Downloaded {fileData.Length} image bytes."); // Confirms that the image file now exists on disk. if (!File.Exists(destinationPath)) { Log("Error: The image download completed, but the file does not exist on disk."); return false; } // Reports the final file size from disk. FileInfo fileInfo = new FileInfo(destinationPath); Log($"Image file saved successfully. File size: {fileInfo.Length} bytes."); return true; } catch (Exception exception) { // Logs download, filesystem, and permission errors. Log($"Error: Could not download the image file: {exception.Message}"); return false; } } // Extracts a required string value from a JSON response. private bool TryGetJsonString(string json, string propertyName, out string value) { value = ""; try { // Parses the response body as a JSON object. JObject jsonObject = JObject.Parse(json); // Retrieves the requested JSON property. JToken property = jsonObject[propertyName]; if (property == null) { Log($"Error: JSON response does not contain \"{propertyName}\"."); return false; } value = property.ToString(); // Rejects empty JSON string values. if (string.IsNullOrWhiteSpace(value)) { Log($"Error: JSON property \"{propertyName}\" is empty."); value = ""; return false; } return true; } catch (Exception exception) { // Logs malformed JSON and property conversion errors. Log($"Error: Could not parse JSON property \"{propertyName}\": {exception.Message}"); return false; } } // Creates and returns the dedicated PotatoImage folder. private string GetImageFolder() { // Uses Streamer.bot's application directory instead of the process working directory. string streamerBotFolder = AppDomain.CurrentDomain.BaseDirectory; // Places generated image files inside a dedicated subfolder. string imageFolder = Path.Combine(streamerBotFolder, "temp_potatohotdog_images"); Log($"Streamer.bot folder: \"{streamerBotFolder}\"."); Log($"Image folder: \"{imageFolder}\"."); // Creates the image folder if it does not already exist. if (!Directory.Exists(imageFolder)) { Log("Image folder does not exist. Creating it..."); Directory.CreateDirectory(imageFolder); Log("Image folder created."); } else { Log("Image folder already exists."); } return imageFolder; } // Runs the main PotatoHotdog AI image action. public bool Execute() { // Resets log numbering for this execution. logIndex = 0; CPH.SetArgument("potatoLogCount", 0); Log("Starting script..."); // Logs the script version so runs can be tracked over time. Log($"Version: {VERSION}"); // Retrieves the PotatoHotdog API key. if (!RequireArgument("potatoKey", out string potatoKey)) { Log("Error: potatoKey variable is missing. Please login to potatohotdog.com, generate an API key, create a set variable action and save the variable \"potatoKey\" with your key."); return false; } // Retrieves the prompt instructions describing the image to generate. if (!RequireArgument("potatoInstructions", out string potatoInstructions)) { Log("Error: potatoInstructions variable is missing. Create a set variable action and save the variable \"potatoInstructions\" with a description of the image you want generated."); return false; } // Logs the non-secret input values. Log("potatoKey was provided."); Log($"potatoInstructions=\"{potatoInstructions}\""); // Builds the API URL used to generate the AI image. string generateUrl = BASE_URL_GENERATE + "?key=" + EncodeUrlValue(potatoKey) + "&instructions=" + EncodeUrlValue(potatoInstructions); // Requests generation of the AI image. string generateJson = HttpGet(generateUrl); if (generateJson == null) { Log("Error: Failed to generate the AI image."); return false; } Log($"Generate response: {generateJson}"); // Extracts the generated item's ID, reused below as the local filename. if (!TryGetJsonString(generateJson, "itemID", out string itemID)) { Log("Error: Could not retrieve itemID from the generate response."); return false; } Log($"itemID=\"{itemID}\""); // Logs the generation duration when present, purely for troubleshooting. if (TryGetJsonString(generateJson, "duration", out string duration)) { Log($"duration={duration} second(s)"); } // Extracts the generated image URL from the response. if (!TryGetJsonString(generateJson, "imageURL", out string imageURL)) { Log("Error: Could not retrieve imageURL from the generate response."); return false; } Log($"imageURL=\"{imageURL}\""); string imageFolder; try { // Resolves and creates the dedicated PotatoImage directory. imageFolder = GetImageFolder(); } catch (Exception exception) { Log($"Error: Could not create or access the image folder: {exception.Message}"); return false; } // Reuses the item's own ID as the local filename instead of minting a new one. string imageFileName = $"{itemID}.png"; // Combines the image folder and unique filename. string imageFilePath = Path.Combine(imageFolder, imageFileName); Log($"Generated image filename: \"{imageFileName}\"."); Log($"Local image path: \"{imageFilePath}\"."); // Downloads the generated image file to the PotatoImage folder. if (!DownloadFile(imageURL, imageFilePath)) { Log("Error: Failed to download the generated AI image."); return false; } // Stores the remote image URL as a final action argument. CPH.SetArgument("potatoGeneratedImageURL", imageURL); // Stores the absolute local file path as a final action argument. CPH.SetArgument("potatoGeneratedImageFile", imageFilePath); Log($"potatoGeneratedImageURL=\"{imageURL}\""); Log($"potatoGeneratedImageFile=\"{imageFilePath}\""); Log("Finished."); return true; } }

Nachdem Sie das Skript eingefügt haben, denken Sie daran, auf Find Refs und Compile zu klicken und sicherzustellen, dass es erfolgreich kompiliert. Speichern Sie die Aktion, führen Sie sie dann manuell aus oder binden Sie sie an einen Befehl oder eine Kanalpunkt-Belohnung, um zu testen, dass das Bild korrekt generiert wird.

Füge das Skript ein und kompiliere es in Streamer.bot

Das heruntergeladene Bild überprüfen

Sobald die Aktion ausgeführt wurde, können Sie die Aktionsvariablen über den Aktionsverlauf überprüfen, um zu bestätigen, dass alles wie erwartet funktioniert hat.

Dort finden Sie den lokalen Pfad, an dem das generierte Bild auf der Festplatte gespeichert wurde, im Ordner temp_potatohotdog_images in Ihrem Streamer.bot-Installationsverzeichnis.

Untersuchen Sie die Variablen der generierten Bilder im Aktionsverlauf

Öffne diesen Ordner, um das heruntergeladene Bild direkt anzusehen.

Aktionsvariablen über den Aktionsverlauf in Streamer.bot inspizieren

Fehlerbehebung

Wenn das Skript nicht wie erwartet funktioniert, ist der beste Weg, es zu beheben, indem Sie die Aktionsprotokolle überprüfen.

Sie können dies tun, indem Sie Ihre Aktionsvariablen über die Aktionshistorie einsehen.

Aktionsvariablen über den Aktionsverlauf in Streamer.bot inspizieren

Dieser Leitfaden wurde erstmals am 19.07.2026 veröffentlicht und zuletzt am 19.07.2026 geändert.

Weitere ähnliche Anleitungen

Hier sind einige weitere How-to-Anleitungen, die Ihnen nützlich sein könnten.

So verbindet man Streamer.bot mit einer KI
So verbindet man Streamer.bot mit einer KI
Erfahren Sie, wie Sie kostenlose KI-(LLM)-Antworten für Ihren Twitch-Stream in Streamer.bot mithilfe einer Fetch-URL-Sub-Aktion und der PotatoHotDog Generate AI Response API generieren. Kein benutzerdefiniertes Skript erforderlich.
Leitfaden lesen
Wie Man Kostenloses TTS-Audio In Streamer.bot Mit Dynamischen Browser-Quellen Abspielt
Wie Man Kostenloses TTS-Audio In Streamer.bot Mit Dynamischen Browser-Quellen Abspielt
Erfahre, wie du kostenloses KI-TTS (Text-to-Speech) Audio für deinen Twitch-Stream in Streamer.bot mit einer Dynamic Browser Source und einer einfachen Fetch URL-Webhook-Anfrage nutzt — kein eigenes Skript erforderlich.
Leitfaden lesen
So spielst du kostenloses TTS-Audio in Streamer.bot mit einem benutzerdefinierten Skript ab.
So spielst du kostenloses TTS-Audio in Streamer.bot mit einem benutzerdefinierten Skript ab.
Lerne, wie du kostenloses KI-TTS-Audio für deinen Twitch-Stream direkt in Streamer.bot abspielst, indem du ein benutzerdefiniertes Execute Code-Skript hinzufügst - Speaker.bot ist nicht erforderlich.
Leitfaden lesen