Eines d'IA gratuïtes impulsades per la comunitat, TTS i APIs per als streamers de Twitch
Eines d'IA gratuïtes impulsades per la comunitat, TTS i APIs per als streamers de Twitch

Com generar imatges d'IA en Streamer.bot amb un script personalitzat

Aprèn com generar imatges d'IA gratuïtes per al teu stream de Twitch directament dins Streamer.bot, afegint un script personalitzat d'Executar Codi, no cal cap middleware de tercers.
Aquesta pàgina s'ha traduït de l'anglès pels nostres interns d'IA, molt motivats, pensant en la vostra comoditat. Encara estan aprenent, així que és possible que s'hagi escapat alguna errada. Per a la informació més precisa, consulteu la versió en anglès.
a casa Guies Pràctiques Com generar imatges d'IA en Streamer.bot amb un script personalitzat

PotatoHotDog ofereix una API gratuïta de Generació d'Imatges IA que pots cridar directament des de Streamer.bot, sense necessitat de cap middleware de tercers. Aquesta guia t'ensenya com afegir un petit script personalitzat en C# a una subacció Execute Code de Streamer.bot que genera una imatge IA a partir d'un prompte de text i la descarrega al disc.

El script només necessita la teva clau API de PotatoHotDog i un prompt que descrigui la imatge que vols generar, i guarda la imatge descarregada en una carpeta dedicada dins del directori d'instal·lació de Streamer.bot.

Prepara una clau d'API

Si encara no en tens una, genera una clau d'API des del teu tauler i mantén-la preparada, la necessitaràs al proper pas.

Accedir a les claus d'API Genera una clau d'API al panell de control de PotatoHotDog

Paràmetres prerequisits

Per generar una imatge amb IA, cal especificar dos paràmetres en Streamer.bot abans que s'executi la subacció Execute Code. O, dit d'una altra manera, cal especificar aquestes dues coses:

  • Una clau d'API.
  • Les instruccions del prompt que descriuen la imatge que vols generar.

Aquests corresponen als següents arguments de Streamer.bot:

  • potatoKey
  • potatoInstructions

Especifica paràmetres a la teva acció fent clic dret sobre Sub Accions, després selecciona Afegeix, Núcli, Paràmetres, i finalment Defineix Paràmetre.

Afegeix una subacció Set Argument a Streamer.bot

Afegint una acció d'Execució de Codi a Streamer.bot

Obre Streamer.bot i ves a la pestanya Accions. Crea una nova acció, o obre-ne una existent, i dóna-li un nom que reconeguis més tard, com ara "PotatoHotDog AI Image".

Amb l'acció seleccionada, feu clic a Afegir sota Subaccions, després trieu Core seguit de Execute C# Code. Això afegeix una subacció on podeu enganxar codi C# en brut que Streamer.bot compila i executa en temps real.

Afegeix una subacció d'Executar codi C# en Streamer.bot

Enganxeu el script que teniu a continuació a l'editor de codi. Llegeix els arguments potatoKey i potatoInstructions, crida la nostra Generate AI Image API per generar la imatge i obtenir la seva URL, i després descarrega la imatge resultant a una carpeta anomenada temp_potatohotdog_images dins del directori d'instal·lació de 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; } }

Després d'enganxar el script, recorda fer clic a Find Refs i a Compile i assegurar-te que compila correctament. Desa l'acció, després activa-la manualment o vincula-la a una comanda o a una recompensa de punts del canal per provar que la imatge es genera correctament.

Enganxa el script i compila'l a Streamer.bot

Revisa la imatge descarregada.

Un cop l'acció s'ha executat, podeu inspeccionar les variables d'acció a través del Historial d'Accions per confirmar que tot ha funcionat com s'esperava.

Allà trobaràs la ruta local on s'ha desat la imatge generada al disc, dins de la carpeta temp_potatohotdog_images del directori d'instal·lació de Streamer.bot.

Consulta les variables de les imatges generades en l'historial d'accions

Obre aquella carpeta per veure la imatge descarregada directament.

Consulta les variables d'acció mitjançant l'historial d'accions en Streamer.bot

Resolució de problemes

Si el script no funciona com s'espera, la millor manera de resoldre-ho és revisar els registres d'accions.

Podeu fer-ho inspeccionant les vostres variables d'acció mitjançant l'historial d'accions.

Consulta les variables d'acció mitjançant l'historial d'accions en Streamer.bot

Aquesta guia va ser publicada per primera vegada el 2026-07-19 i va ser modificada per última vegada el 2026-07-19.

Altres Guies Similars

Aquí tens d'altres guies pràctiques que et podrían ser útils.

Com connectar Streamer.bot a una IA
Com connectar Streamer.bot a una IA
Aprèn com generar respostes gratuïtes d'IA (LLM) per a la teva emissió de Twitch a Streamer.bot utilitzant una subacció d'URL Fetch i l'API PotatoHotDog Generate AI Response, no cal cap script personalitzat.
Llegir la Guia
Com Reproduir Àudio TTS Gratuït En Streamer.bot Amb Fonts Del Navegador Dinàmiques
Com Reproduir Àudio TTS Gratuït En Streamer.bot Amb Fonts Del Navegador Dinàmiques
Aprèn com reproduirà àudio IA TTS (Text-to-Speech) gratuït per al teu stream de Twitch a Streamer.bot utilitzant una font de navegador dinàmica i una simple petició webhook Fetch URL, sense necessitat d'un script personalitzat.
Llegir la Guia
Com Reproduir Àudio TTS Gratuït a Streamer.bot Amb un Script Personalitzat
Com Reproduir Àudio TTS Gratuït a Streamer.bot Amb un Script Personalitzat
Aprèn a reproduir l'àudio IA TTS (Text-to-Speech) gratuït per al teu stream de Twitch directament dins Streamer.bot, afegint un script personalitzat Execute Code, no cal Speaker.bot.
Llegir la Guia