diff --git a/internal/http/generated.go b/internal/http/generated.go new file mode 100644 index 0000000..49b70ae --- /dev/null +++ b/internal/http/generated.go @@ -0,0 +1,5 @@ +// GENERATED BY go generate; DO NOT EDIT. + +package http + +const ClientBuildNumber = 562538 diff --git a/internal/http/generator.go b/internal/http/generator.go new file mode 100644 index 0000000..da491ae --- /dev/null +++ b/internal/http/generator.go @@ -0,0 +1,66 @@ +//go:build ignore + +package main + +import ( + "flag" + "fmt" + "io" + "net/http" + "os" + "regexp" + + "github.com/diamondburned/arikawa/v3/api" +) + +const format = `// GENERATED BY go generate; DO NOT EDIT. + +package %s + +const ClientBuildNumber = %s +` + +var buildNumberRegex = regexp.MustCompile(`"BUILD_NUMBER":\s*"(\d+)"`) + +func fetchBuildNumber() (string, error) { + resp, err := http.Get(api.BaseEndpoint + "/login") + if err != nil { + return "", err + } + defer resp.Body.Close() + + if resp.StatusCode < http.StatusOK || resp.StatusCode >= http.StatusMultipleChoices { + return "", fmt.Errorf("failed to fetch login page; status=%q", resp.Status) + } + + body, err := io.ReadAll(resp.Body) + if err != nil { + return "", err + } + + matches := buildNumberRegex.FindSubmatch(body) + if len(matches) < 2 { + return "", fmt.Errorf("failed to find build number; matches=%v", matches) + } + return string(matches[1]), nil +} + +func main() { + out := flag.String("out", "generated.go", "out filename") + flag.Parse() + + buildNumber, err := fetchBuildNumber() + if err != nil { + panic(err) + } + + packageName := os.Getenv("GOPACKAGE") + if packageName == "" { + panic("GOPACKAGE is not set; run with go generate") + } + + content := fmt.Appendf(nil, format, packageName, buildNumber) + if err := os.WriteFile(*out, content, 0644); err != nil { + panic(err) + } +} diff --git a/internal/http/headers.go b/internal/http/headers.go index 7c0935d..ed8cf76 100644 --- a/internal/http/headers.go +++ b/internal/http/headers.go @@ -3,6 +3,8 @@ package http import ( "log/slog" stdHttp "net/http" + + "github.com/diamondburned/arikawa/v3/api" ) func Headers() stdHttp.Header { @@ -11,9 +13,10 @@ func Headers() stdHttp.Header { headers.Set("Accept", "*/*") headers.Set("Accept-Encoding", "gzip, deflate, br, zstd") headers.Set("Accept-Language", "en-US,en;q=0.9") - headers.Set("Origin", "https://discord.com") + headers.Set("Origin", api.BaseEndpoint) headers.Set("Priority", "u=0, i") headers.Set("Referer", "https://discord.com/channels/@me") + headers.Set("Sec-Fetch-Dest", "empty") headers.Set("Sec-Fetch-Mode", "cors") headers.Set("Sec-Fetch-Site", "same-origin") diff --git a/internal/http/props.go b/internal/http/props.go index 8b5a2f1..127b054 100644 --- a/internal/http/props.go +++ b/internal/http/props.go @@ -9,6 +9,8 @@ import ( "github.com/google/uuid" ) +//go:generate go run generator.go + const ( OS = "Windows" OSVersion = "10" @@ -17,8 +19,7 @@ const ( BrowserVersion = "143.0.0.0" BrowserUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) " + Browser + "/" + BrowserVersion + " Safari/537.36" - ClientBuildNumber = 482285 - Locale = discord.EnglishUS + Locale = discord.EnglishUS ) func IdentifyProperties() gateway.IdentifyProperties {