diff --git a/README.md b/README.md index f8bb2ce..08bac06 100644 --- a/README.md +++ b/README.md @@ -25,13 +25,13 @@ import "github.com/arshamalh/twigo" twigo.NewClient((&twigo.Config{ ConsumerKey: "ConsumerKey", - ConsumerSecret: "ConsumerSecret", - AccessToken: "AccessToken", - AccessSecret: "AccessTokenSecret", + ConsumerSecret: "ConsumerSecret", + AccessToken: "AccessToken", + AccessSecret: "AccessTokenSecret", // Both of "bearer token" or "four other keys (ConsumerKey, ...)" is not mandatory. // We'll find bearer token automatically if it's not specified. // Also, you can use twigo.utils.BearerFinder() function. - BearerToken: "BearerToken", + BearerToken: "BearerToken", })) ``` diff --git a/client.go b/client.go index c50025d..a6b2f4b 100644 --- a/client.go +++ b/client.go @@ -6,6 +6,7 @@ import ( "fmt" "net/http" "net/url" + "strings" "github.com/arshamalh/twigo/utils" ) @@ -71,7 +72,14 @@ func (c *Client) get_request(route string, oauth_type OAuthType, params Map, end request.Header.Set("Authorization", fmt.Sprintf("Bearer %s", c.bearerToken)) client := http.Client{} - return client.Do(request) + resp, err := client.Do(request) + if resp.StatusCode != 200 { + err := SpecialError{} + json.NewDecoder(resp.Body).Decode(&err) + defer resp.Body.Close() + return nil, err.Error() + } + return resp, err } } @@ -1118,6 +1126,7 @@ func (c *Client) GetUserByUsername(username string, params Map) (*UserResponse, endpoint_parameters := []string{ "expansions", "tweet.fields", "user.fields", } + username = strings.Replace(username, "@", "", 1) route := fmt.Sprintf("users/by/username/%s", username) response, err := c.get_request(route, c.oauth_type, params, endpoint_parameters) if err != nil { @@ -1154,6 +1163,8 @@ func (c *Client) GetUsersByIDs(user_ids []string, params Map) (*UsersResponse, e // Returns a variety of information about one or more users specified by // the requested usernames. // +// usernames should not have @ at the beginning +// // https://developer.twitter.com/en/docs/twitter-api/users/lookup/api-reference/get-users-by func (c *Client) GetUsersByUsernames(usernames []string, params Map) (*UsersResponse, error) { endpoint_parameters := []string{ diff --git a/entities.go b/entities.go index fbfadd0..19b7ade 100644 --- a/entities.go +++ b/entities.go @@ -1,6 +1,7 @@ package twigo import ( + "fmt" "net/http" "strconv" "time" @@ -22,6 +23,17 @@ type ErrorEntity struct { Message string `json:"message"` } +type SpecialError struct { + Title string `json:"title"` + Type string `json:"type"` + Status int `json:"status"` + Detail string `json:"detail"` +} + +func (e *SpecialError) Error() error { + return fmt.Errorf("%s - %d - %s - %s", e.Title, e.Status, e.Type, e.Detail) +} + type IncludesEntity struct { Users []entities.User `json:"users"` Tweets []entities.Tweet `json:"tweets"` diff --git a/twigo.go b/twigo.go index 8672cb3..f2ffd26 100644 --- a/twigo.go +++ b/twigo.go @@ -1,7 +1,6 @@ package twigo import ( - "fmt" "strings" "github.com/arshamalh/twigo/utils" @@ -21,7 +20,11 @@ func NewClient(config *Config) (*Client, error) { if !keys_exists { if config.BearerToken == "" { - return nil, fmt.Errorf("consumer key, consumer secret, access token and access token secret must be provided") + if bearer_token, err := utils.BearerFinder(config.ConsumerKey, config.ConsumerSecret); err == nil { + config.BearerToken = bearer_token + } else { + return nil, err + } } userID := "" @@ -31,10 +34,10 @@ func NewClient(config *Config) (*Client, error) { return &Client{ nil, - config.ConsumerKey, - config.ConsumerSecret, - config.AccessToken, - config.AccessSecret, + "", + "", + "", + "", config.BearerToken, true, userID, @@ -42,14 +45,6 @@ func NewClient(config *Config) (*Client, error) { }, nil } - if config.BearerToken == "" { - if bearer_token, err := utils.BearerFinder(config.ConsumerKey, config.ConsumerSecret); err == nil { - config.BearerToken = bearer_token - } else { - return nil, err - } - } - userID := strings.Split(config.AccessToken, "-")[0] // TODO: I'm authenticating here, but Do I need to authenticate every once in a while?