Δωρεάν εργαλεία AI, υποστηριζόμενα από την κοινότητα, TTS και APIs για Twitch Streamers
Δωρεάν εργαλεία AI, υποστηριζόμενα από την κοινότητα, TTS και APIs για Twitch Streamers

Πώς Να Δημιουργήσετε Εικόνες AI Στο Streamer.bot Με Ένα Προσαρμοσμένο Script

Μάθε πώς να δημιουργείς δωρεάν εικόνες AI για το stream σου στο Twitch απευθείας μέσα από το Streamer.bot, προσθέτοντας ένα προσαρμοσμένο Execute Code script, χωρίς ενδιάμεσο λογισμικό τρίτων.
Αυτή η σελίδα μεταφράστηκε από τα Αγγλικά από τους εξαιρετικά κινητοποιημένους βοηθούς τεχνητής νοημοσύνης μας προς διευκόλυνσή σας. Μαθαίνουν ακόμα, οπότε μπορεί να έχουν ξεφύγει μερικά λάθη. Για τις πιο ακριβείς πληροφορίες, παρακαλούμε ανατρέξτε στην αγγλική έκδοση.
Σπίτι Οδηγοί βήμα προς βήμα Πώς Να Δημιουργήσετε Εικόνες AI Στο Streamer.bot Με Ένα Προσαρμοσμένο Script

Το PotatoHotDog προσφέρει ένα δωρεάν API Δημιουργίας Εικόνων AI που μπορείτε να καλέσετε απευθείας από το Streamer.bot, χωρίς να χρειάζεται κανένα middleware τρίτου μέρους. Ο οδηγός αυτός σας δείχνει πώς να προσθέσετε ένα μικρό προσαρμοσμένο script C# σε μια υποενέργεια Εκτέλεση Κώδικα του Streamer.bot που δημιουργεί μια εικόνα AI από μια προτροπή κειμένου και την κατεβάζει στον δίσκο.

Το σενάριο χρειάζεται μόνο το κλειδί API του PotatoHotDog και ένα prompt που περιγράφει την εικόνα που θέλετε να δημιουργηθεί, και αποθηκεύει τη ληφθείσα εικόνα σε έναν ειδικό φάκελο μέσα στον φάκελο εγκατάστασης του Streamer.bot.

Δημιουργήστε ένα κλειδί API

Αν δεν έχετε ήδη ένα, δημιουργήστε ένα κλειδί API από τον πίνακα ελέγχου σας και κρατήστε το έτοιμο — θα το χρειαστείτε στο επόμενο βήμα.

Μεταβείτε στα κλειδιά API Δημιουργήστε ένα κλειδί API στον πίνακα ελέγχου PotatoHotDog

Απαιτούμενες Παράμετροι

Για να δημιουργηθεί μια εικόνα AI, δύο παράμετροι πρέπει να οριστούν στο Streamer.bot πριν από την εκτέλεση της υποενέργειας Execute Code. Ή, με άλλα λόγια, αυτά τα δύο πράγματα πρέπει να οριστούν:

  • Ένα κλειδί API.
  • Οι οδηγίες του prompt που περιγράφουν την εικόνα που θέλετε να δημιουργήσετε.

Αυτά αντιστοιχούν στα ακόλουθα ορίσματα του Streamer.bot:

  • potatoKey
  • potatoInstructions

Ορίζετε παραμέτρους στην ενέργειά σας πατώντας δεξί κλικ στις Υποενέργειες, και επιλέγοντας Προσθήκη, Κύριος, Παράμετροι, και τελικά Ορισμός Παραμέτρου.

Πρόσθεσε μια υποενέργεια «Θέσε Παράμετρο» στο Streamer.bot

Προσθήκη μίας ενέργειας Εκτέλεσης Κώδικα στο Streamer.bot

Ανοίξτε το Streamer.bot και μεταβείτε στην καρτέλα Ενέργειες. Δημιουργήστε μια νέα ενέργεια, ή ανοίξτε μια υπάρχουσα, και δώστε της ένα όνομα που θα την αναγνωρίζετε αργότερα, όπως "PotatoHotDog AI Image".

Με την ενέργειά σας επιλεγμένη, κάντε κλικ στο Προσθήκη κάτω από Υποενέργειες, στη συνέχεια επιλέξτε Core ακολουθούμενο από Execute C# Code. Αυτό προσθέτει μια υποενέργεια στην οποία μπορείτε να επικολλήσετε ακατέργαστο κώδικα C# που το Streamer.bot μεταγλωττίζει και εκτελεί επί τόπου.

Προσθήκη υποενέργειας Εκτέλεση Κώδικα C# στο Streamer.bot

Επικολλήστε τον παρακάτω κώδικα στον επεξεργαστή κώδικα. Διαβάζει τις παραμέτρους potatoKey και potatoInstructions, καλεί το Generate AI Image 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; } }

Μετά την επικόλληση του script, θυμήσου να κάνεις κλικ στο Find Refs και στο Compile και να βεβαιωθείς ότι μεταγλωττίζεται επιτυχώς. Αποθήκευσε τη δράση, έπειτα ενεργοποίησέ τη χειροκίνητα ή σύνδεσέ την με μια εντολή ή με μια ανταμοιβή σημείων καναλιού για να δοκιμάσεις ότι η εικόνα παράγεται σωστά.

Επικολλήστε το script και μεταγλωττίστε το στο Streamer.bot

Ελέγξτε την κατεβασμένη εικόνα

Μόλις η δράση έχει εκτελεστεί, μπορείτε να ελέγξετε τις μεταβλητές δράσης μέσω του ιστορικού δράσεων, ώστε να επαληθεύσετε ότι όλα λειτούργησαν όπως αναμενόταν.

Εκεί θα βρείτε τη τοπική διαδρομή όπου αποθηκεύτηκε η παραχθείσα εικόνα στον δίσκο, μέσα στον φάκελο temp_potatohotdog_images στον κατάλογο εγκατάστασης του Streamer.bot.

Ελέγξτε τις μεταβλητές των παραγόμενων εικόνων στο ιστορικό ενεργειών

Ανοίξτε εκείνον τον φάκελο για να δείτε απευθείας την κατεβασμένη εικόνα.

Ελέγξτε τις μεταβλητές δράσης μέσω του ιστορικού δράσεων στο Streamer.bot

Επίλυση προβλημάτων

Αν το script δεν συμπεριφέρεται όπως αναμενόταν, ο καλύτερος τρόπος για να το αντιμετωπίσετε είναι ο έλεγχος των καταγραφών ενεργειών.

Μπορείτε να το κάνετε αυτό εξετάζοντας τις μεταβλητές δράσης μέσω του Action History.

Ελέγξτε τις μεταβλητές δράσης μέσω του ιστορικού δράσεων στο Streamer.bot

Αυτός ο οδηγός δημοσιεύτηκε για πρώτη φορά στις 19-07-2026 και τροποποιήθηκε τελευταία στις 19-07-2026.

Άλλοι Παρόμοιοι Οδηγοί

Εδώ θα βρείτε μερικούς ακόμη οδηγούς βήμα προς βήμα που ίσως σας φανούν χρήσιμοι.

Πώς να συνδέσετε το Streamer.bot με μια τεχνητή νοημοσύνη
Πώς να συνδέσετε το Streamer.bot με μια τεχνητή νοημοσύνη
Μάθε πώς να δημιουργείς δωρεάν απαντήσεις AI (LLM) για το Twitch stream σου στο Streamer.bot χρησιμοποιώντας μια υποενέργεια Fetch URL και το PotatoHotDog Generate AI Response API, δεν χρειάζεται προσαρμοσμένο σκριπτ.
Διάβασε τον οδηγό
Πώς να Παίζετε Δωρεάν ήχο TTS στο Streamer.bot Με Δυναμικές Πηγές Περιήγησης
Πώς να Παίζετε Δωρεάν ήχο TTS στο Streamer.bot Με Δυναμικές Πηγές Περιήγησης
Μάθετε πώς να παίζετε δωρεάν AI TTS (Text-to-Speech) ήχο για το Twitch stream σας στο Streamer.bot χρησιμοποιώντας μια Dynamic Browser Source και ένα απλό αίτημα webhook URL μέσω Fetch, χωρίς να χρειάζεται κανένα προσαρμοσμένο σκριπτ.
Διάβασε τον οδηγό
Πώς να παίζετε δωρεάν ήχο TTS στο Streamer.bot με ένα προσαρμοσμένο σενάριο
Πώς να παίζετε δωρεάν ήχο TTS στο Streamer.bot με ένα προσαρμοσμένο σενάριο
Μάθετε πώς να παίζετε δωρεάν AI TTS (Μετατροπή κειμένου σε ομιλία) ήχο για το Twitch stream σας απευθείας μέσα στο Streamer.bot, προσθέτοντας ένα προσαρμοσμένο σενάριο Εκτέλεσης Κώδικα, δεν απαιτείται Speaker.bot.
Διάβασε τον οδηγό