Door de gemeenschap aangedreven gratis AI-tools, TTS en API's voor Twitch-streamers
Door de gemeenschap aangedreven gratis AI-tools, TTS en API's voor Twitch-streamers

Zo genereer je AI-afbeeldingen in Streamer.bot met een aangepast script

Leer hoe je gratis AI-afbeeldingen voor je Twitch-stream direct binnen Streamer.bot kunt genereren door een aangepaste Execute Code-script toe te voegen. Geen middleware van derden nodig.
Deze pagina is vertaald vanuit het Engels door onze zeer gemotiveerde AI-stagiairs voor uw gemak. Ze zijn nog aan het leren, dus er kunnen wat foutjes zijn geslopen. Voor de meest nauwkeurige informatie verwijzen wij u naar de Engelse versie.
Thuis Handleidingen Zo genereer je AI-afbeeldingen in Streamer.bot met een aangepast script

PotatoHotDog biedt een gratis Generate AI Images API aan die je rechtstreeks vanuit Streamer.bot kunt aanroepen, zonder dat je middleware van derden nodig hebt. Deze handleiding laat zien hoe je een kleine, aangepaste C#-script toevoegt aan een Streamer.bot Execute Code-subactie die een AI-afbeelding genereert uit een tekstprompt en deze naar de schijf downloadt.

Het script heeft alleen je PotatoHotDog API-sleutel en een prompt nodig die de afbeelding beschrijft die je wilt laten genereren, en het slaat de gedownloade afbeelding op in een speciale map in de Streamer.bot-installatiemap.

Maak een API-sleutel aan

Als je er nog geen hebt, genereer dan een API-sleutel via je dashboard en houd deze klaar. Je hebt die in de volgende stap nodig.

Ga naar API-sleutels Genereer een API-sleutel in het PotatoHotDog-dashboard

Vereiste Argumenten

Om een AI-afbeelding te genereren, moeten twee argumenten worden opgegeven in Streamer.bot voordat de subactie Execute Code wordt uitgevoerd. Of, anders gezegd, moeten deze twee dingen worden opgegeven:

  • Een API-sleutel.
  • De instructies voor de prompt die de afbeelding beschrijven die je wilt genereren.

Deze komen overeen met de volgende Streamer.bot-argumenten:

  • potatoKey
  • potatoInstructions

je specificeert argumenten in je actie door met de rechtermuisknop op Sub Actions te klikken, vervolgens Add, Core, Arguments te selecteren, en ten slotte Set Argument.

Voeg een Set Argument-subactie toe in Streamer.bot

Een Execute Code-actie toevoegen in Streamer.bot

Open Streamer.bot en ga naar het tabblad Acties. Maak een nieuwe actie aan, of open een bestaande actie, en geef het een naam die je later zult herkennen, zoals "PotatoHotDog AI Image".

Met de geselecteerde actie klik je op Toevoegen onder Subacties, kies daarna Core, gevolgd door Execute C# Code. Dit voegt een subactie toe waarin je ruwe C#-code kunt plakken die Streamer.bot compileert en direct uitvoert.

Voeg een Execute C# Code-subactie toe aan Streamer.bot

Plak het onderstaande script in de code-editor. Het leest de potatoKey- en potatoInstructions-argumenten, roept onze Generate AI Image API aan om de afbeelding te genereren en de URL ervan op te halen, en downloadt vervolgens de resulterende afbeelding naar een map genaamd temp_potatohotdog_images in de installatiemap van Streamer.bot.

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; } }

Na het plakken van het script, vergeet niet op Find Refs en Compile te klikken en zorg ervoor dat het succesvol compileert. Sla de actie op, dan activeer je het handmatig of koppel je het aan een commando of aan een beloning voor kanaalpunten om te testen of de afbeelding correct wordt gegenereerd.

Plak het script en compileer het in Streamer.bot

Bekijk de gedownloade afbeelding

Zodra de actie is uitgevoerd, kun je de Action-variabelen via de Action History bekijken om te bevestigen dat alles naar verwachting heeft gewerkt.

Daar vindt u het lokale pad waar de gegenereerde afbeelding op de harde schijf is opgeslagen, in de map temp_potatohotdog_images in de installatiemap van Streamer.bot.

Bekijk de variabelen van de gegenereerde afbeeldingen in de geschiedenis van acties

Open die map om de gedownloade afbeelding direct te bekijken.

Bekijk variabelen van acties via de Actiegeschiedenis in Streamer.bot

Probleemoplossing

Als het script zich niet gedraagt zoals verwacht, is de beste manier om het probleem op te lossen door de actie-logboeken te controleren.

U kunt dit doen door uw actievariabelen te inspecteren via de Actiegeschiedenis.

Bekijk variabelen van acties via de Actiegeschiedenis in Streamer.bot

Deze gids werd voor het eerst gepubliceerd op 2026-07-19 en werd voor het laatst gewijzigd op 2026-07-19.

Andere Soortgelijke Gidsen

Hier zijn nog wat andere how-to-gidsen die je wellicht nuttig zult vinden.

Hoe verbind je Streamer.bot met een AI
Hoe verbind je Streamer.bot met een AI
Leer hoe je gratis AI (LLM) reacties genereert voor je Twitch-stream in Streamer.bot met een Fetch URL-subactie en de PotatoHotDog Generate AI Response API, geen aangepast script nodig.
Lees Gids
Hoe speel je gratis TTS-audio af in Streamer.bot met dynamische browserbronnen
Hoe speel je gratis TTS-audio af in Streamer.bot met dynamische browserbronnen
Leer hoe je gratis AI TTS-audio afspeelt voor je Twitch-stream in Streamer.bot met behulp van een Dynamic Browser Source en een eenvoudige Fetch URL-webhookverzoek, geen aangepast script nodig.
Lees Gids
Hoe speel je gratis TTS-audio in Streamer.bot met een aangepast script
Hoe speel je gratis TTS-audio in Streamer.bot met een aangepast script
Leer hoe je gratis AI TTS (Text-to-Speech) audio voor je Twitch-stream direct binnen Streamer.bot kunt afspelen door een aangepaste Execute Code-script toe te voegen; geen Speaker.bot vereist.
Lees Gids