diff --git a/cmd/fetch_tweet_to_stdout/main.go b/cmd/fetch_tweet_to_stdout/main.go index 2e4a047..5a4b266 100644 --- a/cmd/fetch_tweet_to_stdout/main.go +++ b/cmd/fetch_tweet_to_stdout/main.go @@ -12,7 +12,7 @@ import ( const INCLUDE_REPLIES = true; // input: e.g., "https://twitter.com/michaelmalice/status/1395882872729477131" -func parse_tweet(url string) (string, error) { +func parse_tweet(url string) (scraper.TweetID, error) { parts := strings.Split(url, "/") if len(parts) != 6 { return "", fmt.Errorf("Tweet format isn't right (%d)", len(parts)) @@ -20,7 +20,7 @@ func parse_tweet(url string) (string, error) { if parts[0] != "https:" || parts[1] != "" || parts[2] != "twitter.com" || parts[4] != "status" { return "", fmt.Errorf("Tweet format isn't right") } - return parts[5], nil + return scraper.TweetID(parts[5]), nil } func main() { diff --git a/scraper/api_request_utils.go b/scraper/api_request_utils.go index c4ff0ce..0b68c90 100644 --- a/scraper/api_request_utils.go +++ b/scraper/api_request_utils.go @@ -75,9 +75,9 @@ func (api API) GetMoreTweets(user_id UserID, response *TweetResponse, max_tweets } -func (api API) GetTweet(id string, cursor string) (TweetResponse, error) { +func (api API) GetTweet(id TweetID, cursor string) (TweetResponse, error) { client := &http.Client{Timeout: 10 * time.Second} - req, err := http.NewRequest("GET", API_CONVERSATION_BASE_PATH + id + ".json", nil) + req, err := http.NewRequest("GET", API_CONVERSATION_BASE_PATH + string(id) + ".json", nil) if err != nil { return TweetResponse{}, err } @@ -100,7 +100,7 @@ func (api API) GetTweet(id string, cursor string) (TweetResponse, error) { if !(resp.StatusCode == http.StatusOK || resp.StatusCode == http.StatusForbidden) { content, _ := ioutil.ReadAll(resp.Body) - return TweetResponse{}, fmt.Errorf("HTTP %d %s: %s", resp.StatusCode, resp.Status, content) + return TweetResponse{}, fmt.Errorf("Error getting %q. HTTP %s: %s", req.URL, resp.Status, content) } body, err := ioutil.ReadAll(resp.Body) @@ -114,7 +114,7 @@ func (api API) GetTweet(id string, cursor string) (TweetResponse, error) { } // Resend the request to get more replies if necessary -func (api API) GetMoreReplies(tweet_id string, response *TweetResponse, max_replies int) error { +func (api API) GetMoreReplies(tweet_id TweetID, response *TweetResponse, max_replies int) error { last_response := response for last_response.GetCursor() != "" && len(response.GlobalObjects.Tweets) < max_replies { fresh_response, err := api.GetTweet(tweet_id, last_response.GetCursor()) diff --git a/scraper/tweet.go b/scraper/tweet.go index fc6ffac..66a0c79 100644 --- a/scraper/tweet.go +++ b/scraper/tweet.go @@ -23,7 +23,7 @@ type Tweet struct { Urls []string Images []string - Mentions []string + Mentions []UserHandle Hashtags []string QuotedTweet TweetID } @@ -67,7 +67,7 @@ func ParseSingleTweet(apiTweet APITweet) (ret Tweet, err error) { ret.Hashtags = append(ret.Hashtags, hashtag.Text) } for _, mention := range apiTweet.Entities.Mentions { - ret.Mentions = append(ret.Mentions, mention.UserName) + ret.Mentions = append(ret.Mentions, UserHandle(mention.UserName)) } ret.QuotedTweet = TweetID(apiTweet.QuotedStatusIDStr) @@ -77,14 +77,14 @@ func ParseSingleTweet(apiTweet APITweet) (ret Tweet, err error) { // Return a single tweet, nothing else -func GetTweet(id string) (Tweet, error) { +func GetTweet(id TweetID) (Tweet, error) { api := API{} tweet_response, err := api.GetTweet(id, "") if err != nil { - return Tweet{}, err + return Tweet{}, fmt.Errorf("Error in API call: %s", err) } - single_tweet, ok := tweet_response.GlobalObjects.Tweets[id] + single_tweet, ok := tweet_response.GlobalObjects.Tweets[string(id)] if !ok { return Tweet{}, fmt.Errorf("Didn't get the tweet!\n%v", tweet_response) @@ -96,7 +96,7 @@ func GetTweet(id string) (Tweet, error) { // Return a list of tweets, including the original and the rest of its thread, // along with a list of associated users -func GetTweetFull(id string) (tweets []Tweet, retweets []Retweet, users []User, err error) { +func GetTweetFull(id TweetID) (tweets []Tweet, retweets []Retweet, users []User, err error) { api := API{} tweet_response, err := api.GetTweet(id, "") if err != nil { diff --git a/scraper/user.go b/scraper/user.go index 1867d41..049e64f 100644 --- a/scraper/user.go +++ b/scraper/user.go @@ -3,17 +3,18 @@ package scraper import ( "time" "fmt" + "strings" ) type UserID string type UserHandle string -func UIDArrayToStrArray(uids []UserID) []string { +func JoinArrayOfHandles(handles []UserHandle) string { ret := []string{} - for _, uid := range uids { - ret = append(ret, string(uid)) + for _, h := range handles { + ret = append(ret, string(h)) } - return ret + return strings.Join(ret, ",") } type User struct {