From 9448a84b2892fe1e67b03f0082e83822ecb74a4c Mon Sep 17 00:00:00 2001 From: Alessio Date: Mon, 23 Oct 2023 13:48:38 -0300 Subject: [PATCH] Fix detection of deleted tweets --- pkg/scraper/api_types_v2.go | 12 ++++++++++++ pkg/scraper/tweet.go | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/pkg/scraper/api_types_v2.go b/pkg/scraper/api_types_v2.go index 99da3b0..ab4de6c 100644 --- a/pkg/scraper/api_types_v2.go +++ b/pkg/scraper/api_types_v2.go @@ -12,6 +12,7 @@ import ( ) var ErrorIsTombstone = errors.New("tweet is a tombstone") +var ErrTweetNotFound = errors.New("api responded 'no status found with that ID'") type CardValue struct { Type string `json:"type"` @@ -590,6 +591,10 @@ type APIV2Response struct { } `json:"search_timeline"` } `json:"search_by_raw_query"` } `json:"data"` + Errors []struct { + Message string `json:"message"` + Code int `json:"code"` + } `json:"errors"` } func (api_response APIV2Response) GetMainInstruction() *APIV2Instruction { @@ -913,6 +918,13 @@ func (api *API) GetTweetDetail(tweet_id TweetID, cursor string) (APIV2Response, } func (api *API) GetMoreTweetReplies(tweet_id TweetID, response *APIV2Response, min_tweets int) error { + if len(response.Errors) != 0 { + if response.Errors[0].Message == "_Missing: No status found with that ID." { + return ErrTweetNotFound + } + panic(fmt.Sprintf("Unknown error: %s", response.Errors[0].Message)) + } + last_response := response for last_response.GetCursorBottom() != "" && len(response.GetMainInstruction().Entries) < min_tweets { fresh_response, err := api.GetTweetDetail(tweet_id, last_response.GetCursorBottom()) diff --git a/pkg/scraper/tweet.go b/pkg/scraper/tweet.go index 674df6b..a0895aa 100644 --- a/pkg/scraper/tweet.go +++ b/pkg/scraper/tweet.go @@ -334,6 +334,11 @@ func GetTweetFullAPIV2(id TweetID, how_many int) (trove TweetTrove, err error) { return } err = the_api.GetMoreTweetReplies(id, &resp, how_many) + if errors.Is(err, ErrTweetNotFound) { + trove := NewTweetTrove() + trove.Tweets[id] = Tweet{ID: id, TombstoneType: "deleted", IsConversationScraped: true} + return trove, nil + } if err != nil && !errors.Is(err, END_OF_FEED) { err = fmt.Errorf("Error getting more replies in tweet detail: %d\n %w", id, err) return