From c8ad9a0410e3c5b7e1596a4b2fff08712c2d9d6f Mon Sep 17 00:00:00 2001 From: Thalles Date: Sun, 8 Oct 2023 21:58:48 -0300 Subject: [PATCH 1/3] feat: return open account --- README.md | 4 ++-- auth.go | 31 ++++++++++++++++++------------- auth_test.go | 4 +++- profile_test.go | 10 +++++----- tweets_test.go | 2 +- 5 files changed, 29 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 0dacc97..68c206a 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ scraper.IsLoggedIn() If you don't want to use your account, you can try login as a Twitter app: ```golang -err := scraper.LoginOpenAccount() +account, err := scraper.LoginOpenAccount() ``` ### Get user tweets @@ -98,7 +98,7 @@ import ( func main() { scraper := twitterscraper.New() - err := scraper.LoginOpenAccount() + account, err := scraper.LoginOpenAccount() if err != nil { panic(err) } diff --git a/auth.go b/auth.go index 4f97ee9..0e26901 100644 --- a/auth.go +++ b/auth.go @@ -26,6 +26,11 @@ const ( ) type ( + OpenAccount struct { + OAuthToken string `json:"oauth_token"` + OAuthTokenSecret string `json:"oauth_token_secret"` + } + flow struct { Errors []struct { Code int `json:"code"` @@ -34,11 +39,8 @@ type ( FlowToken string `json:"flow_token"` Status string `json:"status"` Subtasks []struct { - SubtaskID string `json:"subtask_id"` - OpenAccount struct { - OAuthToken string `json:"oauth_token"` - OAuthTokenSecret string `json:"oauth_token_secret"` - } `json:"open_account"` + SubtaskID string `json:"subtask_id"` + OpenAccount OpenAccount `json:"open_account"` } `json:"subtasks"` } @@ -296,16 +298,16 @@ func (s *Scraper) Login(credentials ...string) error { } // LoginOpenAccount as Twitter app -func (s *Scraper) LoginOpenAccount() error { +func (s *Scraper) LoginOpenAccount() (OpenAccount, error) { accessToken, err := s.getAccessToken(appConsumerKey, appConsumerSecret) if err != nil { - return err + return OpenAccount{}, err } s.setBearerToken(accessToken) err = s.GetGuestToken() if err != nil { - return err + return OpenAccount{}, err } // flow start @@ -320,7 +322,7 @@ func (s *Scraper) LoginOpenAccount() error { } flowToken, err := s.getFlowToken(data) if err != nil { - return err + return OpenAccount{}, err } // flow next link @@ -334,7 +336,7 @@ func (s *Scraper) LoginOpenAccount() error { } info, err := s.getFlow(data) if err != nil { - return err + return OpenAccount{}, err } if info.Subtasks != nil && len(info.Subtasks) > 0 { @@ -342,14 +344,17 @@ func (s *Scraper) LoginOpenAccount() error { s.oAuthToken = info.Subtasks[0].OpenAccount.OAuthToken s.oAuthSecret = info.Subtasks[0].OpenAccount.OAuthTokenSecret if s.oAuthToken == "" || s.oAuthSecret == "" { - return fmt.Errorf("auth error: %v", "Token or Secret is empty") + return OpenAccount{}, fmt.Errorf("auth error: %v", "Token or Secret is empty") } s.isLogged = true s.isOpenAccount = true - return nil + return OpenAccount{ + OAuthToken: info.Subtasks[0].OpenAccount.OAuthToken, + OAuthTokenSecret: info.Subtasks[0].OpenAccount.OAuthTokenSecret, + }, nil } } - return fmt.Errorf("auth error: %v", "OpenAccount") + return OpenAccount{}, fmt.Errorf("auth error: %v", "OpenAccount") } // Logout is reset session diff --git a/auth_test.go b/auth_test.go index 88bfd68..4a15392 100644 --- a/auth_test.go +++ b/auth_test.go @@ -52,7 +52,9 @@ func TestAuth(t *testing.T) { func TestLoginOpenAccount(t *testing.T) { scraper := twitterscraper.New() - if err := scraper.LoginOpenAccount(); err != nil { + _, err := scraper.LoginOpenAccount() + + if err != nil { t.Fatalf("LoginOpenAccount() error = %v", err) } } diff --git a/profile_test.go b/profile_test.go index bdde60d..585367c 100644 --- a/profile_test.go +++ b/profile_test.go @@ -31,7 +31,7 @@ func TestGetProfile(t *testing.T) { } scraper := twitterscraper.New() - err := scraper.LoginOpenAccount() + _, err := scraper.LoginOpenAccount() if err != nil { t.Fatalf("LoginOpenAccount() error = %v", err) } @@ -87,7 +87,7 @@ func TestGetProfilePrivate(t *testing.T) { } scraper := twitterscraper.New() - err := scraper.LoginOpenAccount() + _, err := scraper.LoginOpenAccount() if err != nil { t.Fatalf("LoginOpenAccount() error = %v", err) } @@ -122,7 +122,7 @@ func TestGetProfilePrivate(t *testing.T) { func TestGetProfileErrorSuspended(t *testing.T) { scraper := twitterscraper.New() - err := scraper.LoginOpenAccount() + _, err := scraper.LoginOpenAccount() if err != nil { t.Fatalf("LoginOpenAccount() error = %v", err) } @@ -140,7 +140,7 @@ func TestGetProfileErrorNotFound(t *testing.T) { neUser := "sample3123131" expectedError := fmt.Sprintf("User '%s' not found", neUser) scraper := twitterscraper.New() - err := scraper.LoginOpenAccount() + _, err := scraper.LoginOpenAccount() if err != nil { t.Fatalf("LoginOpenAccount() error = %v", err) } @@ -156,7 +156,7 @@ func TestGetProfileErrorNotFound(t *testing.T) { func TestGetUserIDByScreenName(t *testing.T) { scraper := twitterscraper.New() - err := scraper.LoginOpenAccount() + _, err := scraper.LoginOpenAccount() if err != nil { t.Fatalf("LoginOpenAccount() error = %v", err) } diff --git a/tweets_test.go b/tweets_test.go index 71960c1..202ffc5 100644 --- a/tweets_test.go +++ b/tweets_test.go @@ -21,7 +21,7 @@ func TestGetTweets(t *testing.T) { maxTweetsNbr := 300 dupcheck := make(map[string]bool) scraper := twitterscraper.New() - err := scraper.LoginOpenAccount() + _, err := scraper.LoginOpenAccount() if err != nil { t.Fatalf("LoginOpenAccount() error = %v", err) } From ad4df95c0defca59a9fa124c39d8678bbbac1841 Mon Sep 17 00:00:00 2001 From: Thalles Date: Sun, 8 Oct 2023 22:01:10 -0300 Subject: [PATCH 2/3] feat: allow to use specific open account --- auth.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/auth.go b/auth.go index 0e26901..fe54b77 100644 --- a/auth.go +++ b/auth.go @@ -357,6 +357,13 @@ func (s *Scraper) LoginOpenAccount() (OpenAccount, error) { return OpenAccount{}, fmt.Errorf("auth error: %v", "OpenAccount") } +func (s *Scraper) WithOpenAccount(openAccount OpenAccount) { + s.oAuthToken = openAccount.OAuthToken + s.oAuthSecret = openAccount.OAuthTokenSecret + s.isLogged = true + s.isOpenAccount = true +} + // Logout is reset session func (s *Scraper) Logout() error { req, err := http.NewRequest("POST", logoutURL, nil) From 9987e7b8be735b57438fce3894e115c81d82da85 Mon Sep 17 00:00:00 2001 From: Valentine Date: Sun, 28 Jan 2024 23:35:18 +0300 Subject: [PATCH 3/3] update readme --- README.md | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 68c206a..f959275 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,15 @@ If you don't want to use your account, you can try login as a Twitter app: account, err := scraper.LoginOpenAccount() ``` +You can manually set a specific user account: + +```golang +scraper.WithOpenAccount(twitterscraper.OpenAccount{ + OAuthToken: "TOKEN", + OAuthTokenSecret: "TOKEN_SECRET", +}) +``` + ### Get user tweets ```golang @@ -173,7 +182,6 @@ The search ends if we have 50 tweets. See [Rules and filtering](https://developer.twitter.com/en/docs/tweets/rules-and-filtering/overview/standard-operators) for build standard queries. - #### Set search mode ```golang @@ -182,11 +190,11 @@ scraper.SetSearchMode(twitterscraper.SearchLatest) Options: -* `twitterscraper.SearchTop` - default mode -* `twitterscraper.SearchLatest` - live mode -* `twitterscraper.SearchPhotos` - image mode -* `twitterscraper.SearchVideos` - video mode -* `twitterscraper.SearchUsers` - user mode +- `twitterscraper.SearchTop` - default mode +- `twitterscraper.SearchLatest` - live mode +- `twitterscraper.SearchPhotos` - image mode +- `twitterscraper.SearchVideos` - video mode +- `twitterscraper.SearchUsers` - user mode ### Get profile