Add scraper funcs for previous commit
This commit is contained in:
parent
df8093bbd9
commit
dd68ee1fce
119
pkg/scraper/api_types_lists.go
Normal file
119
pkg/scraper/api_types_lists.go
Normal file
@ -0,0 +1,119 @@
|
||||
package scraper
|
||||
|
||||
import (
|
||||
"net/url"
|
||||
)
|
||||
|
||||
func (api *API) GetFollowees(user_id UserID, cursor string) (APIV2Response, error) {
|
||||
url, err := url.Parse(GraphqlURL{
|
||||
BaseUrl: "https://twitter.com/i/api/graphql/0yD6Eiv23DKXRDU9VxlG2A/Following",
|
||||
Variables: GraphqlVariables{
|
||||
UserID: user_id,
|
||||
Cursor: cursor,
|
||||
Count: 20,
|
||||
IncludePromotedContent: false,
|
||||
},
|
||||
Features: GraphqlFeatures{
|
||||
ResponsiveWebGraphqlExcludeDirectiveEnabled: true,
|
||||
VerifiedPhoneLabelEnabled: false,
|
||||
CreatorSubscriptionsTweetPreviewApiEnabled: true,
|
||||
ResponsiveWebGraphqlTimelineNavigationEnabled: true,
|
||||
ResponsiveWebGraphqlSkipUserProfileImageExtensionsEnabled: false,
|
||||
C9sTweetAnatomyModeratorBadgeEnabled: true,
|
||||
TweetypieUnmentionOptimizationEnabled: true,
|
||||
ResponsiveWebEditTweetApiEnabled: true,
|
||||
GraphqlIsTranslatableRWebTweetIsTranslatableEnabled: true,
|
||||
ViewCountsEverywhereApiEnabled: true,
|
||||
LongformNotetweetsConsumptionEnabled: true,
|
||||
ResponsiveWebTwitterArticleTweetConsumptionEnabled: false,
|
||||
TweetAwardsWebTippingEnabled: false,
|
||||
FreedomOfSpeechNotReachFetchEnabled: true,
|
||||
StandardizedNudgesMisinfo: true,
|
||||
TweetWithVisibilityResultsPreferGqlLimitedActionsPolicyEnabled: true,
|
||||
RwebVideoTimestampsEnabled: true,
|
||||
LongformNotetweetsRichTextReadEnabled: true,
|
||||
LongformNotetweetsInlineMediaEnabled: true,
|
||||
ResponsiveWebMediaDownloadVideoEnabled: false,
|
||||
ResponsiveWebEnhanceCardsEnabled: false,
|
||||
},
|
||||
}.String())
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
var result APIV2Response
|
||||
err = api.do_http(url.String(), "", &result)
|
||||
return result, err
|
||||
}
|
||||
|
||||
type PaginatedFollowees struct {
|
||||
user_id UserID
|
||||
}
|
||||
|
||||
func (p PaginatedFollowees) NextPage(api *API, cursor string) (APIV2Response, error) {
|
||||
return api.GetFollowees(p.user_id, cursor)
|
||||
}
|
||||
func (p PaginatedFollowees) ToTweetTrove(r APIV2Response) (TweetTrove, error) {
|
||||
return r.ToTweetTrove()
|
||||
}
|
||||
|
||||
func GetFollowees(user_id UserID, how_many int) (TweetTrove, error) {
|
||||
return the_api.GetPaginatedQuery(PaginatedFollowees{user_id}, how_many)
|
||||
}
|
||||
|
||||
func (api *API) GetFollowers(user_id UserID, cursor string) (APIV2Response, error) {
|
||||
url, err := url.Parse(GraphqlURL{
|
||||
BaseUrl: "https://twitter.com/i/api/graphql/3_7xfjmh897x8h_n6QBqTA/Followers",
|
||||
Variables: GraphqlVariables{
|
||||
UserID: user_id,
|
||||
Cursor: cursor,
|
||||
Count: 20,
|
||||
IncludePromotedContent: false,
|
||||
},
|
||||
Features: GraphqlFeatures{
|
||||
ResponsiveWebGraphqlExcludeDirectiveEnabled: true,
|
||||
VerifiedPhoneLabelEnabled: false,
|
||||
CreatorSubscriptionsTweetPreviewApiEnabled: true,
|
||||
ResponsiveWebGraphqlTimelineNavigationEnabled: true,
|
||||
ResponsiveWebGraphqlSkipUserProfileImageExtensionsEnabled: false,
|
||||
C9sTweetAnatomyModeratorBadgeEnabled: true,
|
||||
TweetypieUnmentionOptimizationEnabled: true,
|
||||
ResponsiveWebEditTweetApiEnabled: true,
|
||||
GraphqlIsTranslatableRWebTweetIsTranslatableEnabled: true,
|
||||
ViewCountsEverywhereApiEnabled: true,
|
||||
LongformNotetweetsConsumptionEnabled: true,
|
||||
ResponsiveWebTwitterArticleTweetConsumptionEnabled: false,
|
||||
TweetAwardsWebTippingEnabled: false,
|
||||
FreedomOfSpeechNotReachFetchEnabled: true,
|
||||
StandardizedNudgesMisinfo: true,
|
||||
TweetWithVisibilityResultsPreferGqlLimitedActionsPolicyEnabled: true,
|
||||
RwebVideoTimestampsEnabled: true,
|
||||
LongformNotetweetsRichTextReadEnabled: true,
|
||||
LongformNotetweetsInlineMediaEnabled: true,
|
||||
ResponsiveWebMediaDownloadVideoEnabled: false,
|
||||
ResponsiveWebEnhanceCardsEnabled: false,
|
||||
},
|
||||
}.String())
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
var result APIV2Response
|
||||
err = api.do_http(url.String(), "", &result)
|
||||
return result, err
|
||||
}
|
||||
|
||||
type PaginatedFollowers struct {
|
||||
user_id UserID
|
||||
}
|
||||
|
||||
func (p PaginatedFollowers) NextPage(api *API, cursor string) (APIV2Response, error) {
|
||||
return api.GetFollowers(p.user_id, cursor)
|
||||
}
|
||||
func (p PaginatedFollowers) ToTweetTrove(r APIV2Response) (TweetTrove, error) {
|
||||
return r.ToTweetTrove()
|
||||
}
|
||||
|
||||
func GetFollowers(user_id UserID, how_many int) (TweetTrove, error) {
|
||||
return the_api.GetPaginatedQuery(PaginatedFollowers{user_id}, how_many)
|
||||
}
|
36
pkg/scraper/api_types_lists_test.go
Normal file
36
pkg/scraper/api_types_lists_test.go
Normal file
@ -0,0 +1,36 @@
|
||||
package scraper_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"encoding/json"
|
||||
"os"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
. "gitlab.com/offline-twitter/twitter_offline_engine/pkg/scraper"
|
||||
)
|
||||
|
||||
func TestParseFolloweesList(t *testing.T) {
|
||||
assert := assert.New(t)
|
||||
require := require.New(t)
|
||||
data, err := os.ReadFile("test_responses/lists/followees.json")
|
||||
require.NoError(err)
|
||||
|
||||
var resp APIV2Response
|
||||
err = json.Unmarshal(data, &resp)
|
||||
require.NoError(err)
|
||||
|
||||
tweet_trove, err := resp.ToTweetTrove()
|
||||
require.NoError(err)
|
||||
|
||||
// Check users
|
||||
assert.Len(tweet_trove.Users, 4)
|
||||
_, is_ok := tweet_trove.Users[1349149096909668363]
|
||||
assert.True(is_ok)
|
||||
|
||||
// Test cursor-bottom
|
||||
bottom_cursor := resp.GetCursorBottom()
|
||||
assert.Equal("0|1739810405452087290", bottom_cursor)
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user