Бесплатные AI-инструменты, TTS и API, поддерживаемые сообществом, для стримеров Twitch
Бесплатные AI-инструменты, TTS и API, поддерживаемые сообществом, для стримеров Twitch

Как сгенерировать ИИ-изображения в Streamer.bot с помощью собственного скрипта

Узнайте, как генерировать бесплатные изображения с искусственным интеллектом для вашего Twitch-стрима прямо внутри Streamer.bot, добавив собственный скрипт Execute Code — без стороннего промежуточного ПО.
Эта страница переведена с английского нашими очень мотивированными стажёрами по ИИ для вашего удобства. Они ещё учатся, поэтому могли быть допущены некоторые ошибки. Для самой точной информации, пожалуйста, смотрите английскую версию.
Дом Гайды Как сгенерировать ИИ-изображения в Streamer.bot с помощью собственного скрипта

PotatoHotDog предлагает бесплатный API для генерации изображений с ИИ, который можно вызывать напрямую из Streamer.bot, без необходимости использования какого-либо стороннего промежуточного ПО. Это руководство показывает, как добавить небольшой пользовательский скрипт на C# к поддействию Execute Code в Streamer.bot. Этот скрипт генерирует изображение ИИ по текстовому промпту и сохраняет его на диск.

Скрипту нужен только ваш API-ключ PotatoHotDog и промпт, описывающий изображение, которое вы хотите сгенерировать, и он сохраняет скачанное изображение в отдельной папке внутри директории установки Streamer.bot.

Подготовьте ключ API

Если у вас его еще нет, сгенерируйте API-ключ в панели управления и держите его под рукой — он понадобится вам на следующем шаге.

Перейти к API-ключам Сгенерируйте API-ключ в панели управления PotatoHotDog

Предварительные Аргументы

Чтобы сгенерировать изображение на основе ИИ, перед выполнением подзадачи Execute Code в Streamer.bot необходимо указать два аргумента. Иными словами, эти две вещи нужно указать:

  • API-ключ.
  • Инструкции к промпту, описывающие изображение, которое вы хотите сгенерировать.

Они соответствуют следующим аргументам Streamer.bot:

  • potatoKey
  • potatoInstructions

Вы задаёте аргументы в вашем действии, щёлкнув правой кнопкой мыши по Поддействиям, а затем выбрав Добавить, Ядро, Аргументы и, наконец, Установить аргумент.

Добавить вложенное действие Set Argument в Streamer.bot

Добавление действия Execute Code в Streamer.bot

Откройте Streamer.bot и перейдите на вкладку Actions. Создайте новое действие или откройте существующее и дайте ему имя, которое вы сможете узнать позже, например «PotatoHotDog AI Image».

При выборе действия нажмите Добавить в разделе Под действия, затем выберите Core, а затем Выполнить код на C#. Это добавит поддействие, в которое можно вставлять сырой код на C#, который Streamer.bot компилирует и выполняет на лету.

Добавить вложенное действие «Выполнить код на C#» в Streamer.bot

Вставьте ниже приведённый скрипт в редактор кода. Он читает аргументы potatoKey и potatoInstructions, вызывает наш API генерации изображений на основе ИИ, чтобы сгенерировать изображение и получить его URL, а затем скачивает полученное изображение в папку с названием temp_potatohotdog_images внутри каталога установки 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; } }

После вставки скрипта не забудьте нажать Find Refs и Compile и убедиться, что он компилируется успешно. Сохраните действие, затем запустите его вручную или привяжите к команде или вознаграждению за очки канала, чтобы проверить, что изображение генерируется правильно.

Вставьте скрипт и скомпилируйте его в Streamer.bot

Просмотреть загруженное изображение

После выполнения действия вы можете проверить переменные действия через Историю действий, чтобы убедиться, что всё прошло как ожидалось.

Здесь вы найдете локальный путь к сгенерированному изображению, сохранённому на диске, внутри папки temp_potatohotdog_images в каталоге установки Streamer.bot.

Посмотрите переменные сгенерированных изображений в истории действий

Откройте эту папку, чтобы напрямую просмотреть загруженное изображение.

Просматривайте переменные действий через Историю действий в Streamer.bot

Устранение неполадок

Если скрипт ведёт себя не так, как ожидается, лучший способ устранить проблему — проверить логи действий.

Вы можете сделать это, просмотрев ваши Action переменные через Action History.

Просматривайте переменные действий через Историю действий в Streamer.bot

Это руководство впервые опубликовано 2026-07-19, и последнее изменение состоялось 2026-07-19.

Другие похожие руководства

Вот ещё несколько руководств, которые могут быть вам полезны.

Как подключить Streamer.bot к ИИ
Как подключить Streamer.bot к ИИ
Узнайте, как генерировать бесплатные ответы ИИ (LLM) для вашего стрима на Twitch в Streamer.bot с помощью вложенного действия Fetch URL и API PotatoHotDog Generate AI Response — без необходимости писать свой кастомный скрипт.
Прочитать руководство
Как воспроизводить бесплатное TTS‑аудио в Streamer.bot с динамическими источниками браузера
Как воспроизводить бесплатное TTS‑аудио в Streamer.bot с динамическими источниками браузера
Узнайте, как воспроизводить бесплатное аудио на основе ИИ TTS (Text-to-Speech) для вашего стрима на Twitch в Streamer.bot с использованием Dynamic Browser Source и простого запроса вебхука Fetch URL — без необходимости писать собственный скрипт.
Прочитать руководство
Как воспроизводить бесплатное TTS-аудио в Streamer.bot с помощью настраиваемого скрипта
Как воспроизводить бесплатное TTS-аудио в Streamer.bot с помощью настраиваемого скрипта
Узнайте, как воспроизводить бесплатное AI TTS (Text-to-Speech) аудио для вашего стрима на Twitch прямо внутри Streamer.bot, добавив пользовательский скрипт Execute Code, Speaker.bot не требуется.
Прочитать руководство