From 8587bb97fcc2f8eeca95bd91c5d3d3ac46f4659c Mon Sep 17 00:00:00 2001 From: Alessio Date: Mon, 17 May 2021 12:59:10 -0400 Subject: [PATCH] Initial commit --- doc/curl requests | 15 +++++++++++ scraper/constants.go | 6 +++++ scraper/guest_token.go | 53 +++++++++++++++++++++++++++++++++++++ scraper/guest_token_test.go | 27 +++++++++++++++++++ 4 files changed, 101 insertions(+) create mode 100644 doc/curl requests create mode 100644 scraper/constants.go create mode 100644 scraper/guest_token.go create mode 100644 scraper/guest_token_test.go diff --git a/doc/curl requests b/doc/curl requests new file mode 100644 index 0000000..8ff69ba --- /dev/null +++ b/doc/curl requests @@ -0,0 +1,15 @@ +curl -X POST \ + -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA" \ + https://api.twitter.com/1.1/guest/activate.json + + +curl \ + -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA" \ + -H "X-Guest-Token: 1391174194361217029" \ + https://api.twitter.com/graphql/4S2ihIKfF3xhp-ENxvUAfQ/UserByScreenName?variables=%7B%22screen_name%22%3A%22michaelmalice%22%2C%22withHighlightedLabel%22%3Atrue%7D + + +curl \ + -H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA" \ + -H "X-Guest-Token: 1391214296126967816" \ + https://api.twitter.com/2/timeline/profile/44067298.json diff --git a/scraper/constants.go b/scraper/constants.go new file mode 100644 index 0000000..f8842e7 --- /dev/null +++ b/scraper/constants.go @@ -0,0 +1,6 @@ +package scraper + +// Tokens +// ------ + +const BEARER_TOKEN string = "AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA" diff --git a/scraper/guest_token.go b/scraper/guest_token.go new file mode 100644 index 0000000..a3f46da --- /dev/null +++ b/scraper/guest_token.go @@ -0,0 +1,53 @@ +package scraper + +import "fmt" +import "time" + +import "io/ioutil" +import "net/http" +import "encoding/json" + +type GuestTokenResponse struct { + Token string `json:"guest_token"` + RefreshedAt time.Time +} + +var guestToken GuestTokenResponse + +func GetGuestToken() (string, error) { + if time.Since(guestToken.RefreshedAt).Hours() < 1 { + return guestToken.Token, nil + } + + client := &http.Client{Timeout: 10 * time.Second} + req, err := http.NewRequest("POST", "https://api.twitter.com/1.1/guest/activate.json", nil) + if err != nil { + return "", err + } + req.Header.Set("Authorization", "Bearer " + BEARER_TOKEN) + + resp, err := client.Do(req) + if err != nil { + return "", err + } + + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + content, _ := ioutil.ReadAll(resp.Body) + return "", fmt.Errorf("HTTP %s: %s", resp.Status, content) + } + + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", err + } + + err = json.Unmarshal(body, &guestToken) + if err != nil { + return "", err + } + + guestToken.RefreshedAt = time.Now() + return guestToken.Token, nil +} diff --git a/scraper/guest_token_test.go b/scraper/guest_token_test.go new file mode 100644 index 0000000..941145b --- /dev/null +++ b/scraper/guest_token_test.go @@ -0,0 +1,27 @@ +package scraper_test + +import "testing" +import "fmt" +import "offline_twitter/scraper" + +// Makes an HTTP request +func TestGetGuestToken(t *testing.T) { + token, err := scraper.GetGuestToken() + if err != nil { + t.Errorf("%v", err) + } + + if len(token) < 15 { + t.Errorf("I don't think this is a token: %q", token) + } + fmt.Println(token) +} + + +// Tests the caching. Should run much much faster than an HTTP request, since all requests +// other than the first use the cache. +func BenchmarkGetGuestToken(b *testing.B) { + for i := 0; i < b.N; i++ { + scraper.GetGuestToken() + } +}