Files
chatgpt-creator/internal/sentinel/challenge.go

108 lines
2.7 KiB
Go

package sentinel
import (
"bytes"
"encoding/json"
"fmt"
"io"
fhttp "github.com/bogdanfinn/fhttp"
tls_client "github.com/bogdanfinn/tls-client"
)
func FetchSentinelChallenge(session tls_client.HttpClient, deviceID, flow, ua, secChUA, impersonate string) (map[string]any, error) {
generator := NewGenerator(deviceID, ua)
reqBody := map[string]any{
"p": generator.GenerateRequirementsToken(),
"id": deviceID,
"flow": flow,
}
bodyBytes, err := json.Marshal(reqBody)
if err != nil {
return nil, err
}
req, err := fhttp.NewRequest("POST", "https://sentinel.openai.com/backend-api/sentinel/req", bytes.NewBuffer(bodyBytes))
if err != nil {
return nil, err
}
req.Header.Set("Content-Type", "text/plain;charset=UTF-8")
req.Header.Set("Referer", "https://sentinel.openai.com/sentinel/20260124ceb8/frame.html")
req.Header.Set("Origin", "https://sentinel.openai.com")
req.Header.Set("User-Agent", ua)
if secChUA != "" {
req.Header.Set("sec-ch-ua", secChUA)
} else {
req.Header.Set("sec-ch-ua", "\"Not:A-Brand\";v=\"99\", \"Google Chrome\";v=\"145\", \"Chromium\";v=\"145\"")
}
req.Header.Set("sec-ch-ua-mobile", "?0")
req.Header.Set("sec-ch-ua-platform", "\"Windows\"")
req.Header.Set("oai-device-id", deviceID)
req.Header.Set("oai-language", "en-US")
resp, err := session.Do(req)
if err != nil {
return nil, err
}
defer resp.Body.Close()
if resp.StatusCode != fhttp.StatusOK {
return nil, fmt.Errorf("sentinel challenge request failed with status: %d", resp.StatusCode)
}
respBody, err := io.ReadAll(resp.Body)
if err != nil {
return nil, err
}
var result map[string]any
if err := json.Unmarshal(respBody, &result); err != nil {
return nil, err
}
return result, nil
}
func BuildSentinelToken(session tls_client.HttpClient, deviceID, flow, ua, secChUA, impersonate string) (string, error) {
challenge, err := FetchSentinelChallenge(session, deviceID, flow, ua, secChUA, impersonate)
if err != nil {
return "", err
}
cValue, ok := challenge["token"].(string)
if !ok || cValue == "" {
return "", fmt.Errorf("invalid sentinel challenge token")
}
var pValue string
generator := NewGenerator(deviceID, ua)
powData, _ := challenge["proofofwork"].(map[string]any)
required, _ := powData["required"].(bool)
seed, _ := powData["seed"].(string)
if required && seed != "" {
difficulty, _ := powData["difficulty"].(string)
pValue = generator.GenerateToken(seed, difficulty)
} else {
pValue = generator.GenerateRequirementsToken()
}
tokenData := map[string]string{
"p": pValue,
"t": "",
"c": cValue,
"id": deviceID,
"flow": flow,
}
resultBytes, err := json.Marshal(tokenData)
if err != nil {
return "", err
}
return string(resultBytes), nil
}