Narzędzia AI napędzane przez społeczność, darmowe TTS i API dla streamerów Twitcha
Narzędzia AI napędzane przez społeczność, darmowe TTS i API dla streamerów Twitcha

Jak Wygenerować Obrazy AI w Streamer.bot za pomocą Niestandardowego Skryptu

Dowiedz się, jak generować darmowe obrazy AI dla swojego streama na Twitchu bezpośrednio w Streamer.bot, dodając niestandardowy skrypt Execute Code — żadne zewnętrzne middleware nie są wymagane.
Ta strona została przetłumaczona z angielskiego przez naszych bardzo zmotywowanych asystentów AI dla Twojej wygody. Nadal się uczą, więc mogą zdarzyć się drobne błędy. Aby uzyskać najdokładniejsze informacje, prosimy korzystać z wersji angielskiej.
Dom Poradniki krok po kroku Jak Wygenerować Obrazy AI w Streamer.bot za pomocą Niestandardowego Skryptu

PotatoHotDog oferuje bezpłatne API Generowania Obrazów AI, które możesz wywołać bezpośrednio z Streamer.bot, bez konieczności używania żadnego zewnętrznego middleware'u. Ten przewodnik pokazuje, jak dodać mały niestandardowy skrypt C#, który do akcji Execute Code w Streamer.bot generuje obraz AI na podstawie tekstowego promptu i zapisuje go na dysku.

Skrypt potrzebuje jedynie Twojego klucza API PotatoHotDog i prompt opisujący obraz, który chcesz wygenerować, a pobrany obraz zapisuje do dedykowanego folderu w katalogu instalacyjnym Streamer.bot.

Przygotuj klucz API

Jeśli jeszcze go nie masz, wygeneruj klucz API z panelu sterowania i trzymaj go pod ręką — będziesz go potrzebować w kolejnym kroku.

Przejdź do kluczy API Wygeneruj klucz API w panelu PotatoHotDog

Wymagane Argumenty

Aby wygenerować obraz AI, dwa argumenty muszą zostać określone w Streamer.bot przed uruchomieniem podakcji Execute Code. Innymi słowy, trzeba określić te dwie rzeczy:

  • Klucz API.
  • Instrukcje poleceń opisujące obraz, który chcesz wygenerować.

Odnoszą się do następujących argumentów Streamer.bot:

  • potatoKey
  • potatoInstructions

Określasz argumenty w swojej akcji, klikając prawym przyciskiem myszy na Pod Akcje, a następnie wybierając Dodaj, Rdzeń, Argumenty i na końcu Ustaw Argument.

Dodaj podakcję Set Argument w Streamer.bot

Dodawanie akcji Wykonaj Kod w Streamer.bot

Otwórz Streamer.bot i przejdź do zakładki Akcje. Utwórz nową akcję albo otwórz istniejącą i nadaj jej nazwę, którą później rozpoznasz, na przykład "PotatoHotDog AI Image".

Gdy masz wybraną akcję, kliknij Dodaj w sekcji Pod Akcje, a następnie wybierz Core, a potem Execute C# Code. To dodaje podakcję, w której możesz wkleić surowy kod C#, który Streamer.bot kompiluje i uruchamia na bieżąco.

Dodaj podakcję 'Wykonaj kod C#' w Streamer.bot

Wklej poniższy skrypt do edytora kodu. Odczytuje argumenty potatoKey i potatoInstructions, wywołuje nasze Generate AI Image API, aby wygenerować obraz i pobrać jego adres URL, a następnie pobiera wygenerowany obraz do folderu o nazwie temp_potatohotdog_images w katalogu instalacyjnym 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; } }

Po wklejeniu skryptu pamiętaj, aby kliknąć Find Refs i Compile i upewnić się, że skrypt kompiluje się poprawnie. Zapisz akcję, a następnie uruchom ją ręcznie lub przypisz ją do komendy albo nagrody za punkty kanału, aby przetestować, czy obraz został wygenerowany poprawnie.

Wklej skrypt i zkompiluj go w Streamer.bot.

Sprawdź pobrany obraz

Gdy akcja zakończy się, możesz przejrzeć zmienne Action za pomocą Action History, aby potwierdzić, że wszystko działało zgodnie z oczekiwaniami.

Tam znajdziesz lokalną ścieżkę do wygenerowanego obrazu, który został zapisany na dysku, w folderze temp_potatohotdog_images w katalogu instalacyjnym Streamer.bot.

Zobacz zmienne wygenerowanych obrazów w historii działań

Otwórz ten folder, aby bezpośrednio zobaczyć pobrany obraz.

Przejrzyj zmienne akcji za pomocą historii akcji w Streamer.bot

Rozwiązywanie problemów

Jeśli skrypt nie zachowuje się zgodnie z oczekiwaniami, najlepszym sposobem na zdiagnozowanie problemu jest sprawdzenie logów działań.

Możesz to zrobić, przeglądając zmienne akcji przez Historię Akcji.

Przejrzyj zmienne akcji za pomocą historii akcji w Streamer.bot

Ten poradnik został po raz pierwszy opublikowany 2026-07-19 i ostatnio zmodyfikowany 2026-07-19.

Inne Podobne Poradniki

Oto inne poradniki krok po kroku, które mogą okazać się przydatne.

Jak połączyć Streamer.bot z AI
Jak połączyć Streamer.bot z AI
Dowiedz się, jak generować darmowe odpowiedzi AI (LLM) dla swojego strumienia na Twitchu w Streamer.bot, korzystając z podakcji Fetch URL i API PotatoHotDog Generate AI Response, nie trzeba żadnego niestandardowego skryptu.
Przeczytaj poradnik
Jak odtwarzać darmowe TTS audio w Streamer.bot z dynamicznymi źródłami przeglądarki
Jak odtwarzać darmowe TTS audio w Streamer.bot z dynamicznymi źródłami przeglądarki
Dowiedz się, jak odtwarzać darmowe AI TTS (Text-to-Speech) audio dla swojego streamu na Twitchu w Streamer.bot, używając Dynamic Browser Source i prostego żądania webhook Fetch URL — bez konieczności pisania własnego skryptu.
Przeczytaj poradnik
Jak odtwarzać darmowe audio TTS w Streamer.bot za pomocą niestandardowego skryptu
Jak odtwarzać darmowe audio TTS w Streamer.bot za pomocą niestandardowego skryptu
Dowiedz się, jak odtwarzać darmowe nagrania AI TTS (Text-to-Speech) dla twojego streama na Twitchu bezpośrednio w Streamer.bot, dodając niestandardowy skrypt Execute Code — Speaker.bot nie jest wymagany.
Przeczytaj poradnik