Gemenskapsdrivna Gratis AI-verktyg, TTS och API:er för Twitch-streamers
Gemenskapsdrivna Gratis AI-verktyg, TTS och API:er för Twitch-streamers

Hur man Genererar AI-bilder i Streamer.bot Med ett Anpassat Skript

Lär dig hur du genererar gratis AI-bilder för din Twitch-ström direkt i Streamer.bot genom att lägga till ett anpassat Execute Code-skript, inga tredjeparts-mellanhänder krävs.
Den här sidan har översatts från engelska av våra mycket drivna AI-praktikanter för din bekvämlighet. De lär sig fortfarande, så några misstag kan ha smugit igenom. För den mest exakta informationen, vänligen hänvisa till den engelska versionen.
Hem Instruktionsguider Hur man Genererar AI-bilder i Streamer.bot Med ett Anpassat Skript

PotatoHotDog erbjuder ett gratis API för att generera AI-bilder som du kan anropa direkt från Streamer.bot, utan att behöva någon tredjeparts-mjukvara. Denna guide visar hur du lägger till ett litet anpassat C#-skript i en Streamer.bot Execute Code-underåtgärd som genererar en AI-bild från en textprompt och laddar ner den till disk.

Skriptet behöver endast din PotatoHotDog API-nyckel och en prompt som beskriver den bild du vill att den ska genereras, och den sparar den nedladdade bilden i en dedikerad mapp inne i din Streamer.bot-installationskatalog.

Förbered en API-nyckel

Om du inte redan har en API-nyckel, generera en från din instrumentpanel och håll den redo. Du kommer att behöva den i nästa steg.

Gå till API-nycklar Generera en API-nyckel i PotatoHotDog-instrumentpanelen

Förutsättningsargument

För att generera en AI-bild måste två argument anges i Streamer.bot innan Execute Code sub action körs. Med andra ord måste dessa två saker anges:

  • En API-nyckel.
  • Promptinstruktionerna som beskriver den bild du vill generera.

Dessa motsvarar följande Streamer.bot-argument:

  • potatoKey
  • potatoInstructions

Du anger argument i din åtgärd genom att högerklicka på Underåtgärder, sedan välja Lägg till, Kärna, Argument, och slutligen Ange Argument.

Lägg till en underåtgärd Set Argument i Streamer.bot

Lägger till en Execute Code-åtgärd i Streamer.bot

Öppna Streamer.bot och gå till fliken Åtgärder. Skapa en ny åtgärd, eller öppna en befintlig, och ge den ett namn du kommer att känna igen senare, till exempel "PotatoHotDog AI Image".

Med din åtgärd vald klickar du Lägg till under Underåtgärder, välj sedan Core följt av Kör C#-kod. Detta lägger till en underåtgärd där du kan klistra in rå C#-kod som Streamer.bot kompilerar och kör direkt.

Lägg till en underåtgärd för att köra C#-kod i Streamer.bot

Klistra in skriptet nedan i kodredigeraren. Det läser argumenten potatoKey och potatoInstructions, anropar vårt Generate AI Image API för att generera bilden och hämta dess URL, och laddar sedan ner den resulterande bilden till en mapp som heter temp_potatohotdog_images i din Streamer.bot-installationskatalog.

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

Efter att ha klistrat in skriptet, kom ihåg att klicka på Find Refs och Compile och se till att det kompilerar framgångsrikt. Spara åtgärden, och utlös den manuellt eller bind den till ett kommando eller en kanalpoängsbelöning för att testa att bilden genereras korrekt.

Klistra in skriptet och kompilera det i Streamer.bot

Granska den nedladdade bilden

När åtgärden har körts kan du granska variablerna för åtgärden via åtgärdshistoriken för att bekräfta att allt fungerade som förväntat.

Där hittar du den lokala sökvägen där den genererade bilden sparades på hårddisken, inne i mappen temp_potatohotdog_images i din Streamer.bot-installationskatalog.

Granska variablerna för de genererade bilderna i åtgärdshistoriken

Öppna den mappen för att visa den nedladdade bilden direkt.

Granska åtgärdsvariabler via åtgärdshistoriken i Streamer.bot

Felsökning

Om skriptet inte uppför sig som förväntat är det bästa sättet att felsöka det genom att kontrollera loggarna för åtgärder.

Du kan göra detta genom att granska dina Action-variabler via Action History.

Granska åtgärdsvariabler via åtgärdshistoriken i Streamer.bot

Denna guide publicerades först 2026-07-19 och uppdaterades senast 2026-07-19.

Andra Liknande Guider

Här är några andra gör-det-själv-guider som du kanske finner användbara.

Så här kopplar du Streamer.bot till en AI
Så här kopplar du Streamer.bot till en AI
Lär dig hur du genererar kostnadsfria AI (LLM) svar för din Twitch-ström i Streamer.bot med en Fetch URL-subåtgärd och PotatoHotDog Generate AI Response API, inga anpassade skript behövs.
Läs guiden
Hur man spelar gratis TTS-ljud i Streamer.bot med dynamiska webbläsarkällor
Hur man spelar gratis TTS-ljud i Streamer.bot med dynamiska webbläsarkällor
Lär dig hur du spelar upp gratis AI TTS (Text-to-Speech) ljud för din Twitch-ström i Streamer.bot med en Dynamic Browser Source och en enkel Fetch URL-webhook-förfrågan, inga anpassade skript krävs.
Läs guiden
Hur man spelar upp gratis TTS-ljud i Streamer.bot med ett anpassat skript
Hur man spelar upp gratis TTS-ljud i Streamer.bot med ett anpassat skript
Lär dig hur du spelar upp gratis AI TTS (Text-to-Speech) ljud för din Twitch-ström direkt i Streamer.bot, genom att lägga till ett anpassat Execute Code-skript, inget Speaker.bot krävs.
Läs guiden