[https://github.com/imperatrona/twitter-scraper] Scrape the Twitter frontend API without authentication with Golang.
Find a file
2021-03-31 15:15:51 +03:00
.github/workflows Create codeql-analysis.yml 2020-10-02 10:07:08 +03:00
.gitignore add scrap tweets for any search query feature 2020-05-14 14:59:33 +02:00
api.go Embed legacy user type 2021-03-09 10:51:51 +02:00
api_test.go Code optimization 2021-01-28 11:12:20 +02:00
go.mod Total refactoring 2020-12-11 20:58:49 +02:00
go.sum Total refactoring 2020-12-11 20:58:49 +02:00
LICENSE Add MIT license 2020-02-11 14:40:05 +02:00
profile.go Code optimization 2021-01-28 11:12:20 +02:00
profile_test.go Fix profile test 2021-03-26 12:15:08 +02:00
README.md Add godoc reference 2021-03-09 10:54:25 +02:00
scraper.go Refresh guest token every 3 hours 2021-01-05 14:21:08 +02:00
search.go Fix search cursor 2021-03-31 15:12:39 +03:00
search_test.go Add dupcheck for search test 2021-03-31 15:15:51 +03:00
trends.go Add Scraper object 2020-12-12 23:33:57 +02:00
trends_test.go Total refactoring 2020-12-11 20:58:49 +02:00
tweets.go Add GetTweet for default Scraper 2021-03-09 11:02:39 +02:00
tweets_test.go Add retweet info 2021-03-28 12:25:55 +03:00
types.go Fix search cursor 2021-03-31 15:12:39 +03:00
util.go Fix search cursor 2021-03-31 15:12:39 +03:00

Twitter Scraper

Go Reference

Twitter's API is annoying to work with, and has lots of limitations — luckily their frontend (JavaScript) has it's own API, which I reverse-engineered. No API rate limits. No tokens needed. No restrictions. Extremely fast.

You can use this library to get the text of any user's Tweets trivially.

Installation

go get -u github.com/n0madic/twitter-scraper

Usage

Get user tweets

package main

import (
    "context"
    "fmt"
    twitterscraper "github.com/n0madic/twitter-scraper"
)

func main() {
    scraper := twitterscraper.New()
    for tweet := range scraper.GetTweets(context.Background(), "Twitter", 50) {
        if tweet.Error != nil {
            panic(tweet.Error)
        }
        fmt.Println(tweet.Text)
    }
}

It appears you can ask for up to 50 tweets (limit ~3200 tweets).

Get single tweet

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:

package main

import (
    "context"
    "fmt"
    twitterscraper "github.com/n0madic/twitter-scraper"
)

func main() {
    scraper := twitterscraper.New()
    for tweet := range scraper.SearchTweets(context.Background(),
        "twitter scraper data -filter:retweets", 50) {
        if tweet.Error != nil {
            panic(tweet.Error)
        }
        fmt.Println(tweet.Text)
    }
}

The search ends if we have 50 tweets.

See Rules and filtering for build standard queries.

Set search mode

scraper.SetSearchMode(twitterscraper.SearchLatest)

Options:

  • twitterscraper.SearchTop - default mode
  • twitterscraper.SearchLatest - live mode
  • twitterscraper.SearchPhotos - image mode
  • twitterscraper.SearchVideos - video mode

Get profile

package main

import (
    "fmt"
    twitterscraper "github.com/n0madic/twitter-scraper"
)

func main() {
    scraper := twitterscraper.New()
    profile, err := scraper.GetProfile("Twitter")
    if err != nil {
        panic(err)
    }
    fmt.Printf("%+v\n", profile)
}
package main

import (
    "fmt"
    twitterscraper "github.com/n0madic/twitter-scraper"
)

func main() {
    scraper := twitterscraper.New()
    trends, err := scraper.GetTrends()
    if err != nil {
        panic(err)
    }
    fmt.Println(trends)
}

Use http proxy

err := scraper.SetProxy("http://localhost:3128")
if err != nil {
    panic(err)
}

Load timeline with tweet replies

scraper.WithReplies(true)

Default Scraper (Ad hoc)

In simple cases, you can use the default scraper without creating an object instance

import twitterscraper "github.com/n0madic/twitter-scraper"

// for tweets
twitterscraper.GetTweets(context.Background(), "Twitter", 50)
// for tweets with replies
twitterscraper.WithReplies(true).GetTweets(context.Background(), "Twitter", 50)

// for search
twitterscraper.SearchTweets(context.Background(), "twitter", 50)

// for profile
twitterscraper.GetProfile("Twitter")

// for trends
twitterscraper.GetTrends()