Alat AI Gratis yang Didukung Komunitas, TTS dan API untuk Para Streamer Twitch
Alat AI Gratis yang Didukung Komunitas, TTS dan API untuk Para Streamer Twitch

Cara Menghasilkan Gambar AI di Streamer.bot Dengan Skrip Kustom

Pelajari cara menghasilkan gambar AI gratis untuk siaran Twitch Anda langsung di Streamer.bot, dengan menambahkan skrip Eksekusi Kode kustom, tanpa middleware pihak ketiga yang diperlukan.
Halaman ini telah diterjemahkan dari bahasa Inggris oleh para magang AI kami yang sangat termotivasi demi kenyamanan Anda. Mereka masih belajar, jadi mungkin ada beberapa kesalahan yang terlewat. Untuk informasi yang paling akurat, silakan merujuk ke versi bahasa Inggrisnya.
Rumah Panduan Cara Praktis Cara Menghasilkan Gambar AI di Streamer.bot Dengan Skrip Kustom

PotatoHotDog menawarkan API Gambar AI Gratis yang bisa Anda panggil langsung dari Streamer.bot, tanpa perlu middleware pihak ketiga. Panduan ini menunjukkan cara menambahkan skrip C# kustom kecil ke sub-aksi Eksekusi Kode pada Streamer.bot yang menghasilkan gambar AI dari prompt teks dan mengunduhnya ke disk.

Script ini hanya memerlukan kunci API PotatoHotDog Anda dan sebuah prompt yang menggambarkan gambar yang ingin Anda buat, dan script tersebut menyimpan gambar yang diunduh ke dalam folder khusus di dalam direktori instalasi Streamer.bot Anda.

Siapkan kunci API

Jika Anda belum memilikinya, buat kunci API dari dashboard Anda dan siapkan kunci API-nya. Anda akan membutuhkannya pada langkah berikutnya.

Ke Kunci API Buat kunci API di dasbor PotatoHotDog

Argumen Prasyarat

Untuk menghasilkan gambar AI, dua argumen perlu ditentukan di Streamer.bot sebelum sub action Execute Code dijalankan. Atau, dengan kata lain, kedua hal ini perlu ditentukan:

  • Kunci API.
  • Instruksi prompt yang menjelaskan gambar yang ingin Anda hasilkan.

Berikut adalah argumen Streamer.bot yang terkait:

  • potatoKey
  • potatoInstructions

Anda menentukan argumen dalam tindakan Anda dengan mengklik kanan pada Sub Actions, lalu memilih Add, Core, Arguments, dan akhirnya Set Argument.

Tambahkan sub-aksi Set Argument di Streamer.bot

Menambahkan Aksi Eksekusi Kode di Streamer.bot

Buka Streamer.bot dan pergi ke tab Aksi. Buat aksi baru, atau buka yang sudah ada, dan beri namanya yang akan kamu kenali nanti, seperti "PotatoHotDog AI Image".

Dengan aksi Anda dipilih, klik Tambah di bawah Sub Actions, lalu pilih Core, diikuti oleh Execute C# Code. Ini menambahkan sub action di mana Anda dapat menempelkan kode C# mentah yang dikompilasi dan dijalankan oleh Streamer.bot secara langsung.

Tambahkan sub-aksi Eksekusi Kode C# di Streamer.bot

Tempel skrip di bawah ini ke editor kode. Ini membaca argumen potatoKey dan potatoInstructions, memanggil API Generate AI Image kami untuk menghasilkan gambar dan mengambil URL-nya, dan kemudian mengunduh gambar yang dihasilkan ke dalam folder bernama temp_potatohotdog_images di dalam direktori instalasi Streamer.bot Anda.

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; } }

Setelah menempelkan skrip, ingat untuk klik Find Refs dan Compile, dan pastikan itu berhasil dikompilasi. Simpan aksi tersebut, lalu jalankan secara manual atau hubungkan ke sebuah perintah atau hadiah poin saluran untuk menguji bahwa gambar tersebut dihasilkan dengan benar.

Tempelkan skripnya dan kompilasikan di Streamer.bot

Periksa gambar yang diunduh

Setelah tindakan selesai dijalankan, Anda dapat memeriksa variabel Action melalui Riwayat Action untuk memastikan semuanya berjalan seperti yang diharapkan.

Di sana Anda akan menemukan jalur lokal tempat gambar yang dihasilkan disimpan di disk, di dalam folder temp_potatohotdog_images di direktori instalasi Streamer.bot Anda.

Lihat variabel gambar yang dihasilkan dalam riwayat tindakan

Buka folder itu untuk melihat gambar yang diunduh secara langsung.

Lihat variabel Aksi melalui Riwayat Aksi di Streamer.bot

Pemecahan masalah

Jika skrip tidak berjalan seperti yang diharapkan, cara terbaik untuk memecahkan masalahnya adalah dengan memeriksa log tindakan.

Anda bisa melakukannya dengan memeriksa variabel Action Anda melalui Action History.

Lihat variabel Aksi melalui Riwayat Aksi di Streamer.bot

Panduan ini pertama kali diterbitkan pada 2026-07-19 dan terakhir kali diubah pada 2026-07-19.

Panduan Serupa Lainnya

Berikut adalah beberapa panduan cara lain yang mungkin berguna bagi Anda.

Cara Menghubungkan Streamer.bot ke AI
Cara Menghubungkan Streamer.bot ke AI
Pelajari cara menghasilkan respon AI (LLM) gratis untuk siaran Twitch Anda di Streamer.bot dengan menggunakan sub aksi Fetch URL dan PotatoHotDog Generate AI Response API, tidak perlu skrip kustom.
Baca Panduan
Cara Memainkan Audio TTS Gratis di Streamer.bot Dengan Sumber Peramban Dinamis
Cara Memainkan Audio TTS Gratis di Streamer.bot Dengan Sumber Peramban Dinamis
Pelajari cara memutar audio AI TTS (Text-to-Speech) gratis untuk siaran Twitch Anda di Streamer.bot menggunakan Dynamic Browser Source dan permintaan webhook URL Fetch yang sederhana, tanpa skrip kustom.
Baca Panduan
Cara Memainkan Audio TTS Gratis di Streamer.bot dengan Skrip Kustom
Cara Memainkan Audio TTS Gratis di Streamer.bot dengan Skrip Kustom
Pelajari cara memutar audio AI TTS (Text-to-Speech) gratis untuk siaran Twitch Anda langsung di Streamer.bot, dengan menambahkan skrip Execute Code kustom, tidak memerlukan Speaker.bot.
Baca Panduan