Besplatni AI alati podržani zajednicom, TTS i API-jevi za Twitch streamere
Besplatni AI alati podržani zajednicom, TTS i API-jevi za Twitch streamere

Kako generirati AI slike u Streamer.bot pomoću prilagođene skripte

Saznajte kako generirati besplatne AI slike za vaš Twitch stream izravno unutar Streamer.bot-a, dodavanjem prilagođene skripte Execute Code, bez potrebe za middleware-om treće strane.
Ovu stranicu preveli su s engleskog naši visoko motivirani AI pripravnici radi vaše udobnosti. Još su u fazi učenja, pa se mogu provući pogreške. Za najtočnije informacije molimo pogledajte englesku verziju.
Dom Vodiči za upotrebu Kako generirati AI slike u Streamer.bot pomoću prilagođene skripte

PotatoHotDog nudi besplatan API za generiranje AI slika koji možete pozvati izravno iz Streamer.bot, bez potrebe za trećom stranom middleware-om. Ovaj vodič pokazuje kako dodati malu prilagođenu C# skriptu u Streamer.bot Execute Code podakciju koja generira AI sliku iz tekstualnog prompta i preuzima ju na disk.

Skripta treba samo vaš PotatoHotDog API ključ i prompt koji opisuje sliku koju želite generirati, a pohranjuje preuzetu sliku u namjensku mapu unutar instalacijskog direktorija Streamer.bot.

Pripremite API ključ

Ako ga još nemate, generirajte API ključ iz nadzorne ploče i držite ga pri ruci, trebat će vam u sljedećem koraku.

Idi na API ključeve Generiraj API ključ u PotatoHotDog nadzornoj ploči

Preduvjetni Argumenti

Kako biste generirali AI sliku, potrebno je navesti dva argumenta u Streamer.bot prije izvođenja podakcije Execute Code. Drugim riječima, ove dvije stvari trebaju biti navedene:

  • API ključ.
  • Upute za prompt koje opisuju sliku koju želite generirati.

Ovo se odnosi na sljedeće argumente Streamer.bot-a:

  • potatoKey
  • potatoInstructions

Navedete argumente u svojoj akciji desnim klikom na Podakcije, zatim odaberite Dodaj, Jezgra, Argumenti i na kraju Postavi Argument.

Dodaj podakciju Set Argument u Streamer.bot

Dodavanje akcije Izvrši Kod u Streamer.bot

Otvorite Streamer.bot i idite na karticu Akcije. Kreirajte novu akciju ili otvorite postojeću i dodijelite joj naziv koji ćete kasnije prepoznati, na primjer "PotatoHotDog AI Image".

Kad je vaša akcija odabrana, kliknite Dodaj ispod Pod Akcije, zatim odaberite Core, a zatim Izvrši C# kod. Ovo dodaje podakciju u kojoj možete zalijepiti neobrađeni C# kod koji Streamer.bot kompajlira i pokreće u realnom vremenu.

Dodaj podakciju Izvrši C# kod u Streamer.bot

Zalijepi sljedeću skriptu u uređivač koda. On čita argumente potatoKey i potatoInstructions, poziva naš API za generiranje AI slika kako bi generirao sliku i dohvaćao njezin URL, a zatim preuzima dobivenu sliku u mapu nazvanu temp_potatohotdog_images unutar vašeg instalacijskog direktorija 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; } }

Nakon što zalijepite skriptu, sjetite se da kliknete na Find Refs i Compile i provjerite da se kompajlira uspješno. Spremite akciju, zatim pokrenite je ručno ili je povežite s naredbom ili nagradom za kanalske bodove kako biste testirali da se slika generira ispravno.

Zalijepi skriptu i kompajliraj ju u Streamer.bot

Pregledajte preuzetu sliku

Kad se radnja izvrši, možete pregledati varijable radnje putem Povijesti radnji kako biste potvrdili da je sve funkcioniralo kako se očekivalo.

Tamo ćete pronaći lokalnu putanju na kojoj je generirana slika spremljena na disk, unutar mape temp_potatohotdog_images u vašem direktoriju instalacije Streamer.bot.

Pregledajte varijable generiranih slika u povijesti akcija

Otvorite tu mapu da biste izravno pogledali preuzetu sliku.

Pregledajte varijable akcije putem povijesti radnji u Streamer.bot

Rješavanje problema

Ako se skripta ne ponaša onako kako se očekuje, najbolji je način za rješavanje problema provjeriti logove radnji.

Možete to učiniti pregledom svojih Action varijabli putem Action History.

Pregledajte varijable akcije putem povijesti radnji u Streamer.bot

Ovaj vodič je prvi put objavljen 2026-07-19 i posljednji put ažuriran 2026-07-19.

Ostali Slični Vodiči

Evo još nekoliko vodiča o tome kako nešto učiniti koji bi vam mogli biti korisni.

Kako povezati Streamer.bot s umjetnom inteligencijom
Kako povezati Streamer.bot s umjetnom inteligencijom
Saznajte kako generirati besplatne AI (LLM) odgovore za vaš Twitch strim u Streamer.bot koristeći Fetch URL kao podakciju i PotatoHotDog Generate AI Response API, nema potrebe za prilagođenom skriptom.
Pročitaj Vodič
Kako reproducirati besplatan TTS zvuk u Streamer.bot s dinamičkim izvorima preglednika
Kako reproducirati besplatan TTS zvuk u Streamer.bot s dinamičkim izvorima preglednika
Saznajte kako reproducirati besplatan AI TTS zvuk za vaš Twitch stream u Streamer.bot koristeći Dynamic Browser Source i jednostavan Fetch URL webhook zahtjev, bez potrebe za prilagođenim skriptama.
Pročitaj Vodič
Kako reproducirati besplatan TTS zvuk u Streamer.bot uz prilagođenu skriptu
Kako reproducirati besplatan TTS zvuk u Streamer.bot uz prilagođenu skriptu
Naučite kako reproducirati besplatan AI TTS (Text-to-Speech) zvuk za vaš Twitch stream izravno unutar Streamer.bot, dodavanjem prilagođene skripte Execute Code, Speaker.bot nije potreban.
Pročitaj Vodič