You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
1.6 KiB
89 lines
1.6 KiB
package twitter |
|
|
|
import ( |
|
"encoding/json" |
|
"net/http" |
|
) |
|
|
|
type TwitterClient interface { |
|
GetUsername(userId string) (string, error) |
|
GetFollowing(userId string) ([]User, error) |
|
} |
|
|
|
type Client struct { |
|
httpClient *http.Client |
|
bearerToken string |
|
baseURL string |
|
} |
|
|
|
type User struct { |
|
ID string |
|
Username string |
|
Name string |
|
} |
|
|
|
func NewClient(bearerToken string) *Client { |
|
return &Client{ |
|
httpClient: &http.Client{}, |
|
bearerToken: bearerToken, |
|
baseURL: "https://api.twitter.com", |
|
} |
|
} |
|
|
|
func (c *Client) GetUsername(userId string) (string, error) { |
|
url := c.baseURL + "/users/" + userId |
|
req, err := http.NewRequest("GET", url, nil) |
|
if err != nil { |
|
return "", err |
|
} |
|
|
|
req.Header.Set("Authorization", "Bearer "+c.bearerToken) |
|
|
|
resp, err := c.httpClient.Do(req) |
|
if err != nil { |
|
return "", err |
|
} |
|
|
|
defer resp.Body.Close() |
|
|
|
var userResponse struct { |
|
Data User |
|
} |
|
|
|
if err := json.NewDecoder(resp.Body).Decode(&userResponse); err != nil { |
|
return "", err |
|
} |
|
|
|
return userResponse.Data.Username, nil |
|
} |
|
|
|
func (c *Client) GetFollowing(userId string) ([]User, error) { |
|
url := c.baseURL + "/users/" + userId + "/following" |
|
req, err := http.NewRequest("GET", url, nil) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
req.Header.Set("Authorization", "Bearer "+c.bearerToken) |
|
|
|
resp, err := c.httpClient.Do(req) |
|
if err != nil { |
|
return nil, err |
|
} |
|
|
|
defer func() { |
|
if cerr := resp.Body.Close(); cerr != nil { |
|
err = cerr |
|
} |
|
}() |
|
|
|
var followingResponse struct { |
|
Data []User |
|
} |
|
|
|
if err := json.NewDecoder(resp.Body).Decode(&followingResponse); err != nil { |
|
return nil, err |
|
} |
|
|
|
return followingResponse.Data, nil |
|
}
|
|
|