Komunitně poháněné bezplatné nástroje AI, Text-to-Speech (TTS) a API pro Twitch streamery
Komunitně poháněné bezplatné nástroje AI, Text-to-Speech (TTS) a API pro Twitch streamery

Jak generovat AI obrázky ve Streamer.bot pomocí vlastního skriptu

Zjistěte, jak generovat zdarma AI obrázky pro svůj Twitch stream přímo ve Streamer.bot, přidáním vlastního skriptu Execute Code, bez middleware třetích stran.
Stránka byla pro vaše pohodlí přeložena z angličtiny našimi vysoce motivovanými AI stážisty. Ještě se učí, takže se mohou objevit drobné chyby. Pro co nejpřesnější informace prosím použijte anglickou verzi.
Domov Návody - Jak na to Jak generovat AI obrázky ve Streamer.bot pomocí vlastního skriptu

PotatoHotDog nabízí bezplatné API pro generování AI obrazů, které můžete volat přímo z Streamer.bot, bez potřeby jakéhokoli middleware třetí strany. Tento návod ukazuje, jak přidat malý vlastní skript v C#, který se v rámci akce Execute Code ve Streamer.bot vygeneruje AI obrázek z textového promptu a uloží ho na disk.

Skript potřebuje jen váš PotatoHotDog API klíč a prompt popisující obrázek, který chcete vygenerovat, a stažený obrázek uloží do vyhrazené složky uvnitř instalační složky Streamer.bot.

Připravte si API klíč

Pokud ho ještě nemáte, vygenerujte si API klíč ze svého dashboardu a mějte ho připravený; v dalším kroku ho budete potřebovat.

Přejít na API klíče Vygenerujte API klíč v ovládacím panelu PotatoHotDog

Požadované Argumenty

Aby bylo možné vygenerovat AI obrázek, je třeba ve Streamer.bot zadat dva argumenty ještě před spuštěním podakce Execute Code. Nebo jinak řečeno, je třeba specifikovat tyto dvě věci:

  • API klíč.
  • Instrukce v promptu popisující obrázek, který chcete vygenerovat.

Tyto odpovídají následujícím argumentům Streamer.bot:

  • potatoKey
  • potatoInstructions

Zadáváte argumenty ve své akci tak, že kliknete pravým tlačítkem na Podřízené akce, poté vyberete Přidat, Jádro, Argumenty a nakonec nastavit argument.

Přidejte podřízenou akci Set Argument ve Streamer.bot

Přidání akce Spustit kód ve Streamer.bot

Otevřete Streamer.bot a přejděte na kartu Akce. Vytvořte novou akci, nebo otevřete již existující, a pojmenujte ji tak, abyste ji později poznali, například "PotatoHotDog AI Image".

S vybranou akcí klikněte na Přidat v sekci Podřízené akce, poté zvolte Core a následně Execute C# Code. To přidá podřízenou akci, do které můžete vložit neformátovaný C# kód, který Streamer.bot zkompiluje a spustí za běhu.

Přidejte podřízenou akci Execute C# Code ve Streamer.bot

Vložte níže uvedený skript do editoru kódu. Čte argumenty potatoKey a potatoInstructions, volá naše API pro generování AI obrázků, aby vygenerovalo obrázek a získalo jeho URL, a poté stáhne výsledný obrázek do složky s názvem temp_potatohotdog_images ve vašem instalačním adresáři 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 vložení skriptu nezapomeňte kliknout na Najít Reference a Zkompilovat a ujistěte se, že se kód úspěšně zkompiluje. Uložte akci, poté ji spusťte ručně nebo ji přiřaďte k příkazu nebo k odměně za body kanálu, abyste otestovali, že se obrázek správně vygeneruje.

Vložte skript a zkompilujte ho ve Streamer.bot

Zkontrolujte stažený obrázek

Jakmile akce proběhne, můžete zkontrolovat proměnné Action prostřednictvím Action History a ověřit, že vše fungovalo tak, jak mělo.

Zde najdete lokální cestu, kam byl na disk uložen vygenerovaný obrázek, v adresáři temp_potatohotdog_images ve vašem instalačním adresáři Streamer.bot.

Podívejte se na proměnné vygenerovaných obrázků v historii akcí

Otevřete tu složku a přímo si prohlédněte stažený obrázek.

Prohlédněte si proměnné akce prostřednictvím Historie akcí ve Streamer.bot.

Řešení potíží

Pokud skript nefunguje podle očekávání, nejlepším způsobem, jak ho odladit, je zkontrolovat záznamy akcí.

Můžete to udělat tak, že si prohlédnete proměnné akce prostřednictvím historie akcí.

Prohlédněte si proměnné akce prostřednictvím Historie akcí ve Streamer.bot.

Tento průvodce byl poprvé zveřejněn 2026-07-19 a naposledy byl upraven 2026-07-19.

Další Podobné Průvodce

Zde je několik dalších návodů, které by vám mohly být užitečné.

Jak propojit Streamer.bot s AI
Jak propojit Streamer.bot s AI
Zjistěte, jak generovat bezplatné AI (LLM) odpovědi pro váš Twitch stream v Streamer.bot pomocí podakce Fetch URL a PotatoHotDog Generate AI Response API. Není potřeba žádný vlastní skript.
Přečtěte si průvodce
Jak přehrát zdarma TTS zvuk ve Streamer.bot s dynamickými zdroji prohlížeče
Jak přehrát zdarma TTS zvuk ve Streamer.bot s dynamickými zdroji prohlížeče
Zjistěte, jak zdarma přehrávat AI TTS (Text-to-Speech) audio pro vaše Twitch stream ve Streamer.bot pomocí Dynamic Browser Source a jednoduchého Fetch URL webhook request, žádný vlastní skript není potřeba.
Přečtěte si průvodce
Jak Přehrát Zdarma TTS Zvuk Ve Streamer.bot S Vlastním Skriptem
Jak Přehrát Zdarma TTS Zvuk Ve Streamer.bot S Vlastním Skriptem
Zjistěte, jak přehrávat bezplatné AI TTS (Text-to-Speech) audio pro váš Twitch stream přímo ve Streamer.bot, přidáním vlastního skriptu Execute Code. Speaker.bot není potřeba.
Přečtěte si průvodce