Initial commit: ChatGPT Account Registration Bot

This commit is contained in:
verssache
2026-03-10 23:18:19 +07:00
commit cd2890fb21
17 changed files with 1493 additions and 0 deletions

24
internal/util/helpers.go Normal file
View File

@@ -0,0 +1,24 @@
package util
import (
"math/rand"
"time"
"github.com/google/uuid"
)
const alphanumeric = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
// RandStr generates a random alphanumeric string of given length.
func RandStr(length int) string {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
b := make([]byte, length)
for i := range b {
b[i] = alphanumeric[r.Intn(len(alphanumeric))]
}
return string(b)
}
// GenerateUUID generates a random UUID.
func GenerateUUID() string {
return uuid.New().String()
}

23
internal/util/names.go Normal file
View File

@@ -0,0 +1,23 @@
package util
import (
"fmt"
"math/rand"
"time"
"github.com/brianvoe/gofakeit/v7"
)
// RandomName returns a random first and last name using gofakeit.
func RandomName() (string, string) {
return gofakeit.FirstName(), gofakeit.LastName()
}
// RandomBirthdate returns a random birthdate string in YYYY-MM-DD format from 1985-2002.
func RandomBirthdate() string {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
year := r.Intn(2002-1985+1) + 1985
month := r.Intn(12) + 1
day := r.Intn(28) + 1
return fmt.Sprintf("%04d-%02d-%02d", year, month, day)
}

40
internal/util/password.go Normal file
View File

@@ -0,0 +1,40 @@
package util
import (
"math/rand"
"time"
)
const (
lowerChars = "abcdefghijklmnopqrstuvwxyz"
upperChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
digitChars = "0123456789"
specialChars = "!@#$%&*"
allChars = lowerChars + upperChars + digitChars + specialChars
)
// GeneratePassword generates a random password of given length (default 14).
// It guarantees at least 1 lowercase, 1 uppercase, 1 digit, and 1 special character.
func GeneratePassword(length int) string {
if length <= 0 {
length = 14
}
r := rand.New(rand.NewSource(time.Now().UnixNano()))
password := make([]byte, length)
password[0] = lowerChars[r.Intn(len(lowerChars))]
password[1] = upperChars[r.Intn(len(upperChars))]
password[2] = digitChars[r.Intn(len(digitChars))]
password[3] = specialChars[r.Intn(len(specialChars))]
for i := 4; i < length; i++ {
password[i] = allChars[r.Intn(len(allChars))]
}
r.Shuffle(len(password), func(i, j int) {
password[i], password[j] = password[j], password[i]
})
return string(password)
}

38
internal/util/trace.go Normal file
View File

@@ -0,0 +1,38 @@
package util
import (
"crypto/rand"
"encoding/hex"
"fmt"
"math/big"
)
// MakeTraceHeaders generates Datadog-compatible trace headers.
func MakeTraceHeaders() map[string]string {
traceID := make([]byte, 16)
rand.Read(traceID)
spanID := make([]byte, 8)
rand.Read(spanID)
traceIDHex := hex.EncodeToString(traceID)
spanIDHex := hex.EncodeToString(spanID)
// traceparent: 00-{traceID}-{spanID}-01
traceparent := fmt.Sprintf("00-%s-%s-01", traceIDHex, spanIDHex)
// tracestate: dd=t.dm:-1;t.tid:{first16ofTraceID};s:-1
tracestate := fmt.Sprintf("dd=t.dm:-1;t.tid:%s;s:-1", traceIDHex[:16])
// x-datadog-trace-id: decimal conversion of last 16 hex chars (last 8 bytes)
traceIDInt := new(big.Int).SetBytes(traceID[8:])
// x-datadog-parent-id: decimal conversion of spanID
spanIDInt := new(big.Int).SetBytes(spanID)
return map[string]string{
"traceparent": traceparent,
"tracestate": tracestate,
"x-datadog-trace-id": traceIDInt.String(),
"x-datadog-parent-id": spanIDInt.String(),
"x-datadog-sampling-priority": "-1",
}
}