Add GetTweet

This commit is contained in:
Alexander Sheiko 2021-03-09 10:40:22 +02:00
parent bc84566d02
commit a8089a552e
3 changed files with 80 additions and 0 deletions

View file

@ -38,6 +38,27 @@ func main() {
It appears you can ask for up to 50 tweets (limit ~3200 tweets).
### Get single tweet
```golang
package main
import (
"fmt"
twitterscraper "github.com/n0madic/twitter-scraper"
)
func main() {
scraper := twitterscraper.New()
tweet, err := scraper.GetTweet("1328684389388185600")
if err != nil {
panic(err)
}
fmt.Println(tweet.Text)
}
```
### Search tweets by query standard operators
Tweets containing “twitter” and “scraper” and “data“, filtering out retweets:

View file

@ -2,6 +2,7 @@ package twitterscraper
import (
"context"
"fmt"
"strconv"
)
@ -48,3 +49,25 @@ func (s *Scraper) FetchTweets(user string, maxTweetsNbr int, cursor string) ([]*
tweets, nextCursor := parseTimeline(&timeline)
return tweets, nextCursor, nil
}
// GetTweet get a single tweet by ID.
func (s *Scraper) GetTweet(id string) (*Tweet, error) {
req, err := s.newRequest("GET", "https://twitter.com/i/api/2/timeline/conversation/"+id+".json")
if err != nil {
return nil, err
}
var timeline timeline
err = s.RequestAPI(req, &timeline)
if err != nil {
return nil, err
}
tweets, _ := parseTimeline(&timeline)
for _, tweet := range tweets {
if tweet.ID == id {
return tweet, nil
}
}
return nil, fmt.Errorf("tweet with ID %s not found", id)
}

View file

@ -3,6 +3,10 @@ package twitterscraper
import (
"context"
"testing"
"time"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
)
func TestGetTweets(t *testing.T) {
@ -58,3 +62,35 @@ func TestGetTweets(t *testing.T) {
t.Errorf("Expected tweets count=%v, got: %v", maxTweetsNbr, count)
}
}
func TestGetTweet(t *testing.T) {
sample := Tweet{
HTML: "That thing you didnt Tweet but wanted to but didnt but got so close but then were like nah. <br><br>We have a place for that now—Fleets! <br><br>Rolling out to everyone starting today. <br><a href=\"https://t.co/auQAHXZMfH\"><img src=\"https://pbs.twimg.com/amplify_video_thumb/1328684333599756289/img/cP5KwbIXbGunNSBy.jpg\"/></a>",
ID: "1328684389388185600",
PermanentURL: "https://twitter.com/Twitter/status/1328684389388185600",
Photos: []string{"https://pbs.twimg.com/amplify_video_thumb/1328684333599756289/img/cP5KwbIXbGunNSBy.jpg"},
Text: "That thing you didnt Tweet but wanted to but didnt but got so close but then were like nah. \n\nWe have a place for that now—Fleets! \n\nRolling out to everyone starting today. https://t.co/auQAHXZMfH",
TimeParsed: time.Date(2020, 11, 17, 13, 0, 18, 0, time.FixedZone("UTC", 0)),
Timestamp: 1605618018,
UserID: "783214",
Username: "Twitter",
Videos: []Video{{
ID: "1328684333599756289",
Preview: "https://pbs.twimg.com/amplify_video_thumb/1328684333599756289/img/cP5KwbIXbGunNSBy.jpg",
URL: "https://video.twimg.com/amplify_video/1328684333599756289/vid/480x360/Qh70ELAcq-N2RYmZ.mp4?tag=13",
}},
}
tweet, err := defaultScraper.GetTweet("1328684389388185600")
if err != nil {
t.Error(err)
} else {
cmpOptions := cmp.Options{
cmpopts.IgnoreFields(Tweet{}, "Likes"),
cmpopts.IgnoreFields(Tweet{}, "Replies"),
cmpopts.IgnoreFields(Tweet{}, "Retweets"),
}
if diff := cmp.Diff(sample, *tweet, cmpOptions...); diff != "" {
t.Error("Resulting tweet does not match the sample", diff)
}
}
}