Pruébalo antes de usarlo
Este script abre el Key System con una sola key válida, COOKIES-DEMO (sin distinguir mayúsculas). Pégalo en tu executor y prueba a escribir una key mal y una bien:
local KeySystem = loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/Cookieskeysystem.lua"))()
local ok, key = KeySystem.Prompt({
Title = "Test",
Keys = { "COOKIES-DEMO" },
CaseSensitive = false,
SaveKey = false,
})
print("Key valid:", ok, key)También está dentro del menú de prueba de CookiesLib: abre la pestaña Personalizar y pulsa Abrir key system. Allí la key también es COOKIES-DEMO, y con 3 errores se activa una espera de 10 segundos.
loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/CookiesDemo.lua"))()Inicio rápido
Carga la librería y el Key System, pide la key y, solo si es válida, crea tu ventana. Si le pasas Library, el Key System usa su tema (incluido el que eligió el jugador) y sus fuentes.
local Library = loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/CookiesLib.lua"))()
local KeySystem = loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/Cookieskeysystem.lua"))()
local ok, key = KeySystem.Prompt({
Library = Library,
Title = "My Hub",
Subtitle = "Key System",
KeyLink = "https://example.com/get-key",
DiscordLink = "https://discord.gg/xxxxxx",
Keys = { "COOKIE-1234", "COOKIE-5678" },
})
if not ok then return end
local Window = Library:CreateWindow({ Title = "My Hub" })KeySystem.Prompt(opciones) espera hasta que el jugador valida o cierra, y devuelve ok, key. Es un atajo de KeySystem.new(opciones):Wait().
Cómo se valida la key
Se usa el primer método disponible, en este orden:
- 1`KeyForge`: servicio externo de keys (ver más abajo).
- 2`Validate`: tu propia función.
- 3`KeyUrl`: una URL con una key por línea (se guarda en caché 30 segundos).
- 4`Keys`: una lista dentro del script.
Validate = function(key)
if key == "secret" then
return true, "Welcome"
end
return false, "Wrong key"
end,
KeyUrl = "https://raw.githubusercontent.com/user/repo/main/keys.txt",Validate devuelve si la key es válida y, opcionalmente, un mensaje para el jugador. Los espacios al principio y al final de la key se ignoran, y con CaseSensitive = false da igual escribir en mayúsculas o minúsculas.
Una lista Keys dentro del script la puede leer cualquiera que abra el script. Para algo serio usa KeyUrl, Validate contra tu servidor o KeyForge.
Personalizarlo
Puedes cambiar el tema, el color, los textos y los pasos de ayuda. Este ejemplo lo deja con tema rosa y los textos en español:
KeySystem.new({
Library = Library,
Theme = "Strawberry",
Accent = Color3.fromRGB(255, 105, 140),
Title = "Mi Hub",
Subtitle = "Acceso",
Description = "Escribe tu key para desbloquear el hub.",
Steps = {
"Pulsa Get key para copiar el enlace",
"Completa los pasos en tu navegador",
"Pega tu key y pulsa Verify",
},
Keys = { "COOKIE-1234" },
CaseSensitive = false,
MaxAttempts = 3,
Cooldown = 10,
Blur = true,
})| Opción | Por defecto | Qué hace |
|---|---|---|
Library | nil | Hereda el tema y las fuentes de CookiesLib |
Theme | nil | Nombre de un tema de CookiesLib o tabla de colores |
Accent | nil | Color de acento solo para el Key System |
Title / Subtitle | "Cookies Hub" / "Key System" | Textos de la cabecera |
Logo | logo de Cookies | Imagen; false la quita |
Description | texto en inglés | Texto bajo el título |
Steps | 3 pasos en inglés | Hasta 3 pasos en el panel «Need a key?» |
Note | nil | Texto libre en lugar de los pasos |
KeyLink | nil | Enlace del botón Get key |
DiscordLink | nil | Botón Join Discord |
CaseSensitive | true | false ignora mayúsculas y minúsculas |
SaveKey | true | Permite recordar la key en el dispositivo |
AutoVerify | true | Verifica sola la key guardada al abrir |
MaxAttempts | 5 | Intentos fallidos antes del bloqueo |
Cooldown | 15 | Segundos de bloqueo |
Blur / Shadow | true | Desenfoque del fondo y sombra de la ventana |
Folder / FileName | "CookiesHub" / auto | Dónde se guarda la key |
Id | automático | Separa la key y el bloqueo de cada script |
Los botones aparecen solo si tienen algo que hacer: Get key con KeyLink o KeyForge, Join Discord con DiscordLink, y Paste si el executor tiene portapapeles.
Objeto y eventos
KeySystem.new devuelve un objeto que puedes controlar desde tu script:
local ks = KeySystem.new({ Keys = { "COOKIE-1234" } })
local ok, key = ks:Wait()
ks:Submit("COOKIE-1234")
ks:SetStatus("Checking...", "Warning")
ks:Close()
ks:Destroy()| Método | Qué hace |
|---|---|
ks:Wait() | Espera hasta terminar y devuelve success, key |
ks:Submit(key) | Envía una key por código (sin argumento usa lo escrito) |
ks:SetStatus(texto, tipo) | Mensaje bajo el botón: Success, Warning, Error o nil |
ks:Close() | Cierra sin validar |
ks:Destroy() | Cierra y limpia todo |
En vez de esperar con Wait() puedes usar eventos:
KeySystem.new({
Keys = { "COOKIE-1234" },
OnSuccess = function(key)
loadstring(game:HttpGet("https://example.com/my-hub.lua"))()
end,
OnFail = function(key, message)
warn("Wrong key:", key, message)
end,
OnClose = function()
warn("Closed without a key")
end,
})Cómo se comporta
- Key recordada: si el executor puede guardar archivos, aparece la casilla *Remember key*. La key válida se guarda y, al abrir de nuevo, se rellena y se verifica sola. Si deja de ser válida se borra.
- Intentos: se muestran los que quedan. Al agotarlos, el botón se bloquea durante
Cooldownsegundos, aunque se vuelva a ejecutar el script en la misma partida. - Errores de conexión (URL caída, KeyForge sin respuesta, error en
Validate) no gastan intentos. - La ventana se puede arrastrar desde arriba y se adapta a pantallas pequeñas.
Varios scripts con key
Cada Key System tiene su propio Id, así que varios scripts pueden usarlo a la vez sin pisarse: cada uno guarda su key en Folder/keys/<Id>.txt y tiene su propio bloqueo por intentos.
| Si usas | `Id` automático |
|---|---|
Id = "mi-hub" | mi-hub |
KeyForge | kf_<scriptId> |
KeyUrl | url_<hash de la URL> |
Keys | keys_<hash de la lista> |
Solo Validate | El Title |
Si dos scripts tuyos usan Validate con el mismo Title, dales un Id distinto:
KeySystem.new({ Id = "blox-fruits", Title = "Cookies Hub", Validate = check })
KeySystem.new({ Id = "steal-an-egg", Title = "Cookies Hub", Validate = check })KeyForge
Integración opcional con KeyForge, el servicio que usa Cookies Hub. KeyForge se encarga del estado de las keys, los límites, el HWID y la entrega del script. Su SDK se descarga en segundo plano al abrir la ventana, así que verificar es casi instantáneo.
KeySystem.new({
Library = Library,
DiscordLink = "https://discord.gg/xxxxxx",
KeyForge = {
projectId = "YOUR_PROJECT_ID",
scriptId = "YOUR_SCRIPT_ID",
integrationToken = "YOUR_TOKEN",
},
LoadScript = true,
})Los IDs y el token los da el panel de KeyForge: edita un script con key, abre In-game UI y elige Custom Lua GUI. Guía oficial de KeyForge.
| Botón / momento | Llamada | Qué hace la ventana |
|---|---|---|
| Get key | client:getKeyUrl() | Copia el enlace de la página de keys |
| Verify | client:verify(key) | Si es válida continúa; si no, muestra el mensaje de KeyForge |
Tras validar (LoadScript = true) | client:loadScript() | Carga el script protegido. Si falla, la ventana no se cierra y muestra el motivo |
| Código | Significado | ¿Gasta intento? |
|---|---|---|
KEY_INVALID | La key no existe o está vacía | Sí |
KEY_EXPIRED | La key caducó | Sí (y se borra la guardada) |
KEY_REVOKED | La key fue revocada | Sí (y se borra la guardada) |
KEY_SCRIPT_MISMATCH | La key es de otro script | Sí |
HWID_MISMATCH | La key está ligada a otro dispositivo | Sí |
RATE_LIMITED | Demasiados intentos en KeyForge | No |
SESSION_EXPIRED | La verificación caducó | No |
NETWORK_ERROR | No se pudo conectar con KeyForge | No |
PROJECT_DISABLED | Proyecto desactivado o pausado | No |
No pongas secretos ni reglas de validación dentro de tu script: un script volcado se puede leer. Deja eso a KeyForge o a tu servidor.
Ejemplo completo
Key System con tema de CookiesLib, 3 intentos y 10 segundos de espera, y una ventana que solo aparece con una key válida. La key de prueba es COOKIES-DEMO:
local Library = loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/CookiesLib.lua"))()
local KeySystem = loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/Cookieskeysystem.lua"))()
local ok, key = KeySystem.Prompt({
Library = Library,
Title = "My Hub",
Subtitle = "Key System",
KeyLink = "https://example.com/get-key",
DiscordLink = "https://discord.gg/xxxxxx",
Keys = { "COOKIES-DEMO" },
CaseSensitive = false,
SaveKey = false,
MaxAttempts = 3,
Cooldown = 10,
OnFail = function(_, message)
warn(message)
end,
})
if not ok then return end
local Window = Library:CreateWindow({ Title = "My Hub", Subtitle = "Unlocked" })
local Main = Window:CreateTab("Main", "M")
local Welcome = Main:CreateSection({ Name = "Welcome", Full = true })
Welcome:AddAlert({ Type = "Success", Title = "Key accepted", Content = "Your key: <b>" .. key .. "</b>" })
Welcome:AddButton({ Name = "Say hi", Primary = true, Callback = function()
Window:Notify({ Title = "My Hub", Content = "Hi!", Type = "Success" })
end })
Window:CreateSettingsTab()Problemas comunes
- No recuerda la key: el executor debe soportar
writefile,readfile,isfolder,makefoldereisfile, y la casilla *Remember key* tiene que estar marcada al validar. - No aparece el botón Get key: necesita
KeyLinkoKeyForge. - Me bloqueó y vuelvo a ejecutar el script: el bloqueo dura
Cooldownsegundos aunque re-ejecutes en la misma partida; es intencional. - Dos scripts se borran la key entre sí: dales un
Iddistinto a cada uno.