1
Fork 0
mirror of https://github.com/thegeneralist01/twitter-openapi synced 2026-01-11 15:40:26 +01:00

Merge pull request #52 from fa0311/dev

Dev
This commit is contained in:
ふぁ 2024-02-13 00:19:30 +09:00 committed by GitHub
commit 8443ccfd7f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 3317 additions and 517 deletions

4
.vscode/launch.json vendored
View file

@ -26,7 +26,9 @@
"justMyCode": false,
"preLaunchTask": "build-task",
"env": {
"ERROR_UNCATCHED": "True"
"ERROR_UNCATCHED": "True",
"STRICT_MODE": "True",
"MULTI_THREAD": "True"
}
}
]

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -1,15 +1,15 @@
{
"HomeTimeline": {
"queryId": "vd1SSLv05a4lAc9-ml4kpA",
"queryId": "AmMFotx7L4P3QnyOM3bCRA",
"variables": {
"count": 20,
"includePromotedContent": true,
"latestControlAvailable": true,
"requestContext": "launch",
"withCommunity": true,
"seenTweetIds": [
"1349129669258448897"
],
"withCommunity": true
]
},
"features": {
"responsive_web_graphql_exclude_directive_enabled": true,
@ -17,16 +17,18 @@
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
@ -34,7 +36,7 @@
}
},
"HomeLatestTimeline": {
"queryId": "fKbuCe1XHAqSM99T6q-MOg",
"queryId": "IjTuxEFmAb6DvzycVz4fHg",
"variables": {
"count": 20,
"includePromotedContent": true,
@ -47,16 +49,18 @@
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
@ -64,7 +68,7 @@
}
},
"ListLatestTweetsTimeline": {
"queryId": "qHgwF5h2HLowIJ6dHmAP_A",
"queryId": "HjsWc-nwwHKYwHenbHm-tw",
"variables": {
"listId": "1539453138322673664",
"count": 20
@ -75,16 +79,18 @@
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
@ -92,7 +98,7 @@
}
},
"UserByScreenName": {
"queryId": "G3KGOASz96M-Qu0nwmGXNg",
"queryId": "k5XapwcSikNsEsILW5FvgA",
"variables": {
"screen_name": "elonmusk",
"withSafetyModeUserFields": true
@ -105,6 +111,7 @@
"subscriptions_verification_info_is_identity_verified_enabled": true,
"subscriptions_verification_info_verified_since_enabled": true,
"highlights_tweets_tab_ui_enabled": true,
"responsive_web_twitter_article_notes_tab_enabled": true,
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"responsive_web_graphql_timeline_navigation_enabled": true
@ -114,7 +121,7 @@
}
},
"UserByRestId": {
"queryId": "QdS5LJDl99iL_KUzckdfNQ",
"queryId": "tD8zKvQzwY3kdx5yz6YmOw",
"variables": {
"userId": "44196397",
"withSafetyModeUserFields": true
@ -125,13 +132,14 @@
"responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false,
"highlights_tweets_tab_ui_enabled": true,
"responsive_web_twitter_article_notes_tab_enabled": true,
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"responsive_web_graphql_timeline_navigation_enabled": true
}
},
"UsersByRestIds": {
"queryId": "GD4q8bBE2i6cqWw2iT74Gg",
"queryId": "itEhGywpgX9b3GJCzOtSrA",
"variables": {
"userIds": [
"44196397"
@ -145,14 +153,14 @@
}
},
"ProfileSpotlightsQuery": {
"queryId": "_pnlqeTOtnpbIL9o-fS_pg",
"queryId": "X-Sw7rvhcUhof35mh5ObKw",
"variables": {
"screen_name": "elonmusk"
},
"features": {}
},
"UserTweets": {
"queryId": "H8OOoI-5ZE4NxgRr8lfyWg",
"queryId": "5ICa5d9-AitXZrIA3H-4MQ",
"variables": {
"userId": "44196397",
"count": 40,
@ -167,16 +175,18 @@
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
@ -184,7 +194,7 @@
}
},
"UserTweetsAndReplies": {
"queryId": "Q6aAvPw7azXZbqXzuqTALA",
"queryId": "UtLStR_BnYUGD7Q453UXQg",
"variables": {
"userId": "44196397",
"count": 40,
@ -199,16 +209,18 @@
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
@ -216,7 +228,7 @@
}
},
"UserHighlightsTweets": {
"queryId": "KTtT5_kU8yor3I3UI4G5Vw",
"queryId": "ZRU-YBvpJ5c-SOS-nb_Lhg",
"variables": {
"userId": "44196397",
"count": 40,
@ -229,16 +241,18 @@
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
@ -246,7 +260,7 @@
}
},
"UserMedia": {
"queryId": "Le6KlbilFmSu-5VltFND-Q",
"queryId": "tO4LMUYAZbR4T0SqQ85aAw",
"variables": {
"userId": "44196397",
"count": 40,
@ -262,16 +276,18 @@
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
@ -279,7 +295,7 @@
}
},
"Likes": {
"queryId": "lVf2NuhLoYVrpN4nO7uw0Q",
"queryId": "9s8V6sUI8fZLDiN-REkAxA",
"variables": {
"userId": "44196397",
"count": 20,
@ -295,16 +311,18 @@
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
@ -312,7 +330,7 @@
}
},
"Bookmarks": {
"queryId": "j5KExFXtSWj8HjRui17ydA",
"queryId": "cQxQgX8MJYjWwC0dxpyfYg",
"variables": {
"count": 20,
"includePromotedContent": true
@ -324,16 +342,18 @@
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
@ -341,9 +361,10 @@
}
},
"TweetDetail": {
"queryId": "xOhkmRac04YFZmOzU9PJHg",
"queryId": "B9_KmbkLhXt6jRwGjJrweg",
"variables": {
"focalTweetId": "1349129669258448897",
"referrer": "home",
"with_rux_injections": false,
"includePromotedContent": true,
"withCommunity": true,
@ -358,16 +379,18 @@
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
@ -378,7 +401,7 @@
}
},
"TweetResultByRestId": {
"queryId": "DJS3BdhUhcaEpZ7B7irJDg",
"queryId": "MWY3AO9_I3rcP_L2A4FR4A",
"variables": {
"tweetId": "1691730070669517096",
"withCommunity": false,
@ -387,16 +410,18 @@
},
"features": {
"creator_subscriptions_tweet_preview_api_enabled": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true,
@ -408,7 +433,7 @@
}
},
"SearchTimeline": {
"queryId": "3Ej-6N7xXONuEp5eJa1TdQ",
"queryId": "fZK7JipRHWtiZsTodhsTfQ",
"variables": {
"rawQuery": "elonmusk",
"count": 20,
@ -421,16 +446,18 @@
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
@ -438,7 +465,7 @@
}
},
"Favoriters": {
"queryId": "VIA2_af01oqZqBB6NvWi-Q",
"queryId": "LLkw5EcVutJL6y-2gkz22A",
"variables": {
"tweetId": "1349129669258448897",
"count": 20,
@ -450,16 +477,18 @@
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
@ -467,7 +496,7 @@
}
},
"Retweeters": {
"queryId": "9jBdme5U626ATWp01dvgrA",
"queryId": "X-XEqG5qHQSAwmvy00xfyQ",
"variables": {
"tweetId": "1349129669258448897",
"count": 20,
@ -479,16 +508,18 @@
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
@ -496,7 +527,7 @@
}
},
"Followers": {
"queryId": "rRXFSG5vR6drKr5M37YOTw",
"queryId": "ZG1BQPaRSg04qo55kKaW2g",
"variables": {
"userId": "44196397",
"count": 20,
@ -508,16 +539,18 @@
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
@ -525,7 +558,7 @@
}
},
"Following": {
"queryId": "iSicc7LrzWGBgDPL0tM_TQ",
"queryId": "PAnE9toEjRfE-4tozRcsfw",
"variables": {
"userId": "44196397",
"count": 20,
@ -537,16 +570,18 @@
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
@ -554,7 +589,7 @@
}
},
"BlueVerifiedFollowers": {
"queryId": "kXi37EbqWokFUNypPHhQDQ",
"queryId": "mg4dFO4kMIKt6tpqPMmFeg",
"variables": {
"userId": "1347135745706708993",
"count": 20,
@ -566,16 +601,18 @@
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
@ -583,7 +620,7 @@
}
},
"FollowersYouKnow": {
"queryId": "yqrUptVSP9DAkVLqpc0lsg",
"queryId": "citX7s5IAb1C6AVCqUO68g",
"variables": {
"userId": "44196397",
"count": 20,
@ -595,16 +632,18 @@
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
@ -612,7 +651,7 @@
}
},
"CreateTweet": {
"queryId": "PIZtQLRIYtSa9AtW_fI2Mw",
"queryId": "8ED1SMuUGkOZVBEjiYUTfw",
"variables": {
"tweet_text": "test",
"media": {
@ -632,15 +671,17 @@
"dark_request": false
},
"features": {
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": false,
"responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false,
"longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true,
"rweb_video_timestamps_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true,

View file

@ -32,6 +32,7 @@ components:
- kind
- name
- source
- retry_after
- tracing
properties:
message:
@ -54,6 +55,8 @@ components:
type: string
source:
type: string
retry_after:
type: integer
tracing:
$ref: "#/components/schemas/Tracing"

View file

@ -71,16 +71,21 @@ components:
header:
type: object
additionalProperties: true # todo
clientEventInfo:
type: object
additionalProperties: true # todo
metadata:
type: object
additionalProperties: true # todo
feedbackInfo:
$ref: "#/components/schemas/FeedbackInfo"
TimelineTimelineCursor:
required:
- "__typename"
- "cursorType"
- "value"
- "stopOnEmptyResponse"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # TimelineTimelineCursor
@ -92,6 +97,19 @@ components:
$ref: "#/components/schemas/CursorType"
value:
type: string
stopOnEmptyResponse:
type: boolean
default: false
displayTreatment:
$ref: "#/components/schemas/DisplayTreatment"
DisplayTreatment:
type: object
required:
- "actionText"
properties:
actionText:
type: string
# ================= Module =================
@ -115,6 +133,15 @@ components:
itemContent:
$ref: "#/components/schemas/ItemContentUnion"
FeedbackInfo:
required:
- "feedbackType"
properties:
feedbackKeys:
type: array
items:
type: string
# ================= ContentItem =================
ItemContentUnion:
@ -163,17 +190,18 @@ components:
type: string
tweet_results:
$ref: "#/components/schemas/ItemResult"
SocialContext:
$ref: "#/components/schemas/SocialContext"
socialContext:
$ref: "#/components/schemas/SocialContextUnion"
promotedMetadata:
type: object
additionalProperties: true # todo
highlights:
$ref: "#/components/schemas/Highlight"
TimelineUser:
required:
- "__typename"
- "itemType"
- "socialContext"
- "userDisplayType"
- "user_results"
properties:
@ -181,8 +209,8 @@ components:
$ref: "./typename.yaml#/components/schemas/TypeName" # TimelineUser
itemType:
$ref: "#/components/schemas/ContentItemType" # TimelineUser
SocialContext:
$ref: "#/components/schemas/SocialContext"
socialContext:
$ref: "#/components/schemas/SocialContextUnion"
userDisplayType:
type: string
enum: [User, UserDetailed, SubscribableUser]
@ -196,15 +224,122 @@ components:
result:
$ref: "./tweet.yaml#/components/schemas/TweetUnion"
SocialContext:
SocialContextUnion:
oneOf:
- $ref: "#/components/schemas/TimelineGeneralContext"
- $ref: "#/components/schemas/TimelineTopicContext"
discriminator:
propertyName: type
mapping": # deprecated
TimelineGeneralContext: "#/components/schemas/TimelineGeneralContext"
TimelineTopicContext: "#/components/schemas/TimelineTopicContext"
SocialContextUnionType:
type: string
enum:
- TimelineGeneralContext
- TimelineTopicContext
TimelineGeneralContext:
type: object
properties:
type:
$ref: "#/components/schemas/SocialContextUnionType"
contextType:
type: string # enum
enum: ["Follow", "Pin", "Like", "Location", "Sparkle"]
text:
type: string
landingUrl:
$ref: "#/components/schemas/SocialContextLandingUrl"
TimelineTopicContext:
type: object
properties:
type:
$ref: "#/components/schemas/SocialContextUnionType"
topic:
$ref: "#/components/schemas/TopicContext"
functionalityType:
type: string
enum: ["Basic"]
TopicContext:
type: object
properties:
id:
type: string
topic_id:
type: string
name:
type: string
description:
type: string
icon_url:
type: string
format: uri
following:
type: boolean
not_interested:
type: boolean
SocialContextLandingUrl:
type: object
properties:
urlType:
type: string # enum
enum: ["DeepLink", "UrtEndpoint"]
url:
type: string # twitter://user?id=900282258736545792
format: uri
urtEndpointOptions:
$ref: "#/components/schemas/UrtEndpointOptions"
UrtEndpointOptions:
type: object
required:
- "title"
- "requestParams"
properties:
title:
type: string
requestParams:
type: array
items:
$ref: "#/components/schemas/UrtEndpointRequestParams"
UrtEndpointRequestParams:
type: object
required:
- "key"
- "value"
properties:
key:
type: string
value:
type: string
Highlight:
type: object
required:
- "textHighlights"
properties:
textHighlights:
type: array
items:
$ref: "#/components/schemas/TextHighlight"
TextHighlight:
type: object
required:
- "startIndex"
- "endIndex"
properties:
startIndex:
type: integer
endIndex:
type: integer
TimelinePrompt:
properties:

View file

@ -23,11 +23,94 @@ components:
required:
- "__typename"
- "tweet"
- "limitedActionResults"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # TweetWithVisibilityResults
tweet:
$ref: "#/components/schemas/Tweet"
limitedActionResults:
type: object
additionalProperties: true # todo
tweetInterstitial:
$ref: "#/components/schemas/TweetInterstitial"
# {'__typename': 'ContextualTweetInterstitial', 'displayType': 'NonCompliant', 'text': {'rtl': False, 'text': 'This Post violated the X Rules. However, X has determined that it may be in the publics interest for the Post to remain accessible. Learn more', 'entities': [{'fromIndex': 133, 'toIndex': 143, 'ref': {'type': 'TimelineUrl', 'url': 'https://help.twitter.com/rules-and-policies/public-interest', 'urlType': 'ExternalUrl'}}]}, 'revealText': {'rtl': False, 'text': 'View', 'entities': []}}
TweetInterstitial:
required:
- "__typename"
- "displayType"
- "text"
- "revealText"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # ContextualTweetInterstitial
displayType:
type: string
enum: [NonCompliant]
text:
$ref: "#/components/schemas/TweetInterstitialText"
revealText:
$ref: "#/components/schemas/TweetInterstitialRevealText"
TweetInterstitialText:
required:
- "rtl"
- "text"
- "entities"
properties:
rtl:
type: boolean
text:
type: string
entities:
type: array
items:
$ref: "#/components/schemas/TweetInterstitialTextEntity"
TweetInterstitialTextEntity:
required:
- "fromIndex"
- "toIndex"
- "ref"
properties:
fromIndex:
type: integer
toIndex:
type: integer
ref:
$ref: "#/components/schemas/TweetInterstitialTextEntityRef"
TweetInterstitialTextEntityRef:
required:
- "type"
- "url"
- "urlType"
properties:
type:
type: string
enum: [TimelineUrl]
url:
type: string
format: uri
urlType:
type: string
enum: [ExternalUrl]
TweetInterstitialRevealText:
required:
- "rtl"
- "text"
- "entities"
properties:
rtl:
type: boolean
text:
type: string
entities:
type: array
items:
$ref: "#/components/schemas/TweetInterstitialTextEntity"
TweetTombstone: #remove tweet
properties:
@ -45,7 +128,6 @@ components:
# - "source"
# - "legacy"
- "views"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # null | Tweet
@ -80,6 +162,18 @@ components:
$ref: "#/components/schemas/NoteTweet"
quick_promote_eligibility:
type: object
unified_card:
$ref: "#/components/schemas/UnifiedCard"
previous_counts:
$ref: "#/components/schemas/TweetPreviousCounts"
quotedRefResult:
$ref: "#/components/schemas/QuotedRefResult"
superFollowsReplyUserResult:
$ref: "#/components/schemas/SuperFollowsReplyUserResult"
has_birdwatch_notes:
type: boolean
author_community_relationship:
$ref: "#/components/schemas/AuthorCommunityRelationship"
TweetEditControl:
properties:
@ -220,6 +314,299 @@ components:
type: string
enum: [Bold, Italic]
UnifiedCard:
required:
- "card_fetch_state"
properties:
card_fetch_state:
type: string
enum: [NoCard]
TweetPreviousCounts:
required:
- "bookmark_count"
- "favorite_count"
- "quote_count"
- "reply_count"
- "retweet_count"
properties:
bookmark_count:
type: integer
favorite_count:
type: integer
quote_count:
type: integer
reply_count:
type: integer
retweet_count:
type: integer
QuotedRefResult:
required:
- "result"
properties:
result:
$ref: "#/components/schemas/QuotedRefResultData"
QuotedRefResultData:
required:
- "__typename"
- "rest_id"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # Tweet
rest_id:
type: string
pattern: "^[0-9]+$"
SuperFollowsReplyUserResult:
required:
- "result"
properties:
result:
$ref: "#/components/schemas/SuperFollowsReplyUserResultData"
SuperFollowsReplyUserResultData:
required:
- "__typename"
- "legacy"
properties:
__typename:
$ref: "./../schemas/typename.yaml#/components/schemas/TypeName" # User
legacy:
$ref: "#/components/schemas/SuperFollowsReplyUserResultLegacy"
SuperFollowsReplyUserResultLegacy:
required:
- "screen_name"
properties:
screen_name:
type: string
AuthorCommunityRelationship:
required:
- "community_results"
properties:
community_results:
$ref: "#/components/schemas/Community"
role:
type: string
enum: [Member]
user_results:
$ref: "user.yaml#/components/schemas/UserResults"
Community:
required:
- "result"
properties:
result:
$ref: "#/components/schemas/CommunityData"
CommunityData:
required:
- "__typename"
- "id_str"
- "name"
- "description"
- "question"
- "search_tags"
- "primary_community_topic"
- "actions"
- "admin_results"
- "creator_results"
- "invites_result"
- "join_policy"
- "invites_policy"
- "is_pinned"
- "members_facepile_results"
- "moderator_count"
- "member_count"
- "role"
- "rules"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # Community
id_str:
type: string
pattern: "^[0-9]+$"
name:
type: string
description:
type: string
created_at:
type: integer
question:
type: string
search_tags:
type: array
items:
type: string
primary_community_topic:
$ref: "#/components/schemas/PrimaryCommunityTopic"
actions:
$ref: "#/components/schemas/CommunityActions"
admin_results:
$ref: "user.yaml#/components/schemas/UserResults"
creator_results:
$ref: "user.yaml#/components/schemas/UserResults"
invites_result:
$ref: "#/components/schemas/CommunityInvitesResult"
join_requests_result:
$ref: "#/components/schemas/CommunityJoinRequestsResult"
join_policy:
type: string
enum: [Open]
invites_policy:
type: string
enum: [MemberInvitesAllowed]
is_pinned:
type: boolean
members_facepile_results:
type: array
items:
$ref: "user.yaml#/components/schemas/UserResults"
moderator_count:
type: integer
member_count:
type: integer
role:
type: string
enum: [NonMember]
rules:
type: array
items:
$ref: "#/components/schemas/CommunityRule"
show_only_users_to_display:
type: array
items:
type: string
urls:
$ref: "#/components/schemas/CommunityUrls"
default_banner_media:
type: object
additionalProperties: true # todo
custom_banner_media:
type: object
additionalProperties: true # todo
viewer_relationship:
type: object
additionalProperties: true # todo
PrimaryCommunityTopic:
required:
- "topic_id"
- "topic_name"
properties:
topic_id:
type: string
pattern: "^[0-9]+$"
topic_name:
type: string
CommunityActions:
required:
- "delete_action_result"
- "join_action_result"
- "leave_action_result"
- "pin_action_result"
properties:
delete_action_result:
$ref: "#/components/schemas/CommunityDeleteActionResult"
join_action_result:
$ref: "#/components/schemas/CommunityJoinActionResult"
leave_action_result:
$ref: "#/components/schemas/CommunityLeaveActionResult"
pin_action_result:
$ref: "#/components/schemas/CommunityPinActionResult"
CommunityDeleteActionResult:
required:
- "__typename"
- "reason"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # CommunityDeleteActionUnavailable
reason:
type: string
enum: [Unavailable]
CommunityJoinActionResult:
required:
- "__typename"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # CommunityJoinAction
CommunityLeaveActionResult:
required:
- "__typename"
- "reason"
- "message"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # CommunityLeaveActionUnavailable
reason:
type: string
enum: [ViewerNotMember]
message:
type: string
CommunityPinActionResult:
required:
- "__typename"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # CommunityTweetPinActionUnavailable
CommunityInvitesResult:
required:
- "__typename"
- "reason"
- "message"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # CommunityInvitesUnavailable
reason:
type: string
enum: [Unavailable]
message:
type: string
CommunityJoinRequestsResult:
required:
- "__typename"
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # CommunityJoinRequestsUnavailable
CommunityRule:
required:
- "rest_id"
- "name"
properties:
rest_id:
type: string
pattern: "^[0-9]+$"
name:
type: string
description:
type: string
CommunityUrls:
required:
- "permalink"
properties:
permalink:
$ref: "#/components/schemas/CommunityUrlsPermalink"
CommunityUrlsPermalink:
required:
- "url"
properties:
url:
type: string
format: uri
BirdwatchPivot:
required:
- "destinationUrl"
@ -249,6 +636,8 @@ components:
iconType:
type: string
enum: [BirdwatchV1Icon]
callToAction:
$ref: "#/components/schemas/BirdwatchPivotCallToAction"
BirdwatchPivotFooter:
required:
@ -311,6 +700,21 @@ components:
items:
$ref: "#/components/schemas/BirdwatchEntity"
BirdwatchPivotCallToAction:
# {'prompt': 'Do you find this helpful?', 'title': 'Rate it', 'destinationUrl': 'https://twitter.com/i/birdwatch/n/1710821689636934115'}
required:
- "prompt"
- "title"
- "destinationUrl"
properties:
prompt:
type: string
title:
type: string
destinationUrl:
type: string
format: uri
TweetCard:
properties:
rest_id:
@ -333,6 +737,50 @@ components:
items:
$ref: "#/components/schemas/TweetCardLegacyBindingValue"
# {'platform': {'audience': {'name': 'production'}, 'device': {'name': 'Swift', 'version': '12'}}}
card_platform:
$ref: "#/components/schemas/TweetCardPlatformData"
user_refs_results:
type: array
items:
$ref: "user.yaml#/components/schemas/UserResults"
TweetCardPlatformData:
required:
- "platform"
properties:
platform:
$ref: "#/components/schemas/TweetCardPlatform"
TweetCardPlatform:
required:
- "audience"
- "device"
properties:
audience:
$ref: "#/components/schemas/TweetCardPlatformAudience"
device:
$ref: "#/components/schemas/TweetCardPlatformDevice"
TweetCardPlatformAudience:
required:
- "name"
properties:
name:
type: string
enum: [production]
TweetCardPlatformDevice:
required:
- "name"
- "version"
properties:
name:
type: string # enum Swift
version:
type: string
pattern: "^[0-9]+$"
TweetCardLegacyBindingValue:
required:
- "key"
@ -355,6 +803,37 @@ components:
type: string
type:
type: string
image_value:
$ref: "#/components/schemas/TweetCardLegacyBindingValueDataImage"
image_color_value:
type: object
additionalProperties: true # todo
user_value:
$ref: "#/components/schemas/UserValue"
UserValue:
required:
- "id_str"
properties:
id_str:
type: string
pattern: "^[0-9]+$"
TweetCardLegacyBindingValueDataImage:
required:
- "height"
- "width"
- "url"
properties:
height:
type: integer
width:
type: integer
url:
type: string
format: uri
alt:
type: string
TweetLegacy:
required:
@ -427,6 +906,32 @@ components:
$ref: "#/components/schemas/SelfThread"
extended_entities:
$ref: "#/components/schemas/ExtendedEntities"
scopes:
$ref: "#/components/schemas/TweetLegacyScopes"
in_reply_to_screen_name:
type: string
in_reply_to_status_id_str:
type: string
pattern: "^[0-9]+$"
in_reply_to_user_id_str:
type: string
pattern: "^[0-9]+$"
quoted_status_permalink:
$ref: "#/components/schemas/QuotedStatusPermalink"
quoted_status_id_str:
type: string
pattern: "^[0-9]+$"
conversation_control:
additionalProperties: true # todo
limited_actions:
type: string
enum:
- "limited_replies"
- "community_tweet_non_member_public_community"
- "non_compliant"
- "dynamic_product_ad"
place:
additionalProperties: true # todo
SelfThread:
required:
@ -506,6 +1011,8 @@ components:
# - "features"
- "sizes"
- "original_info"
- "media_key"
- "ext_media_availability"
properties:
display_url:
type: string
@ -535,6 +1042,47 @@ components:
$ref: "#/components/schemas/MediaSizes"
original_info:
$ref: "#/components/schemas/MediaOriginalInfo"
media_key:
type: string
ext_media_availability:
$ref: "#/components/schemas/ExtMediaAvailability"
video_info:
type: object
additionalProperties: true # todo
additional_media_info:
type: object
additionalProperties: true # todo
source_user_id_str:
type: string
pattern: "^[0-9]+$"
source_status_id_str:
type: string
pattern: "^[0-9]+$"
ext_alt_text:
type: string
TweetLegacyScopes:
required:
- "followers"
properties:
followers:
type: boolean
QuotedStatusPermalink:
required:
- "url"
- "expanded"
- "display"
properties:
url:
type: string
format: uri
expanded:
type: string
format: uri
display:
type: string
format: uri
ExtendedEntities:
required:
@ -587,9 +1135,9 @@ components:
additional_media_info:
$ref: "#/components/schemas/AdditionalMediaInfo"
mediaStats:
$ref: "#/components/schemas/mediaStats"
$ref: "#/components/schemas/MediaStats"
ext_media_availability:
$ref: "#/components/schemas/extMediaAvailability"
$ref: "#/components/schemas/ExtMediaAvailability"
features:
type: object
sizes:
@ -598,6 +1146,14 @@ components:
$ref: "#/components/schemas/MediaOriginalInfo"
video_info:
$ref: "#/components/schemas/MediaVideoInfo"
source_user_id_str:
type: string
pattern: "^[0-9]+$"
source_status_id_str:
type: string
pattern: "^[0-9]+$"
ext_alt_text:
type: string
MediaOriginalInfo:
required:
@ -665,15 +1221,40 @@ components:
properties:
monetizable:
type: boolean
source_user:
$ref: "./user.yaml#/components/schemas/UserResultCore"
title: # null character
type: string
description: # null character
type: string
embeddable:
type: boolean
call_to_actions:
$ref: "#/components/schemas/AdditionalMediaInfoCallToActions"
mediaStats:
AdditionalMediaInfoCallToActions:
required:
- "visit_site"
properties:
visit_site:
$ref: "#/components/schemas/AdditionalMediaInfoCallToActionsVisitSite"
AdditionalMediaInfoCallToActionsVisitSite:
required:
- "url"
properties:
url:
type: string
format: uri
MediaStats:
required:
- "viewCount"
properties:
viewCount:
type: integer
extMediaAvailability:
ExtMediaAvailability:
# required:
# - "status"
properties:

View file

@ -14,6 +14,7 @@ components:
TimelineUser,
TimelineTimelineCursor,
TweetWithVisibilityResults,
ContextualTweetInterstitial,
TimelineTimelineModule,
TweetTombstone,
TimelinePrompt,
@ -23,4 +24,11 @@ components:
Tweet,
User,
UserUnavailable,
Community,
CommunityDeleteActionUnavailable,
CommunityJoinAction,
CommunityLeaveActionUnavailable,
CommunityTweetPinActionUnavailable,
CommunityInvitesUnavailable,
CommunityJoinRequestsUnavailable,
]

View file

@ -38,6 +38,7 @@ components:
- "super_follow_eligible"
- "super_followed_by"
- "super_following"
- "profile_image_shape"
properties:
__typename:
@ -73,6 +74,125 @@ components:
super_following:
type: boolean
default: false
profile_image_shape:
type: string
enum:
- "Circle"
- "Square"
- "Hexagon"
professional:
$ref: "#/components/schemas/UserProfessional"
user_seed_tweet_count:
type: integer
highlights_info:
$ref: "#/components/schemas/UserHighlightsInfo"
creator_subscriptions_count:
type: integer
verification_info:
$ref: "#/components/schemas/UserVerificationInfo"
is_profile_translatable:
type: boolean
UserProfessional:
required:
- "rest_id"
- "professional_type"
- "category"
properties:
rest_id:
type: string
pattern: "^[0-9]+$"
professional_type:
type: string
enum: ["Business", "Creator"]
category:
type: array
items:
$ref: "#/components/schemas/UserProfessionalCategory"
UserProfessionalCategory:
required:
- "id"
- "name"
- "icon_name"
properties:
id:
type: integer
name:
type: string # enum
icon_name:
type: string # IconBriefcaseStroke ?
UserHighlightsInfo:
required:
- "can_highlight_tweets"
- "highlighted_tweets"
properties:
can_highlight_tweets:
type: boolean
highlighted_tweets:
type: string
UserVerificationInfo:
required:
- "is_identity_verified"
properties:
is_identity_verified:
type: boolean
default: false
reason:
$ref: "#/components/schemas/UserVerificationInfoReason"
UserVerificationInfoReason:
required:
- "description"
- "verified_since_msec"
- "override_verified_year"
properties:
description:
$ref: "#/components/schemas/UserVerificationInfoReasonDescription"
verified_since_msec:
type: string
pattern: "^-?[0-9]+$"
override_verified_year:
type: integer
UserVerificationInfoReasonDescription:
required:
- "text"
- "entities"
properties:
text:
type: string
entities:
type: array
items:
$ref: "#/components/schemas/UserVerificationInfoReasonDescriptionEntities"
UserVerificationInfoReasonDescriptionEntities:
required:
- "from_index"
- "to_index"
- "ref"
properties:
from_index:
type: integer
to_index:
type: integer
ref:
$ref: "#/components/schemas/UserVerificationInfoReasonDescriptionEntitiesRef"
UserVerificationInfoReasonDescriptionEntitiesRef:
required:
- "url"
- "url_type"
properties:
url:
type: string
format: uri
url_type:
type: string
enum: ["ExternalUrl"]
UserLegacy:
required:
@ -219,6 +339,13 @@ components:
want_retweets:
type: boolean
default: false
verified_type:
type: string
enum: ["Business", "Government"]
withheld_in_countries:
type: array
items:
type: string # enum DE
UserUnavailable:
required:

View file

@ -6,11 +6,13 @@ import logging
import os
import time
import traceback
import warnings
from pathlib import Path
import aenum
import openapi_client as pt
warnings.filterwarnings("ignore")
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s %(levelname)s %(message)s")
logger = logging.getLogger("test_serialize")
@ -19,6 +21,7 @@ ERROR_UNCATCHED = os.environ.get("ERROR_UNCATCHED", "false").lower() == "true"
SLEEP_TIME = float(os.environ.get("SLEEP", "0"))
CUESOR_TEST_COUNT = int(os.environ.get("CUESOR_TEST_COUNT", "3"))
STRICT_MODE = os.environ.get("STRICT_MODE", "false").lower() == "true"
MULTI_THREAD = os.environ.get("MULTI_THREAD", "true").lower() == "true"
def get_key(snake_str):
@ -62,13 +65,25 @@ def get_kwargs(key, additional):
return kwargs
def match_rate_zero(key):
def match_rate_zero(a, b, base, key):
def get(obj, key):
if isinstance(obj, list):
return get(obj[key[0]], key[1:])
if obj.__dict__.get("actual_instance") is not None:
return get(obj.actual_instance, key)
if len(key) == 0:
return obj
return get(super_get(obj.__dict__, key[0]), key[1:])
if STRICT_MODE:
raise Exception(f"Strict mode: {key}")
obj_name = type(get(base, key[:-1]))
obj_key = f"{obj_name.__name__}.{key[-1]}"
raise Exception(f"Not defined: {obj_key}\nContents: {b}")
return 0
def match_rate(a, b, key=""):
def match_rate(a, b, base, key=""):
if isinstance(a, aenum.Enum):
a = a.value
if isinstance(b, aenum.Enum):
@ -77,26 +92,30 @@ def match_rate(a, b, key=""):
return 1
if a is False and b is None:
return 1
if isinstance(a, list):
data = [match_rate(a[i], b[i], key=f"{key}[{i}]") for i in range(len(a))]
if a is None and isinstance(b, list) and len(b) == 0:
return 1
if isinstance(a, list) and b is None and len(a) == 0:
return 1
if a is None and isinstance(b, dict) and len(b) == 0:
return 1
if isinstance(a, dict) and b is None and len(a) == 0:
return 1
if isinstance(a, dict) and isinstance(b, dict):
if len(a) == 0 and len(b) == 0:
return 1
if len(a) == 0 or len(b) == 0:
return match_rate_zero(key)
data = [match_rate(a.get(k), b.get(k), key=f"{key}.{k}") for k in a.keys()]
return sum(data) / len(a)
marge_key = set(a.keys()) | set(b.keys())
data = [match_rate(a.get(k), b.get(k), base, [*key, k]) for k in marge_key]
return sum(data) / len(b)
if isinstance(a, list) and isinstance(b, list):
if len(a) == 0 and len(b) == 0:
return 1
if len(a) != len(b):
return match_rate_zero(key)
data = [match_rate(a[i], b[i], key=f"{key}[{i}]") for i in range(len(a))]
return match_rate_zero(a, b, base, key)
data = [match_rate(a[i], b[i], base, [*key, i]) for i in range(len(a))]
return sum(data) / len(a)
if a == b:
return 1
return match_rate_zero(key)
return match_rate_zero(a, b, base, key)
def save_cache(data):
@ -106,12 +125,29 @@ def save_cache(data):
json.dump(data, f, indent=4)
def super_get(obj: dict, key: str):
keys = [
key,
"".join(["_" + c.lower() if c.isupper() else c for c in key]).lstrip("_"),
]
for k in keys:
if obj.get(k) is not None:
return obj[k]
raise KeyError(key)
def task_callback(file, thread=True):
try:
with open(file, "r") as f:
cache = json.load(f)
data = pt.__dict__[cache["type"]].from_json(cache["raw"])
rate = match_rate(data.to_dict(), json.loads(cache["raw"]))
rate = match_rate(
data.to_dict(),
json.loads(cache["raw"]),
base=data,
)
return rate, file
except Exception:
if thread:
@ -149,10 +185,18 @@ if __name__ == "__main__":
placeholder = json.load(f)
fail = []
with concurrent.futures.ProcessPoolExecutor() as executor:
tasks = [executor.submit(task_callback, x) for x in glob.glob("cache/*.json")]
for task in concurrent.futures.as_completed(tasks):
rate, file = task.result()
files = glob.glob("cache/*.json")
if MULTI_THREAD:
with concurrent.futures.ProcessPoolExecutor() as executor:
tasks = [executor.submit(task_callback, x) for x in files]
for task in concurrent.futures.as_completed(tasks):
rate, file = task.result()
if rate < 1:
fail.append(file)
logger.info(f"Match rate: {rate}")
else:
for file in files:
rate, file = task_callback(file, thread=False)
if rate < 1:
fail.append(file)
logger.info(f"Match rate: {rate}")
@ -212,7 +256,11 @@ if __name__ == "__main__":
new_cursor = set(get_cursor(data, find_cursor)) - cursor_history
cursor_list.update(new_cursor)
rate = match_rate(data, json.loads(res.raw_data))
rate = match_rate(
data,
json.loads(res.raw_data),
res.data,
)
logger.info(f"Match rate: {rate}")
if data.get("errors") is not None:
@ -233,7 +281,11 @@ if __name__ == "__main__":
res = pt.UserApi(api_client).get_user_by_screen_name_with_http_info(**kwargs)
data = res.data.to_dict()
rate = match_rate(data, json.loads(res.raw_data))
rate = match_rate(
data,
json.loads(res.raw_data),
res.data,
)
logger.info(f"Match rate: {rate}")
screen_name = data["data"]["user"]["result"]["legacy"]["screen_name"]
if not screen_name == "a810810931931":
@ -248,7 +300,11 @@ if __name__ == "__main__":
res = pt.TweetApi(api_client).get_user_tweets_with_http_info(**kwargs)
data = res.data.to_dict()
rate = match_rate(data, json.loads(res.raw_data))
rate = match_rate(
data,
json.loads(res.raw_data),
res.data,
)
logger.info(f"Match rate: {rate}")
except Exception as e:
@ -267,7 +323,11 @@ if __name__ == "__main__":
res = pt.TweetApi(api_client).get_tweet_detail_with_http_info(**kwargs)
data = res.data.to_dict()
rate = match_rate(data, json.loads(res.raw_data))
rate = match_rate(
data,
json.loads(res.raw_data),
res.data,
)
logger.info(f"Match rate: {rate}")
except Exception as e:
error_dump(e)