Spaces:
Runtime error
Runtime error
| package platform | |
| import ( | |
| "encoding/json" | |
| "errors" | |
| "fmt" | |
| "io" | |
| "net/url" | |
| "strings" | |
| "github.com/linweiyuan/go-chatgpt-api/api" | |
| http "github.com/bogdanfinn/fhttp" | |
| ) | |
| //goland:noinspection GoUnhandledErrorResult,GoErrorStringFormat,GoUnusedParameter | |
| func (userLogin *UserLogin) GetAuthorizedUrl(csrfToken string) (string, int, error) { | |
| urlParams := url.Values{ | |
| "client_id": {platformAuthClientID}, | |
| "audience": {platformAuthAudience}, | |
| "redirect_uri": {platformAuthRedirectURL}, | |
| "scope": {platformAuthScope}, | |
| "response_type": {platformAuthResponseType}, | |
| } | |
| req, _ := http.NewRequest(http.MethodGet, platformAuth0Url+urlParams.Encode(), nil) | |
| req.Header.Set("Content-Type", api.ContentType) | |
| req.Header.Set("User-Agent", api.UserAgent) | |
| resp, err := userLogin.client.Do(req) | |
| if err != nil { | |
| return "", http.StatusInternalServerError, err | |
| } | |
| defer resp.Body.Close() | |
| if resp.StatusCode != http.StatusOK { | |
| return "", resp.StatusCode, errors.New(api.GetAuthorizedUrlErrorMessage) | |
| } | |
| return resp.Request.URL.String(), http.StatusOK, nil | |
| } | |
| func (userLogin *UserLogin) GetState(authorizedUrl string) (string, int, error) { | |
| split := strings.Split(authorizedUrl, "=") | |
| return split[1], http.StatusOK, nil | |
| } | |
| //goland:noinspection GoUnhandledErrorResult,GoErrorStringFormat | |
| func (userLogin *UserLogin) CheckUsername(state string, username string) (int, error) { | |
| formParams := fmt.Sprintf( | |
| "state=%s&username=%s&js-available=true&webauthn-available=true&is-brave=false&webauthn-platform-available=false&action=default", | |
| state, | |
| username, | |
| ) | |
| req, err := http.NewRequest(http.MethodPost, api.LoginUsernameUrl+state, strings.NewReader(formParams)) | |
| req.Header.Set("Content-Type", api.ContentType) | |
| req.Header.Set("User-Agent", api.UserAgent) | |
| resp, err := userLogin.client.Do(req) | |
| if err != nil { | |
| return http.StatusInternalServerError, err | |
| } | |
| defer resp.Body.Close() | |
| if resp.StatusCode != http.StatusOK { | |
| return resp.StatusCode, errors.New(api.EmailInvalidErrorMessage) | |
| } | |
| return http.StatusOK, nil | |
| } | |
| //goland:noinspection GoUnhandledErrorResult,GoErrorStringFormat | |
| func (userLogin *UserLogin) CheckPassword(state string, username string, password string) (string, int, error) { | |
| formParams := fmt.Sprintf( | |
| "state=%s&username=%s&password=%s&action=default", | |
| state, | |
| username, | |
| password, | |
| ) | |
| req, err := http.NewRequest(http.MethodPost, api.LoginPasswordUrl+state, strings.NewReader(formParams)) | |
| req.Header.Set("Content-Type", api.ContentType) | |
| req.Header.Set("User-Agent", api.UserAgent) | |
| resp, err := userLogin.client.Do(req) | |
| if err != nil { | |
| return "", http.StatusInternalServerError, err | |
| } | |
| defer resp.Body.Close() | |
| if resp.StatusCode != http.StatusOK { | |
| return "", resp.StatusCode, errors.New(api.EmailOrPasswordInvalidErrorMessage) | |
| } | |
| return resp.Request.URL.Query().Get("code"), http.StatusOK, nil | |
| } | |
| //goland:noinspection GoUnhandledErrorResult,GoErrorStringFormat | |
| func (userLogin *UserLogin) GetAccessToken(code string) (string, int, error) { | |
| jsonBytes, _ := json.Marshal(GetAccessTokenRequest{ | |
| ClientID: platformAuthClientID, | |
| Code: code, | |
| GrantType: platformAuthGrantType, | |
| RedirectURI: platformAuthRedirectURL, | |
| }) | |
| req, err := http.NewRequest(http.MethodPost, getTokenUrl, strings.NewReader(string(jsonBytes))) | |
| req.Header.Set("Content-Type", "application/json") | |
| req.Header.Set("User-Agent", api.UserAgent) | |
| resp, err := userLogin.client.Do(req) | |
| if err != nil { | |
| return "", http.StatusInternalServerError, err | |
| } | |
| defer resp.Body.Close() | |
| if resp.StatusCode != http.StatusOK { | |
| return "", resp.StatusCode, errors.New(api.GetAccessTokenErrorMessage) | |
| } | |
| data, _ := io.ReadAll(resp.Body) | |
| return string(data), http.StatusOK, nil | |
| } | |