func main() { var ( err error client *twittergo.Client req *http.Request resp *twittergo.APIResponse results *twittergo.SearchResults args *Args i int ) args = parseArgs() if client, err = LoadCredentials(); err != nil { fmt.Printf("Could not parse CREDENTIALS file: %v\n", err) os.Exit(1) } query := url.Values{} query.Set("q", args.Query) if args.ResultType != "" { query.Set("result_type", args.ResultType) } i = 1 for { url := fmt.Sprintf("/1.1/search/tweets.json?%v", query.Encode()) req, err = http.NewRequest("GET", url, nil) if err != nil { fmt.Printf("Could not parse request: %v\n", err) break } resp, err = client.SendRequest(req) if err != nil { fmt.Printf("Could not send request: %v\n", err) break } results = &twittergo.SearchResults{} if err = resp.Parse(results); err != nil { if rle, ok := err.(twittergo.RateLimitError); ok { dur := rle.Reset.Sub(time.Now()) + time.Second if dur < MINWAIT { // Don't wait less than minwait. dur = MINWAIT } msg := "Rate limited. Reset at %v. Waiting for %v\n" fmt.Printf(msg, rle.Reset, dur) time.Sleep(dur) continue // Retry request. } else { fmt.Printf("Problem parsing response: %v\n", err) break } } fmt.Printf("\n") for _, tweet := range results.Statuses() { user := tweet.User() fmt.Printf("%v.) %v\n", i, tweet.Text()) fmt.Printf("From %v (@%v) ", user.Name(), user.ScreenName()) fmt.Printf("at %v\n\n", tweet.CreatedAt().Format(time.RFC1123)) i += 1 } if query, err = results.NextQuery(); err != nil { fmt.Printf("No next query: %v\n", err) break } if resp.HasRateLimit() { fmt.Printf("Rate limit: %v\n", resp.RateLimit()) fmt.Printf("Rate limit remaining: %v\n", resp.RateLimitRemaining()) fmt.Printf("Rate limit reset: %v\n", resp.RateLimitReset()) } else { fmt.Printf("Could not parse rate limit from response.\n") } } }