Бесплатные 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 не требуется.
Прочитать руководство