Teste antes de usar
Este script abre o Key System com uma única key válida, COOKIES-DEMO (sem diferenciar maiúsculas). Cole no seu executor e teste uma key errada e uma certa:
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)Ele também está dentro do menu de teste da CookiesLib: abra a aba Personalizar e clique em Abrir key system. Lá a key também é COOKIES-DEMO, e 3 erros ativam uma espera de 10 segundos.
loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/CookiesDemo.lua"))()Início rápido
Carregue a biblioteca e o Key System, peça a key e, só se ela for válida, crie sua janela. Se você passar Library, o Key System usa o tema dela (incluindo o que o jogador escolheu) e as fontes.
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(opções) espera até o jogador validar ou fechar e retorna ok, key. É um atalho para KeySystem.new(opções):Wait().
Como a key é validada
É usado o primeiro método disponível, nesta ordem:
- 1`KeyForge`: serviço externo de keys (veja abaixo).
- 2`Validate`: sua própria função.
- 3`KeyUrl`: uma URL com uma key por linha (fica em cache por 30 segundos).
- 4`Keys`: uma lista dentro do 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 retorna se a key é válida e, opcionalmente, uma mensagem para o jogador. Espaços no começo e no fim da key são ignorados, e com CaseSensitive = false tanto faz maiúsculas ou minúsculas.
Uma lista Keys dentro do script pode ser lida por qualquer um que abra o script. Para algo sério, use KeyUrl, Validate contra seu servidor ou o KeyForge.
Personalizar
Você pode mudar o tema, a cor, os textos e os passos de ajuda. Este exemplo deixa com tema rosa e os textos em português:
KeySystem.new({
Library = Library,
Theme = "Strawberry",
Accent = Color3.fromRGB(255, 105, 140),
Title = "Meu Hub",
Subtitle = "Acesso",
Description = "Digite sua key para desbloquear o hub.",
Steps = {
"Clique em Get key para copiar o link",
"Complete os passos no seu navegador",
"Cole sua key e clique em Verify",
},
Keys = { "COOKIE-1234" },
CaseSensitive = false,
MaxAttempts = 3,
Cooldown = 10,
Blur = true,
})| Opção | Padrão | O que faz |
|---|---|---|
Library | nil | Herda o tema e as fontes da CookiesLib |
Theme | nil | Nome de um tema da CookiesLib ou tabela de cores |
Accent | nil | Cor de destaque só para o Key System |
Title / Subtitle | "Cookies Hub" / "Key System" | Textos do cabeçalho |
Logo | logo do Cookies | Imagem; false remove |
Description | texto em inglês | Texto abaixo do título |
Steps | 3 passos em inglês | Até 3 passos no painel “Need a key?” |
Note | nil | Texto livre no lugar dos passos |
KeyLink | nil | Link do botão Get key |
DiscordLink | nil | Botão Join Discord |
CaseSensitive | true | false ignora maiúsculas e minúsculas |
SaveKey | true | Permite lembrar a key no dispositivo |
AutoVerify | true | Verifica sozinho a key salva ao abrir |
MaxAttempts | 5 | Tentativas erradas antes do bloqueio |
Cooldown | 15 | Segundos de bloqueio |
Blur / Shadow | true | Desfoque do fundo e sombra da janela |
Folder / FileName | "CookiesHub" / auto | Onde a key é salva |
Id | automático | Separa a key e o bloqueio de cada script |
Os botões só aparecem quando têm algo a fazer: Get key com KeyLink ou KeyForge, Join Discord com DiscordLink, e Paste se o executor tiver acesso à área de transferência.
Objeto e eventos
KeySystem.new retorna um objeto que você controla pelo 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 | O que faz |
|---|---|
ks:Wait() | Espera terminar e retorna success, key |
ks:Submit(key) | Envia uma key pelo código (sem argumento usa o que foi digitado) |
ks:SetStatus(texto, tipo) | Mensagem abaixo do botão: Success, Warning, Error ou nil |
ks:Close() | Fecha sem validar |
ks:Destroy() | Fecha e limpa tudo |
Em vez de esperar com Wait(), você pode 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,
})Como ele se comporta
- Key lembrada: se o executor puder salvar arquivos, aparece a caixa *Remember key*. A key válida é salva e, na próxima vez, é preenchida e verificada sozinha. Se deixar de ser válida, é apagada.
- Tentativas: as restantes aparecem na tela. Quando acabam, o botão trava por
Cooldownsegundos, mesmo que o script seja executado de novo na mesma partida. - Erros de conexão (URL fora do ar, KeyForge sem resposta, erro em
Validate) não gastam tentativas. - A janela pode ser arrastada pela parte de cima e se adapta a telas pequenas.
Vários scripts com key
Cada Key System tem seu próprio Id, então vários scripts podem usá-lo ao mesmo tempo sem conflito: cada um salva sua key em Folder/keys/<Id>.txt e tem seu próprio bloqueio de tentativas.
| Se você usa | `Id` automático |
|---|---|
Id = "meu-hub" | meu-hub |
KeyForge | kf_<scriptId> |
KeyUrl | url_<hash da URL> |
Keys | keys_<hash da lista> |
Só Validate | O Title |
Se dois scripts seus usam Validate com o mesmo Title, dê um Id diferente para cada um:
KeySystem.new({ Id = "blox-fruits", Title = "Cookies Hub", Validate = check })
KeySystem.new({ Id = "steal-an-egg", Title = "Cookies Hub", Validate = check })KeyForge
Integração opcional com o KeyForge, o serviço que o Cookies Hub usa. O KeyForge cuida do status das keys, dos limites, do HWID e da entrega do script. O SDK baixa em segundo plano quando a janela abre, então a verificação é quase instantânea.
KeySystem.new({
Library = Library,
DiscordLink = "https://discord.gg/xxxxxx",
KeyForge = {
projectId = "YOUR_PROJECT_ID",
scriptId = "YOUR_SCRIPT_ID",
integrationToken = "YOUR_TOKEN",
},
LoadScript = true,
})Os IDs e o token vêm do painel do KeyForge: edite um script com key, abra In-game UI e escolha Custom Lua GUI. Guia oficial do KeyForge.
| Botão / momento | Chamada | O que a janela faz |
|---|---|---|
| Get key | client:getKeyUrl() | Copia o link da página de keys |
| Verify | client:verify(key) | Continua se for válida; se não, mostra a mensagem do KeyForge |
Depois de validar (LoadScript = true) | client:loadScript() | Carrega o script protegido. Se falhar, a janela não fecha e mostra o motivo |
| Código | Significado | Gasta tentativa? |
|---|---|---|
KEY_INVALID | A key não existe ou está vazia | Sim |
KEY_EXPIRED | A key expirou | Sim (e a salva é apagada) |
KEY_REVOKED | A key foi revogada | Sim (e a salva é apagada) |
KEY_SCRIPT_MISMATCH | A key é de outro script | Sim |
HWID_MISMATCH | A key está ligada a outro dispositivo | Sim |
RATE_LIMITED | Tentativas demais no KeyForge | Não |
SESSION_EXPIRED | A verificação expirou | Não |
NETWORK_ERROR | Não foi possível conectar ao KeyForge | Não |
PROJECT_DISABLED | Projeto desativado ou pausado | Não |
Não coloque segredos nem regras de validação dentro do seu script: um script extraído pode ser lido. Deixe isso com o KeyForge ou com seu servidor.
Exemplo completo
Key System com o tema da CookiesLib, 3 tentativas e espera de 10 segundos, e uma janela que só aparece com uma key válida. A key de teste é 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 comuns
- Não lembra a key: o executor precisa suportar
writefile,readfile,isfolder,makefoldereisfile, e *Remember key* precisa estar marcada ao validar. - O botão Get key não aparece: ele precisa de
KeyLinkouKeyForge. - Fui bloqueado e executei o script de novo: o bloqueio dura
Cooldownsegundos mesmo executando de novo na mesma partida; é de propósito. - Dois scripts apagam a key um do outro: dê um
Iddiferente para cada um.