Adds shell for DMs, reactions, and conversation
This commit is contained in:
parent
17290e2fdc
commit
945923e226
@ -53,3 +53,22 @@ curl \
|
|||||||
-H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA" \
|
-H "Authorization: Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA" \
|
||||||
-H "X-Guest-Token: 1591520847784706050" \
|
-H "X-Guest-Token: 1591520847784706050" \
|
||||||
"https://twitter.com/i/api/graphql/Ha9BKBF0uAz9d4-lz0jnYA/AudioSpaceById?variables=%7B%22id%22%3A%221BdxYypQzBgxX%22%2C%22isMetatagsQuery%22%3Afalse%2C%22withSuperFollowsUserFields%22%3Atrue%2C%22withDownvotePerspective%22%3Afalse%2C%22withReactionsMetadata%22%3Afalse%2C%22withReactionsPerspective%22%3Afalse%2C%22withSuperFollowsTweetFields%22%3Atrue%2C%22withReplays%22%3Atrue%7D&features=%7B%22spaces_2022_h2_clipping%22%3Atrue%2C%22spaces_2022_h2_spaces_communities%22%3Atrue%2C%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22tweetypie_unmention_optimization_enabled%22%3Atrue%2C%22responsive_web_uc_gql_enabled%22%3Atrue%2C%22vibe_api_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22interactive_text_enabled%22%3Atrue%2C%22responsive_web_text_conversations_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Atrue%7D"
|
"https://twitter.com/i/api/graphql/Ha9BKBF0uAz9d4-lz0jnYA/AudioSpaceById?variables=%7B%22id%22%3A%221BdxYypQzBgxX%22%2C%22isMetatagsQuery%22%3Afalse%2C%22withSuperFollowsUserFields%22%3Atrue%2C%22withDownvotePerspective%22%3Afalse%2C%22withReactionsMetadata%22%3Afalse%2C%22withReactionsPerspective%22%3Afalse%2C%22withSuperFollowsTweetFields%22%3Atrue%2C%22withReplays%22%3Atrue%7D&features=%7B%22spaces_2022_h2_clipping%22%3Atrue%2C%22spaces_2022_h2_spaces_communities%22%3Atrue%2C%22responsive_web_twitter_blue_verified_badge_is_enabled%22%3Atrue%2C%22verified_phone_label_enabled%22%3Afalse%2C%22tweetypie_unmention_optimization_enabled%22%3Atrue%2C%22responsive_web_uc_gql_enabled%22%3Atrue%2C%22vibe_api_enabled%22%3Atrue%2C%22responsive_web_edit_tweet_api_enabled%22%3Atrue%2C%22graphql_is_translatable_rweb_tweet_is_translatable_enabled%22%3Atrue%2C%22standardized_nudges_misinfo%22%3Atrue%2C%22tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled%22%3Afalse%2C%22responsive_web_graphql_timeline_navigation_enabled%22%3Atrue%2C%22interactive_text_enabled%22%3Atrue%2C%22responsive_web_text_conversations_enabled%22%3Afalse%2C%22responsive_web_enhance_cards_enabled%22%3Atrue%7D"
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# send a message
|
||||||
|
curl 'https://twitter.com/i/api/1.1/dm/new2.json?ext=mediaColor%2CaltText%2CmediaStats%2ChighlightedLabel%2ChasNftAvatar%2CvoiceInfo%2CbirdwatchPivot%2Cenrichments%2CsuperFollowMetadata%2CunmentionInfo%2CeditControl%2Cvibe&include_ext_alt_text=true&include_ext_limited_action_results=false&include_reply_count=1&tweet_mode=extended&include_ext_views=true&include_groups=true&include_inbox_timelines=true&include_ext_media_color=true&supports_reactions=true' \
|
||||||
|
-H 'authorization: Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA' \
|
||||||
|
--data-raw '{"conversation_id":"1458284524761075714-1648469647187124225","recipient_ids":false,"request_id":"e9795640-fe77-11ed-8430-3b5d1c154555","text":"ignore this","cards_platform":"Web-12","include_cards":1,"include_quote_count":true,"dm_users":false}' \
|
||||||
|
--compressed ;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Fetch snapshot of messages
|
||||||
|
curl 'https://twitter.com/i/api/1.1/dm/conversation/1458284524761075714-1648469647187124225.json?max_id=1663307019661574149&context=FETCH_DM_CONVERSATION_HISTORY&include_profile_interstitial_type=1&include_blocking=1&include_blocked_by=1&include_followed_by=1&include_want_retweets=1&include_mute_edge=1&include_can_dm=1&include_can_media_tag=1&include_ext_has_nft_avatar=1&include_ext_is_blue_verified=1&include_ext_verified_type=1&include_ext_profile_image_shape=1&skip_status=1&dm_secret_conversations_enabled=false&krs_registration_enabled=true&cards_platform=Web-12&include_cards=1&include_ext_alt_text=true&include_ext_limited_action_results=false&include_quote_count=true&include_reply_count=1&tweet_mode=extended&include_ext_views=true&dm_users=false&include_groups=true&include_inbox_timelines=true&include_ext_media_color=true&supports_reactions=true&include_conversation_info=true&ext=mediaColor%2CaltText%2CmediaStats%2ChighlightedLabel%2ChasNftAvatar%2CvoiceInfo%2CbirdwatchPivot%2Cenrichments%2CsuperFollowMetadata%2CunmentionInfo%2CeditControl%2Cvibe' \
|
||||||
|
-H 'authorization: Bearer AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA' \
|
||||||
|
-H 'cookie: kdt=uiBKvHgG2m5hFLQc8ZU8XsWOWM25MqaMKJJEb3oE; lang=en; lv-uid=AAAAEICX4yaMhNgtfux4BknjQW7rGOkl2l0_MGnFIKDnNIRlbQn9Ji-kab-WgufG; dnt=1; auth_multi="1590450335315021824:c018f82b02685aaefee2be4ce1b18c35eaee483b"; auth_token=3dd34d00d684eea1645df3dafd0c728464bc284c; guest_id=v1%3A168539432661461192; ct0=ba56cf7397b4a071f491b73e60c643829e55f37a26537ba34e96dba5419ad9a9b9f4dba81a19a4a4a0468c6bebc004e0d08a41fc90b06568c6c1712ede38ffb0d919c0c39bc695ceb4a2dc8190cf3936; twid=u%3D1648469647187124225;"' \
|
||||||
|
-H 'x-client-uuid: d195047c-6532-40a3-b494-957f4fd2ab3d' \
|
||||||
|
-H 'x-twitter-active-user: yes' \
|
||||||
|
-H 'x-twitter-auth-type: OAuth2Session' \
|
||||||
|
-H 'x-twitter-client-language: en' \
|
||||||
|
--compressed
|
@ -206,6 +206,42 @@ create index if not exists index_likes_tweet_id on likes (tweet_id);
|
|||||||
create table fake_user_sequence(latest_fake_id integer not null);
|
create table fake_user_sequence(latest_fake_id integer not null);
|
||||||
insert into fake_user_sequence values(0x4000000000000000);
|
insert into fake_user_sequence values(0x4000000000000000);
|
||||||
|
|
||||||
|
create table conversations (rowid integer primary key,
|
||||||
|
conversation_id text unique not null check(typeof(id) = 'text'),
|
||||||
|
type text not null,
|
||||||
|
sort_event_id int,
|
||||||
|
sort_timestamp int,
|
||||||
|
foreign key(participants) references users(id)
|
||||||
|
nsfw boolean not null,
|
||||||
|
notifications_disabled boolean not null,
|
||||||
|
mention_notifications_disabled boolean not null,
|
||||||
|
last_read_event_id int not null unique,
|
||||||
|
read_only boolean not null,
|
||||||
|
trusted boolean not null,
|
||||||
|
low_quality boolean not null,
|
||||||
|
muted boolean not null,
|
||||||
|
)
|
||||||
|
|
||||||
|
create table messages (rowid integer primary key,
|
||||||
|
id integer unique not null check(typeof(id) = 'integer'),
|
||||||
|
time integer not null,
|
||||||
|
request_id integer not null,
|
||||||
|
foreign key(conversation_id) references conversations(id)
|
||||||
|
foreign key(recipient_id) references users(id)
|
||||||
|
foreign key(sender_id) references users(id)
|
||||||
|
text text not null
|
||||||
|
foreign key(message_reactions) references message_reactions(id)
|
||||||
|
);
|
||||||
|
|
||||||
|
create table message_reactions (rowid integer primary key,
|
||||||
|
id integer unique not null check(typeof(id) = 'integer'),
|
||||||
|
time integer not null,
|
||||||
|
foreign key(conversation_id) references conversations(id)
|
||||||
|
foreign key(message_id) references messages(id)
|
||||||
|
reaction_key text not null,
|
||||||
|
foreign key(sender_id) references users(id)
|
||||||
|
)
|
||||||
|
|
||||||
create table database_version(rowid integer primary key,
|
create table database_version(rowid integer primary key,
|
||||||
version_number integer not null unique
|
version_number integer not null unique
|
||||||
);
|
);
|
||||||
|
21
pkg/scraper/api_types_notifications.go
Normal file
21
pkg/scraper/api_types_notifications.go
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
package scraper
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/url"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (api API) GetNotifications(cursor string) (TweetResponse, error) {
|
||||||
|
url, err := url.Parse("https://api.twitter.com/2/notifications/all.json")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
query := url.Query()
|
||||||
|
add_tweet_query_params(&query)
|
||||||
|
url.RawQuery = query.Encode()
|
||||||
|
|
||||||
|
var result TweetResponse
|
||||||
|
err = api.do_http(url.String(), cursor, &result)
|
||||||
|
|
||||||
|
return result, err
|
||||||
|
}
|
18
pkg/scraper/conversation.go
Normal file
18
pkg/scraper/conversation.go
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package scraper
|
||||||
|
|
||||||
|
type ConversationID string
|
||||||
|
|
||||||
|
type Conversation struct {
|
||||||
|
ID ConversationID
|
||||||
|
Type string
|
||||||
|
SortEventID int
|
||||||
|
SortTimestamp int
|
||||||
|
Participants []User
|
||||||
|
Nsfw bool
|
||||||
|
NotificationsDisabled bool
|
||||||
|
LastReadEventId int
|
||||||
|
ReadOnly bool
|
||||||
|
Trusted bool
|
||||||
|
LowQuality bool
|
||||||
|
Muted bool
|
||||||
|
}
|
14
pkg/scraper/dm.go
Normal file
14
pkg/scraper/dm.go
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package scraper
|
||||||
|
|
||||||
|
type DMID string
|
||||||
|
|
||||||
|
type DM struct {
|
||||||
|
ID DMID `db:"id"`
|
||||||
|
Time int
|
||||||
|
Request int
|
||||||
|
ConversationID ConversationID
|
||||||
|
RecipientID UserID
|
||||||
|
SenderID UserID
|
||||||
|
Text string
|
||||||
|
MessageReactions []DMReaction
|
||||||
|
}
|
12
pkg/scraper/dm_reaction.go
Normal file
12
pkg/scraper/dm_reaction.go
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package scraper
|
||||||
|
|
||||||
|
type DMReactionID int
|
||||||
|
|
||||||
|
type DMReaction struct {
|
||||||
|
ID DMReactionID `db:"id"`
|
||||||
|
Time int
|
||||||
|
ConversationID ConversationID
|
||||||
|
MessageID DMID
|
||||||
|
ReactionKey string
|
||||||
|
SenderID UserID
|
||||||
|
}
|
12
pkg/scraper/list.go
Normal file
12
pkg/scraper/list.go
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package scraper
|
||||||
|
|
||||||
|
type ListID int
|
||||||
|
|
||||||
|
type List struct {
|
||||||
|
ID ListID `db:"rowid"`
|
||||||
|
Type string `db:"type"`
|
||||||
|
Name string `db:"name"`
|
||||||
|
|
||||||
|
UserIDs []UserID
|
||||||
|
Users []*User
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user