Do slightly more proper error handling

This commit is contained in:
Alessio 2022-03-06 19:27:30 -08:00
parent 2f784c779c
commit 15d7cd77a1
6 changed files with 22 additions and 15 deletions

8
scraper/api_errors.go Normal file
View File

@ -0,0 +1,8 @@
package scraper
import (
"fmt"
)
var END_OF_FEED = fmt.Errorf("End of feed")
var DOESNT_EXIST = fmt.Errorf("Doesn't exist")

View File

@ -14,13 +14,6 @@ import (
const API_CONVERSATION_BASE_PATH = "https://twitter.com/i/api/2/timeline/conversation/" const API_CONVERSATION_BASE_PATH = "https://twitter.com/i/api/2/timeline/conversation/"
const API_USER_TIMELINE_BASE_PATH = "https://api.twitter.com/2/timeline/profile/" const API_USER_TIMELINE_BASE_PATH = "https://api.twitter.com/2/timeline/profile/"
type APIError string
func (e APIError) Error() string {
return string(e)
}
const END_OF_FEED = APIError("End of feed")
type API struct{} type API struct{}
func (api API) GetFeedFor(user_id UserID, cursor string) (TweetResponse, error) { func (api API) GetFeedFor(user_id UserID, cursor string) (TweetResponse, error) {

View File

@ -1,5 +1,8 @@
package scraper package scraper
import (
"errors"
)
func TimestampToDateString(timestamp int) string { func TimestampToDateString(timestamp int) string {
panic("???") // TODO panic("???") // TODO
@ -22,14 +25,12 @@ func Search(query string, min_results int) (trove TweetTrove, err error) {
if len(tweet_response.GlobalObjects.Tweets) < min_results && tweet_response.GetCursor() != "" { if len(tweet_response.GlobalObjects.Tweets) < min_results && tweet_response.GetCursor() != "" {
err = api.GetMoreTweetsFromSearch(query, &tweet_response, min_results) err = api.GetMoreTweetsFromSearch(query, &tweet_response, min_results)
if err == END_OF_FEED { if errors.Is(err, END_OF_FEED) {
println("End of feed!") println("End of feed!")
} } else if err != nil {
if err != nil && err != END_OF_FEED {
return return
} }
} }
return ParseTweetResponse(tweet_response) return ParseTweetResponse(tweet_response)
} }

View File

@ -93,7 +93,7 @@ func ParseSingleTweet(apiTweet APITweet) (ret Tweet, err error) {
if apiTweet.TombstoneText == "" { // Skip time parsing for tombstones if apiTweet.TombstoneText == "" { // Skip time parsing for tombstones
ret.PostedAt, err = TimestampFromString(apiTweet.CreatedAt) ret.PostedAt, err = TimestampFromString(apiTweet.CreatedAt)
if err != nil { if err != nil {
return return Tweet{}, fmt.Errorf("Error parsing time on tweet ID %d:\n %w", ret.ID, err)
} }
} }
@ -223,12 +223,14 @@ func GetTweetFull(id TweetID) (trove TweetTrove, err error) {
api := API{} api := API{}
tweet_response, err := api.GetTweet(id, "") tweet_response, err := api.GetTweet(id, "")
if err != nil { if err != nil {
err = fmt.Errorf("Error getting tweet: %d\n %w", id, err)
return return
} }
if len(tweet_response.GlobalObjects.Tweets) < DEFAULT_MAX_REPLIES_EAGER_LOAD && if len(tweet_response.GlobalObjects.Tweets) < DEFAULT_MAX_REPLIES_EAGER_LOAD &&
tweet_response.GetCursor() != "" { tweet_response.GetCursor() != "" {
err = api.GetMoreReplies(id, &tweet_response, DEFAULT_MAX_REPLIES_EAGER_LOAD) err = api.GetMoreReplies(id, &tweet_response, DEFAULT_MAX_REPLIES_EAGER_LOAD)
if err != nil { if err != nil {
err = fmt.Errorf("Error getting more tweet replies: %d\n %w", id, err)
return return
} }
} }

View File

@ -134,6 +134,7 @@ func ParseSingleUser(apiUser APIUser) (ret User, err error) {
} }
ret.JoinDate, err = TimestampFromString(apiUser.CreatedAt) ret.JoinDate, err = TimestampFromString(apiUser.CreatedAt)
if err != nil { if err != nil {
err = fmt.Errorf("Error parsing time on user ID %d: %w", ret.ID, err)
return return
} }
ret.IsPrivate = apiUser.Protected ret.IsPrivate = apiUser.Protected

View File

@ -2,6 +2,7 @@ package scraper
import ( import (
"fmt" "fmt"
"errors"
) )
/** /**
@ -18,12 +19,13 @@ func GetUserFeedFor(user_id UserID, min_tweets int) (trove TweetTrove, err error
api := API{} api := API{}
tweet_response, err := api.GetFeedFor(user_id, "") tweet_response, err := api.GetFeedFor(user_id, "")
if err != nil { if err != nil {
err = fmt.Errorf("Error calling API to fetch user feed: UserID %d\n %w", user_id, err)
return return
} }
if len(tweet_response.GlobalObjects.Tweets) < min_tweets && tweet_response.GetCursor() != "" { if len(tweet_response.GlobalObjects.Tweets) < min_tweets && tweet_response.GetCursor() != "" {
err = api.GetMoreTweetsFromFeed(user_id, &tweet_response, min_tweets) err = api.GetMoreTweetsFromFeed(user_id, &tweet_response, min_tweets)
if err != nil && err != END_OF_FEED { if err != nil && !errors.Is(err, END_OF_FEED) {
return return
} }
} }
@ -36,13 +38,13 @@ func GetUserFeedGraphqlFor(user_id UserID, min_tweets int) (trove TweetTrove, er
api := API{} api := API{}
api_response, err := api.GetGraphqlFeedFor(user_id, "") api_response, err := api.GetGraphqlFeedFor(user_id, "")
if err != nil { if err != nil {
err = fmt.Errorf("Error calling API to fetch user feed: UserID %d\n %s", user_id, err.Error()) err = fmt.Errorf("Error calling API to fetch user feed: UserID %d\n %w", user_id, err)
return return
} }
if len(api_response.Data.User.Result.Timeline.Timeline.Instructions[0].Entries) < min_tweets && api_response.GetCursorBottom() != "" { if len(api_response.Data.User.Result.Timeline.Timeline.Instructions[0].Entries) < min_tweets && api_response.GetCursorBottom() != "" {
err = api.GetMoreTweetsFromGraphqlFeed(user_id, &api_response, min_tweets) err = api.GetMoreTweetsFromGraphqlFeed(user_id, &api_response, min_tweets)
if err != nil && err != END_OF_FEED { if err != nil && !errors.Is(err, END_OF_FEED) {
return return
} }
} }