Ferramenta de load testing em Go com suporte para parsing de requests do Chrome DevTools.
go build -o seilago main.go./seilago -c 100 -d 30s -m POST https://example.comFlags disponíveis:
-c: Número de workers concorrentes (padrão: 50)-d: Duração do teste (ex: 30s, 1m, 5m)-t: Timeout por requisição (padrão: 5s)-m: Método HTTP (GET, POST, etc.)-H: Headers (pode ser usado múltiplas vezes)
Use o modo -fill para colar requests do Chrome DevTools, substituir placeholders [[variavel]] e executar múltiplas vezes.
- Modo interativo - Cola request e preenche manualmente:
./seilago -fill- Usando arquivo - Define variáveis no próprio arquivo:
./seilago -fill -f request.txt-
Copie uma request do Chrome DevTools (clique direito > Copy > Copy as fetch)
-
Modifique o body/headers/URL para incluir placeholders
[[nome_da_variavel]]:
fetch("https://brunji.com.br/api/users", {
"headers": {
"accept": "*/*",
"content-type": "application/json"
},
"body": "{\"name\":\"[[nome]]\",\"email\":\"[[email]]\"}",
"method": "POST"
});- Execute e siga as instruções:
./seilago -fill
# Cole o fetch acima
# Pressione Ctrl-D
# O programa vai perguntar para cada placeholder:
Placeholder: [[nome]]
Digite uma regex para gerar (ex: \d{8}, [a-z]{6}) ou valor literal:
> [A-Z][a-z]{5,10}
✓ Exemplo: Mfeokp
Placeholder: [[email]]
Digite uma regex para gerar (ex: \d{8}, [a-z]{6}) ou valor literal:
> [a-z]{8}@example.com
✓ Exemplo: hdjekwpq@example.com
# Depois pergunta quantas vezes executar:
Quantas vezes executar a request? 10
# E o delay entre cada request:
Delay entre requests em ms (0 = máximo de velocidade): 100
# Executa as requests com valores diferentes a cada vez:
=== Executando 10 requests ===
[1/10] ✓ 201 - 125ms (89 bytes)
Response: {"id":1,"name":"Agjeklo","email":"pkdjwmqp@example.com"}
[2/10] ✓ 201 - 98ms (91 bytes)
Response: {"id":2,"name":"Bmpqrst","email":"zxcvbnma@example.com"}
...
[10/10] ✓ 201 - 102ms (90 bytes)
=== Resumo ===
Total: 10 | Sucesso: 10 | Falha: 0- Crie um arquivo
request.txtcom a request e as definições de variáveis:
fetch("https://brunji.com.br/api/users", {
"headers": {
"accept": "*/*",
"content-type": "application/json"
},
"body": "{\"name\":\"[[nome]]\",\"email\":\"[[email]]\"}",
"method": "POST"
});
[nome]="[A-Z][a-z]{5,10}"
[email]="[a-z]{8}@example.com"- Execute apontando para o arquivo:
./seilago -fill -f request.txt
# Output:
Lendo request de: request.txt
[[nome]] = "[A-Z][a-z]{5,10}" (definido no arquivo)
✓ Exemplo: Mfeokp
[[email]] = "[a-z]{8}@example.com" (definido no arquivo)
✓ Exemplo: hdjekwpq@example.com
Quantas vezes executar a request? 10
Delay entre requests em ms (0 = máximo de velocidade): 100
=== Executando 10 requests ===
[1/10] ✓ 201 - 125ms (89 bytes)
...Características:
- Cada request gera novos valores aleatórios usando as regexes fornecidas
- Delay de 0ms = velocidade máxima (sem pause entre requests)
- Mostra status code, tempo de resposta e tamanho do body
- Exibe o corpo da resposta se for menor que 500 bytes
- Variáveis podem ser definidas no arquivo usando
[variavel]="regex" - Se uma variável não estiver definida no arquivo, o programa pergunta interativamente
- Sistema de logging automático: Salva todas as requests em arquivo JSON com timestamp
O modo -fill automaticamente cria um arquivo de log com todas as informações de cada request executada. O arquivo tem formato YYYYMMDD_HHMMSS.log (ex: 20251015_142909.log).
{
"timestamp": "2025-10-15T14:29:09.172433557-03:00",
"request_num": 1,
"url": "https://httpbin.org/post",
"method": "POST",
"status_code": 200,
"response_time_ms": 10733,
"response_bytes": 576,
"success": true,
"request_body": "{\"name\":\"Eocusjltu\",\"email\":\"suryuw@test.com\"}",
"response_body": "...",
"variables": {
"email": "suryuw@test.com",
"nome": "Eocusjltu"
}
}Performance:
- Logging thread-safe com goroutines
- Buffer de 64KB para escrita eficiente
- Não bloqueia execução das requests
- Formato JSON (uma entrada por linha)
\d{8}- 8 dígitos (ex: 12345678)[a-z]{10}- 10 letras minúsculas (ex: abcdefghij)[A-Z][a-z]{5}- 1 maiúscula + 5 minúsculas (ex: Abcdef)\w{12}- 12 caracteres alfanuméricos (ex: aB3dE5gH9jK1)[0-9]{3}-[0-9]{4}- Formato XXX-XXXX (ex: 123-4567)
- Parsing automático de requests fetch() do Chrome
- Substituição de placeholders com regex ou valores literais
- Geração de valores aleatórios baseados em regex
- Suporte para quantifiers:
{n},{n,m},+,*,? - Classes de caracteres:
[a-z],[0-9],[A-Za-z0-9] - Caracteres especiais:
\d(dígitos),\w(alfanuméricos)