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

Merge branch 'dev'

Signed-off-by: ふぁ <yuki@yuki0311.com>
This commit is contained in:
ふぁ 2024-09-29 23:18:51 +09:00
commit fb626cc2ff
No known key found for this signature in database
GPG key ID: 83A8A5E74872A8AA
23 changed files with 1707 additions and 1352 deletions

3
.gitignore vendored
View file

@ -3,4 +3,5 @@ __pycache__/
cookie.json cookie.json
*_generated *_generated
*.jar *.jar
cache/ cache/
tools/input.js

17
.vscode/settings.json vendored
View file

@ -6,14 +6,23 @@
"yaml.schemas": { "yaml.schemas": {
"https://raw.githubusercontent.com/OAI/OpenAPI-Specification/main/schemas/v3.0/schema.json": "src/**/*.yaml" "https://raw.githubusercontent.com/OAI/OpenAPI-Specification/main/schemas/v3.0/schema.json": "src/**/*.yaml"
}, },
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[jsonc]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[yaml]": { "[yaml]": {
"editor.defaultFormatter": "redhat.vscode-yaml" "editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[markdown]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
}, },
// "python.analysis.typeCheckingMode": "basic", // "python.analysis.typeCheckingMode": "basic",
"[python]": { "[python]": {
"editor.codeActionsOnSave": { "editor.codeActionsOnSave": {
"source.organizeImports": "explicit", "source.organizeImports": "explicit",
"source.fixAll": "explicit", "source.fixAll": "explicit"
}, }
} }
} }

7
.vscode/tasks.json vendored
View file

@ -16,7 +16,6 @@
"command": [ "command": [
".venv/Scripts/activate;", ".venv/Scripts/activate;",
"python tools/build.py;", "python tools/build.py;",
"scoop reset temurin11-jdk;",
"java -jar openapi-generator-cli.jar generate -c test/python/openapi-generator-config.yaml -g python;", "java -jar openapi-generator-cli.jar generate -c test/python/openapi-generator-config.yaml -g python;",
"python -m pip install ./python_generated;" "python -m pip install ./python_generated;"
] ]
@ -32,16 +31,16 @@
"command": [ "command": [
"python3 -m venv .venv;", "python3 -m venv .venv;",
".venv/bin/python3 -m pip install -r requirements.txt;", ".venv/bin/python3 -m pip install -r requirements.txt;",
"wget https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.4.0/openapi-generator-cli-7.4.0.jar -O openapi-generator-cli.jar;" "wget https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.8.0/openapi-generator-cli-7.8.0.jar -O openapi-generator-cli.jar;"
] ]
}, },
"windows": { "windows": {
"command": [ "command": [
"python -m venv .venv;", "python -m venv .venv;",
".venv/Scripts/python -m pip install -r requirements.txt;", ".venv/Scripts/python -m pip install -r requirements.txt;",
"Invoke-WebRequest https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.4.0/openapi-generator-cli-7.4.0.jar -OutFile openapi-generator-cli.jar;" "Invoke-WebRequest https://repo1.maven.org/maven2/org/openapitools/openapi-generator-cli/7.8.0/openapi-generator-cli-7.8.0.jar -OutFile openapi-generator-cli.jar;"
] ]
} }
} }
] ]
} }

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,31 @@
{
"errors": [
{
"message": "_Missing: No status found with that ID.",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": ["threaded_conversation_with_injections_v2"],
"extensions": {
"name": "GenericError",
"source": "Server",
"code": 144,
"kind": "NonFatal",
"tracing": {
"trace_id": "e6de8b2b694ae128"
}
},
"code": 144,
"kind": "NonFatal",
"name": "GenericError",
"source": "Server",
"tracing": {
"trace_id": "e6de8b2b694ae128"
}
}
],
"data": {}
}

Binary file not shown.

View file

@ -11,7 +11,7 @@ paths:
required: true required: true
schema: schema:
type: string type: string
default: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36" default: "Not Implemented"
description: "UserAgent, some APIs may be rejected if changed." description: "UserAgent, some APIs may be rejected if changed."
- name: authorization - name: authorization
in: header in: header
@ -118,8 +118,8 @@ paths:
required: true required: true
schema: schema:
type: string type: string
default: "https://twitter.com/home" default: "https://x.com/home"
description: "https://twitter.com/home" description: "https://x.com/home"
- name: Priority - name: Priority
in: header in: header
required: true required: true
@ -135,7 +135,7 @@ paths:
components: components:
securitySchemes: securitySchemes:
UserAgent: UserAgent:
description: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36" description: "Not Implemented"
in: header in: header
name: user-agent name: user-agent
type: apiKey type: apiKey
@ -211,7 +211,7 @@ components:
name: Sec-Fetch-Site name: Sec-Fetch-Site
type: apiKey type: apiKey
Referer: Referer:
description: "https://twitter.com/home" description: "https://x.com/home"
in: header in: header
name: Referer name: Referer
type: apiKey type: apiKey

View file

@ -1,15 +1,13 @@
{ {
"HomeTimeline": { "HomeTimeline": {
"queryId": "q1x0puFIVMzsbx2Yoh-usA", "queryId": "HJFjzBgCs16TqxewQOeLNg",
"variables": { "variables": {
"count": 20, "count": 20,
"includePromotedContent": true, "includePromotedContent": true,
"latestControlAvailable": true, "latestControlAvailable": true,
"requestContext": "launch", "requestContext": "launch",
"withCommunity": true, "withCommunity": true,
"seenTweetIds": [ "seenTweetIds": ["1349129669258448897"]
"1349129669258448897"
]
}, },
"features": { "features": {
"rweb_tipjar_consumption_enabled": true, "rweb_tipjar_consumption_enabled": true,
@ -21,7 +19,6 @@
"communities_web_enable_tweet_community_results_fetch": true, "communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true, "c9s_tweet_anatomy_moderator_badge_enabled": true,
"articles_preview_enabled": true, "articles_preview_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true, "responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true, "view_counts_everywhere_api_enabled": true,
@ -32,7 +29,6 @@
"freedom_of_speech_not_reach_fetch_enabled": true, "freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true, "standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"tweet_with_visibility_results_prefer_gql_media_interstitial_enabled": true,
"rweb_video_timestamps_enabled": true, "rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true, "longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true, "longform_notetweets_inline_media_enabled": true,
@ -40,15 +36,13 @@
} }
}, },
"HomeLatestTimeline": { "HomeLatestTimeline": {
"queryId": "eL8vHLgEw2ZL9X9dKdakLQ", "queryId": "DiTkXJgLqBBxCs7zaYsbtA",
"variables": { "variables": {
"count": 20, "count": 20,
"includePromotedContent": true, "includePromotedContent": true,
"latestControlAvailable": true, "latestControlAvailable": true,
"requestContext": "launch", "requestContext": "launch",
"seenTweetIds": [ "seenTweetIds": ["1349129669258448897"]
"1349129669258448897"
]
}, },
"features": { "features": {
"rweb_tipjar_consumption_enabled": true, "rweb_tipjar_consumption_enabled": true,
@ -60,7 +54,6 @@
"communities_web_enable_tweet_community_results_fetch": true, "communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true, "c9s_tweet_anatomy_moderator_badge_enabled": true,
"articles_preview_enabled": true, "articles_preview_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true, "responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true, "view_counts_everywhere_api_enabled": true,
@ -71,7 +64,6 @@
"freedom_of_speech_not_reach_fetch_enabled": true, "freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true, "standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"tweet_with_visibility_results_prefer_gql_media_interstitial_enabled": true,
"rweb_video_timestamps_enabled": true, "rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true, "longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true, "longform_notetweets_inline_media_enabled": true,
@ -79,7 +71,7 @@
} }
}, },
"ListLatestTweetsTimeline": { "ListLatestTweetsTimeline": {
"queryId": "GX5ovLTwyoN1Td13GHvhIg", "queryId": "Pa45JvqZuKcW1plybfgBlQ",
"variables": { "variables": {
"listId": "1539453138322673664", "listId": "1539453138322673664",
"count": 20 "count": 20
@ -94,7 +86,6 @@
"communities_web_enable_tweet_community_results_fetch": true, "communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true, "c9s_tweet_anatomy_moderator_badge_enabled": true,
"articles_preview_enabled": true, "articles_preview_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true, "responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true, "view_counts_everywhere_api_enabled": true,
@ -105,7 +96,6 @@
"freedom_of_speech_not_reach_fetch_enabled": true, "freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true, "standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"tweet_with_visibility_results_prefer_gql_media_interstitial_enabled": true,
"rweb_video_timestamps_enabled": true, "rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true, "longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true, "longform_notetweets_inline_media_enabled": true,
@ -113,20 +103,21 @@
} }
}, },
"UserByScreenName": { "UserByScreenName": {
"queryId": "k5XapwcSikNsEsILW5FvgA", "queryId": "Yka-W8dz7RaEuQNkroPkYw",
"variables": { "variables": {
"screen_name": "elonmusk", "screen_name": "elonmusk",
"withSafetyModeUserFields": true "withSafetyModeUserFields": true
}, },
"features": { "features": {
"hidden_profile_likes_enabled": true,
"hidden_profile_subscriptions_enabled": true, "hidden_profile_subscriptions_enabled": true,
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true, "responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false, "verified_phone_label_enabled": false,
"subscriptions_verification_info_is_identity_verified_enabled": true, "subscriptions_verification_info_is_identity_verified_enabled": true,
"subscriptions_verification_info_verified_since_enabled": true, "subscriptions_verification_info_verified_since_enabled": true,
"highlights_tweets_tab_ui_enabled": true, "highlights_tweets_tab_ui_enabled": true,
"responsive_web_twitter_article_notes_tab_enabled": true, "responsive_web_twitter_article_notes_tab_enabled": true,
"subscriptions_feature_can_gift_premium": true,
"creator_subscriptions_tweet_preview_api_enabled": true, "creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"responsive_web_graphql_timeline_navigation_enabled": true "responsive_web_graphql_timeline_navigation_enabled": true
@ -154,13 +145,12 @@
} }
}, },
"UsersByRestIds": { "UsersByRestIds": {
"queryId": "itEhGywpgX9b3GJCzOtSrA", "queryId": "GYBpHkmyXjeuX9IeNJmweA",
"variables": { "variables": {
"userIds": [ "userIds": ["44196397"]
"44196397"
]
}, },
"features": { "features": {
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true, "responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false, "verified_phone_label_enabled": false,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
@ -168,14 +158,14 @@
} }
}, },
"ProfileSpotlightsQuery": { "ProfileSpotlightsQuery": {
"queryId": "X-Sw7rvhcUhof35mh5ObKw", "queryId": "-0XdHI-mrHWBQd8-oLo1aA",
"variables": { "variables": {
"screen_name": "elonmusk" "screen_name": "elonmusk"
}, },
"features": {} "features": {}
}, },
"UserTweets": { "UserTweets": {
"queryId": "5ICa5d9-AitXZrIA3H-4MQ", "queryId": "E3opETHurmVJflFsUBVuUQ",
"variables": { "variables": {
"userId": "44196397", "userId": "44196397",
"count": 40, "count": 40,
@ -185,31 +175,33 @@
"withV2Timeline": true "withV2Timeline": true
}, },
"features": { "features": {
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true, "responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false, "verified_phone_label_enabled": false,
"creator_subscriptions_tweet_preview_api_enabled": true, "creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true, "responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true, "c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true, "articles_preview_enabled": true,
"responsive_web_edit_tweet_api_enabled": true, "responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true, "view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true, "longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": true, "responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false, "tweet_awards_web_tipping_enabled": false,
"creator_subscriptions_quote_tweet_preview_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true, "freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true, "standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true, "rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true, "longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true, "longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
"responsive_web_enhance_cards_enabled": false "responsive_web_enhance_cards_enabled": false
} }
}, },
"UserTweetsAndReplies": { "UserTweetsAndReplies": {
"queryId": "UtLStR_BnYUGD7Q453UXQg", "queryId": "bt4TKuFz4T7Ckk-VvQVSow",
"variables": { "variables": {
"userId": "44196397", "userId": "44196397",
"count": 40, "count": 40,
@ -219,31 +211,33 @@
"withV2Timeline": true "withV2Timeline": true
}, },
"features": { "features": {
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true, "responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false, "verified_phone_label_enabled": false,
"creator_subscriptions_tweet_preview_api_enabled": true, "creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true, "responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true, "c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true, "articles_preview_enabled": true,
"responsive_web_edit_tweet_api_enabled": true, "responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true, "view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true, "longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": true, "responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false, "tweet_awards_web_tipping_enabled": false,
"creator_subscriptions_quote_tweet_preview_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true, "freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true, "standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true, "rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true, "longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true, "longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
"responsive_web_enhance_cards_enabled": false "responsive_web_enhance_cards_enabled": false
} }
}, },
"UserHighlightsTweets": { "UserHighlightsTweets": {
"queryId": "ZRU-YBvpJ5c-SOS-nb_Lhg", "queryId": "Z-XscDcWUuMO5HalgHf57A",
"variables": { "variables": {
"userId": "44196397", "userId": "44196397",
"count": 40, "count": 40,
@ -251,31 +245,33 @@
"withVoice": true "withVoice": true
}, },
"features": { "features": {
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true, "responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false, "verified_phone_label_enabled": false,
"creator_subscriptions_tweet_preview_api_enabled": true, "creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true, "responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true, "c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true, "articles_preview_enabled": true,
"responsive_web_edit_tweet_api_enabled": true, "responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true, "view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true, "longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": true, "responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false, "tweet_awards_web_tipping_enabled": false,
"creator_subscriptions_quote_tweet_preview_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true, "freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true, "standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true, "rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true, "longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true, "longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
"responsive_web_enhance_cards_enabled": false "responsive_web_enhance_cards_enabled": false
} }
}, },
"UserMedia": { "UserMedia": {
"queryId": "tO4LMUYAZbR4T0SqQ85aAw", "queryId": "dexO_2tohK86JDudXXG3Yw",
"variables": { "variables": {
"userId": "44196397", "userId": "44196397",
"count": 40, "count": 40,
@ -286,31 +282,33 @@
"withV2Timeline": true "withV2Timeline": true
}, },
"features": { "features": {
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true, "responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false, "verified_phone_label_enabled": false,
"creator_subscriptions_tweet_preview_api_enabled": true, "creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true, "responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true, "c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true, "articles_preview_enabled": true,
"responsive_web_edit_tweet_api_enabled": true, "responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true, "view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true, "longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": true, "responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false, "tweet_awards_web_tipping_enabled": false,
"creator_subscriptions_quote_tweet_preview_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true, "freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true, "standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true, "rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true, "longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true, "longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
"responsive_web_enhance_cards_enabled": false "responsive_web_enhance_cards_enabled": false
} }
}, },
"Likes": { "Likes": {
"queryId": "9s8V6sUI8fZLDiN-REkAxA", "queryId": "aeJWz--kknVBOl7wQ7gh7Q",
"variables": { "variables": {
"userId": "44196397", "userId": "44196397",
"count": 20, "count": 20,
@ -321,62 +319,66 @@
"withV2Timeline": true "withV2Timeline": true
}, },
"features": { "features": {
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true, "responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false, "verified_phone_label_enabled": false,
"creator_subscriptions_tweet_preview_api_enabled": true, "creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true, "responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true, "c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true, "articles_preview_enabled": true,
"responsive_web_edit_tweet_api_enabled": true, "responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true, "view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true, "longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": true, "responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false, "tweet_awards_web_tipping_enabled": false,
"creator_subscriptions_quote_tweet_preview_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true, "freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true, "standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true, "rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true, "longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true, "longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
"responsive_web_enhance_cards_enabled": false "responsive_web_enhance_cards_enabled": false
} }
}, },
"Bookmarks": { "Bookmarks": {
"queryId": "cQxQgX8MJYjWwC0dxpyfYg", "queryId": "QUjXply7fA7fk05FRyajEg",
"variables": { "variables": {
"count": 20, "count": 20,
"includePromotedContent": true "includePromotedContent": true
}, },
"features": { "features": {
"graphql_timeline_v2_bookmark_timeline": true, "graphql_timeline_v2_bookmark_timeline": true,
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true, "responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false, "verified_phone_label_enabled": false,
"creator_subscriptions_tweet_preview_api_enabled": true, "creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true, "responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true, "c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true, "articles_preview_enabled": true,
"responsive_web_edit_tweet_api_enabled": true, "responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true, "view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true, "longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": true, "responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false, "tweet_awards_web_tipping_enabled": false,
"creator_subscriptions_quote_tweet_preview_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true, "freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true, "standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true, "rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true, "longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true, "longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
"responsive_web_enhance_cards_enabled": false "responsive_web_enhance_cards_enabled": false
} }
}, },
"TweetDetail": { "TweetDetail": {
"queryId": "zJvfJs3gSbrVhC0MKjt_OQ", "queryId": "QuBlQ6SxNAQCt6-kBiCXCQ",
"variables": { "variables": {
"focalTweetId": "1349129669258448897", "focalTweetId": "1349129669258448897",
"referrer": "home", "referrer": "home",
@ -398,7 +400,6 @@
"communities_web_enable_tweet_community_results_fetch": true, "communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true, "c9s_tweet_anatomy_moderator_badge_enabled": true,
"articles_preview_enabled": true, "articles_preview_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true, "responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true, "view_counts_everywhere_api_enabled": true,
@ -409,7 +410,6 @@
"freedom_of_speech_not_reach_fetch_enabled": true, "freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true, "standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"tweet_with_visibility_results_prefer_gql_media_interstitial_enabled": true,
"rweb_video_timestamps_enabled": true, "rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true, "longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true, "longform_notetweets_inline_media_enabled": true,
@ -461,7 +461,7 @@
} }
}, },
"SearchTimeline": { "SearchTimeline": {
"queryId": "fZK7JipRHWtiZsTodhsTfQ", "queryId": "UN1i3zUiCWa-6r-Uaho4fw",
"variables": { "variables": {
"rawQuery": "elonmusk", "rawQuery": "elonmusk",
"count": 20, "count": 20,
@ -469,26 +469,28 @@
"product": "Top" "product": "Top"
}, },
"features": { "features": {
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true, "responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false, "verified_phone_label_enabled": false,
"creator_subscriptions_tweet_preview_api_enabled": true, "creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true, "responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true, "c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true, "articles_preview_enabled": true,
"responsive_web_edit_tweet_api_enabled": true, "responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true, "view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true, "longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": true, "responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false, "tweet_awards_web_tipping_enabled": false,
"creator_subscriptions_quote_tweet_preview_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true, "freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true, "standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true, "rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true, "longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true, "longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
"responsive_web_enhance_cards_enabled": false "responsive_web_enhance_cards_enabled": false
} }
}, },
@ -524,162 +526,172 @@
} }
}, },
"Retweeters": { "Retweeters": {
"queryId": "X-XEqG5qHQSAwmvy00xfyQ", "queryId": "8019obfgnveiPiJuS2Rtow",
"variables": { "variables": {
"tweetId": "1349129669258448897", "tweetId": "1349129669258448897",
"count": 20, "count": 20,
"includePromotedContent": true "includePromotedContent": true
}, },
"features": { "features": {
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true, "responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false, "verified_phone_label_enabled": false,
"creator_subscriptions_tweet_preview_api_enabled": true, "creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true, "responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true, "c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true, "articles_preview_enabled": true,
"responsive_web_edit_tweet_api_enabled": true, "responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true, "view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true, "longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": true, "responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false, "tweet_awards_web_tipping_enabled": false,
"creator_subscriptions_quote_tweet_preview_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true, "freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true, "standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true, "rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true, "longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true, "longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
"responsive_web_enhance_cards_enabled": false "responsive_web_enhance_cards_enabled": false
} }
}, },
"Followers": { "Followers": {
"queryId": "ZG1BQPaRSg04qo55kKaW2g", "queryId": "OSXFkKmGvfw_6pGgGtkWFg",
"variables": { "variables": {
"userId": "44196397", "userId": "44196397",
"count": 20, "count": 20,
"includePromotedContent": false "includePromotedContent": false
}, },
"features": { "features": {
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true, "responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false, "verified_phone_label_enabled": false,
"creator_subscriptions_tweet_preview_api_enabled": true, "creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true, "responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true, "c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true, "articles_preview_enabled": true,
"responsive_web_edit_tweet_api_enabled": true, "responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true, "view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true, "longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": true, "responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false, "tweet_awards_web_tipping_enabled": false,
"creator_subscriptions_quote_tweet_preview_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true, "freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true, "standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true, "rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true, "longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true, "longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
"responsive_web_enhance_cards_enabled": false "responsive_web_enhance_cards_enabled": false
} }
}, },
"Following": { "Following": {
"queryId": "PAnE9toEjRfE-4tozRcsfw", "queryId": "7oQrdmth4zE3EtD42ZxgOA",
"variables": { "variables": {
"userId": "44196397", "userId": "44196397",
"count": 20, "count": 20,
"includePromotedContent": false "includePromotedContent": false
}, },
"features": { "features": {
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true, "responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false, "verified_phone_label_enabled": false,
"creator_subscriptions_tweet_preview_api_enabled": true, "creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true, "responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true, "c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true, "articles_preview_enabled": true,
"responsive_web_edit_tweet_api_enabled": true, "responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true, "view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true, "longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": true, "responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false, "tweet_awards_web_tipping_enabled": false,
"creator_subscriptions_quote_tweet_preview_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true, "freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true, "standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true, "rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true, "longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true, "longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
"responsive_web_enhance_cards_enabled": false "responsive_web_enhance_cards_enabled": false
} }
}, },
"BlueVerifiedFollowers": { "BlueVerifiedFollowers": {
"queryId": "mg4dFO4kMIKt6tpqPMmFeg", "queryId": "cpPRJUmSz2Fiu1PpIYmEsw",
"variables": { "variables": {
"userId": "1347135745706708993", "userId": "1347135745706708993",
"count": 20, "count": 20,
"includePromotedContent": false "includePromotedContent": false
}, },
"features": { "features": {
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true, "responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false, "verified_phone_label_enabled": false,
"creator_subscriptions_tweet_preview_api_enabled": true, "creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true, "responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true, "c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true, "articles_preview_enabled": true,
"responsive_web_edit_tweet_api_enabled": true, "responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true, "view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true, "longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": true, "responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false, "tweet_awards_web_tipping_enabled": false,
"creator_subscriptions_quote_tweet_preview_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true, "freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true, "standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true, "rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true, "longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true, "longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
"responsive_web_enhance_cards_enabled": false "responsive_web_enhance_cards_enabled": false
} }
}, },
"FollowersYouKnow": { "FollowersYouKnow": {
"queryId": "citX7s5IAb1C6AVCqUO68g", "queryId": "52sUpz5G7XvESPWgKW9i9Q",
"variables": { "variables": {
"userId": "44196397", "userId": "44196397",
"count": 20, "count": 20,
"includePromotedContent": false "includePromotedContent": false
}, },
"features": { "features": {
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true, "responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false, "verified_phone_label_enabled": false,
"creator_subscriptions_tweet_preview_api_enabled": true, "creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true, "responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true, "c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true, "articles_preview_enabled": true,
"responsive_web_edit_tweet_api_enabled": true, "responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true, "view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true, "longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": true, "responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false, "tweet_awards_web_tipping_enabled": false,
"creator_subscriptions_quote_tweet_preview_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true, "freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true, "standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"rweb_video_timestamps_enabled": true, "rweb_video_timestamps_enabled": true,
"longform_notetweets_rich_text_read_enabled": true, "longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true, "longform_notetweets_inline_media_enabled": true,
"responsive_web_media_download_video_enabled": false,
"responsive_web_enhance_cards_enabled": false "responsive_web_enhance_cards_enabled": false
} }
}, },
"CreateTweet": { "CreateTweet": {
"queryId": "8ED1SMuUGkOZVBEjiYUTfw", "queryId": "xT36w0XM3A8jDynpkram2A",
"variables": { "variables": {
"tweet_text": "test", "tweet_text": "test",
"media": { "media": {
@ -696,26 +708,29 @@
"in_reply_to_tweet_id": "1111111111111111111", "in_reply_to_tweet_id": "1111111111111111111",
"exclude_reply_user_ids": [] "exclude_reply_user_ids": []
}, },
"dark_request": false "dark_request": false,
"disallowed_reply_options": false
}, },
"features": { "features": {
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true, "c9s_tweet_anatomy_moderator_badge_enabled": true,
"tweetypie_unmention_optimization_enabled": true,
"responsive_web_edit_tweet_api_enabled": true, "responsive_web_edit_tweet_api_enabled": true,
"graphql_is_translatable_rweb_tweet_is_translatable_enabled": true, "graphql_is_translatable_rweb_tweet_is_translatable_enabled": true,
"view_counts_everywhere_api_enabled": true, "view_counts_everywhere_api_enabled": true,
"longform_notetweets_consumption_enabled": true, "longform_notetweets_consumption_enabled": true,
"responsive_web_twitter_article_tweet_consumption_enabled": true, "responsive_web_twitter_article_tweet_consumption_enabled": true,
"tweet_awards_web_tipping_enabled": false, "tweet_awards_web_tipping_enabled": false,
"creator_subscriptions_quote_tweet_preview_enabled": false,
"longform_notetweets_rich_text_read_enabled": true, "longform_notetweets_rich_text_read_enabled": true,
"longform_notetweets_inline_media_enabled": true, "longform_notetweets_inline_media_enabled": true,
"articles_preview_enabled": true,
"rweb_video_timestamps_enabled": true, "rweb_video_timestamps_enabled": true,
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true, "responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false, "verified_phone_label_enabled": false,
"freedom_of_speech_not_reach_fetch_enabled": true, "freedom_of_speech_not_reach_fetch_enabled": true,
"standardized_nudges_misinfo": true, "standardized_nudges_misinfo": true,
"tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true, "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled": true,
"responsive_web_media_download_video_enabled": false,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false, "responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"responsive_web_graphql_timeline_navigation_enabled": true, "responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_enhance_cards_enabled": false "responsive_web_enhance_cards_enabled": false
@ -724,8 +739,7 @@
"FavoriteTweet": { "FavoriteTweet": {
"queryId": "lI07N6Otwv1PhnEgXILM7A", "queryId": "lI07N6Otwv1PhnEgXILM7A",
"variables": { "variables": {
"tweet_id": "1349129669258448897", "tweet_id": "1349129669258448897"
"dark_request": false
} }
}, },
"UnfavoriteTweet": { "UnfavoriteTweet": {
@ -769,7 +783,7 @@
} }
}, },
"#=====v1.1====": { "#=====v1.1====": {
"url": "https://twitter.com/i/api/1.1/" "url": "https://x.com/i/api/1.1/"
}, },
"friendships/create.json": { "friendships/create.json": {
"include_profile_interstitial_type": 1, "include_profile_interstitial_type": 1,
@ -831,7 +845,7 @@
"result_type": "events,users,topics" "result_type": "events,users,topics"
}, },
"#=====v2====": { "#=====v2====": {
"url": "https://twitter.com/i/api/2" "url": "https://x.com/i/api/2"
}, },
"search/adaptive.json": { "search/adaptive.json": {
"include_profile_interstitial_type": 1, "include_profile_interstitial_type": 1,
@ -871,5 +885,166 @@
"spelling_corrections": 1, "spelling_corrections": 1,
"include_ext_edit_control": true, "include_ext_edit_control": true,
"ext": "mediaStats,highlightedLabel,hasNftAvatar,voiceInfo,birdwatchPivot,enrichments,superFollowMetadata,unmentionInfo,editControl,vibe" "ext": "mediaStats,highlightedLabel,hasNftAvatar,voiceInfo,birdwatchPivot,enrichments,superFollowMetadata,unmentionInfo,editControl,vibe"
},
"#=====NotImplemented====": {},
"DataSaverMode": {
"queryId": "xF6sXnKJfS2AOylzxRjf6A"
},
"PinnedTimelines": {
"queryId": "xUjP0kS7EE05CLp3KUD-Eg",
"features": {
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"responsive_web_graphql_timeline_navigation_enabled": true
}
},
"getAltTextPromptPreference": {
"queryId": "PFIxTk8owMoZgiMccP0r4g"
},
"ExploreSidebar": {
"queryId": "rqiZoeu9EBUhOqZdKY139g",
"features": {
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false,
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"articles_preview_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": true,
"tweet_awards_web_tipping_enabled": false,
"creator_subscriptions_quote_tweet_preview_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_enhance_cards_enabled": false
}
},
"useFetchProfileBlocks_profileExistsQuery": {
"queryId": "Z2BA99jFw6TxaJM5v7Irmg"
},
"ExplorePage": {
"queryId": "IK_dxB178qS4T8cvA2G_UA",
"features": {
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"creator_subscriptions_tweet_preview_api_enabled": true,
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"articles_preview_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": true,
"tweet_awards_web_tipping_enabled": false,
"creator_subscriptions_quote_tweet_preview_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_enhance_cards_enabled": false
}
},
"CommunitiesCreateButtonQuery": {
"queryId": "ScODPHsG2d28Xr-rDSBThg"
},
"CarouselQuery": {
"queryId": "xfgycRkhqXy90CmTQZ7Kig"
},
"CommunitiesRankedTimeline": {
"queryId": "ruTkdk9a7c2U99VzD4MtMw",
"features": {
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false,
"creator_subscriptions_tweet_preview_api_enabled": true,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"articles_preview_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": true,
"tweet_awards_web_tipping_enabled": false,
"creator_subscriptions_quote_tweet_preview_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_enhance_cards_enabled": false
}
},
"BirdwatchFetchGlobalTimeline": {
"queryId": "Hu5em3YzOCFtiBOxT3qvEQ",
"features": {
"rweb_tipjar_consumption_enabled": true,
"responsive_web_graphql_exclude_directive_enabled": true,
"verified_phone_label_enabled": false,
"responsive_web_graphql_timeline_navigation_enabled": true,
"responsive_web_graphql_skip_user_profile_image_extensions_enabled": false,
"creator_subscriptions_tweet_preview_api_enabled": true,
"communities_web_enable_tweet_community_results_fetch": true,
"c9s_tweet_anatomy_moderator_badge_enabled": true,
"articles_preview_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": true,
"tweet_awards_web_tipping_enabled": false,
"creator_subscriptions_quote_tweet_preview_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_enhance_cards_enabled": false
}
},
"BirdwatchFetchAuthenticatedUserProfile": {
"queryId": "hkYn13HnxM_eVCEGGl-Fdw",
"features": {
"responsive_web_birdwatch_top_contributor_enabled": true,
"responsive_web_birdwatch_mobile_nav_setting_enabled": false,
"responsive_web_birdwatch_note_limit_enabled": true
}
},
"useRelayDelegateDataPendingQuery": {
"queryId": "0d3YLrCrAvgiPrMFGc33SA"
},
"DelegatedAccountListQuery": {
"queryId": "R0L__TguknNYVKUvNwmBpA",
"features": {
"responsive_web_graphql_timeline_navigation_enabled": true
}
},
"UsersVerifiedAvatars": {
"queryId": "aLfvAoX6xy2ojqzOnkbrIA",
"features": {
"responsive_web_graphql_timeline_navigation_enabled": true
}
} }
} }

View file

@ -14,8 +14,7 @@ paths:
content: content:
application/json: application/json:
schema: schema:
oneOf: $ref: "#/components/schemas/OtherResponse"
- $ref: "#/components/schemas/OtherResponse"
tags: tags:
- "other" - "other"

View file

@ -4,22 +4,26 @@ info:
version: 0.0.1 version: 0.0.1
paths: {} paths: {}
components: components:
schemas: schemas:
ErrorResponse: Errors:
type: object type: object
required: required:
- errors - errors
- data
properties: properties:
errors: errors:
$ref: "#/components/schemas/Errors" type: array
items:
$ref: "#/components/schemas/Error"
data:
$ref: "#/components/schemas/ErrorsData"
Errors: ErrorsData:
type: array type: object
items: properties:
$ref: "#/components/schemas/Error" user:
type: string # always null
pattern: "dummy"
Error: Error:
type: object type: object
@ -32,7 +36,6 @@ components:
- kind - kind
- name - name
- source - source
- retry_after
- tracing - tracing
properties: properties:
message: message:
@ -46,7 +49,7 @@ components:
items: items:
type: string type: string
extensions: extensions:
$ref: "#/components/schemas/Extensions" $ref: "#/components/schemas/ErrorExtensions"
code: code:
type: integer type: integer
kind: kind:
@ -71,7 +74,7 @@ components:
column: column:
type: integer type: integer
Extensions: ErrorExtensions:
type: object type: object
required: required:
- name - name
@ -84,6 +87,8 @@ components:
type: string type: string
source: source:
type: string type: string
retry_after:
type: integer
code: code:
type: integer type: integer
kind: kind:
@ -98,3 +103,4 @@ components:
properties: properties:
trace_id: trace_id:
type: string type: string
pattern: "^[0-9a-f]{16}$"

View file

@ -84,7 +84,6 @@ components:
- "__typename" - "__typename"
- "cursorType" - "cursorType"
- "value" - "value"
- "stopOnEmptyResponse"
properties: properties:
__typename: __typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # TimelineTimelineCursor $ref: "./typename.yaml#/components/schemas/TypeName" # TimelineTimelineCursor
@ -98,7 +97,6 @@ components:
type: string type: string
stopOnEmptyResponse: stopOnEmptyResponse:
type: boolean type: boolean
default: false
displayTreatment: displayTreatment:
$ref: "#/components/schemas/DisplayTreatment" $ref: "#/components/schemas/DisplayTreatment"
@ -230,7 +228,7 @@ components:
ItemResult: ItemResult:
properties: properties:
__typename: __typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # null | TimelineTweet $ref: "./typename.yaml#/components/schemas/TypeName" # null | TimelineTweet | TweetUnavailable
result: result:
$ref: "./tweet.yaml#/components/schemas/TweetUnion" $ref: "./tweet.yaml#/components/schemas/TweetUnion"

View file

@ -1,99 +0,0 @@
openapi: 3.0.3
info:
title: Twitter OpenAPI
version: 0.0.1
paths: {}
components:
schemas:
Errors:
type: object
required:
- errors
properties:
errors:
type: array
items:
$ref: "#/components/schemas/Error"
Error:
type: object
required:
- message
- locations
- path
- extensions
- code
- kind
- name
- source
- retry_after
- tracing
properties:
message:
type: string
locations:
type: array
items:
$ref: "#/components/schemas/Location"
path:
type: array
items:
type: string
extensions:
$ref: "#/components/schemas/ErrorExtensions"
code:
type: integer
kind:
type: string
name:
type: string
source:
type: string
retry_after:
type: integer
tracing:
$ref: "#/components/schemas/Tracing"
Location:
type: object
required:
- line
- column
properties:
line:
type: integer
column:
type: integer
ErrorExtensions:
type: object
required:
- name
- source
- retry_after
- code
- kind
- tracing
properties:
name:
type: string
source:
type: string
retry_after:
type: integer
code:
type: integer
kind:
type: string
tracing:
$ref: "#/components/schemas/Tracing"
Tracing:
type: object
required:
- trace_id
properties:
trace_id:
type: string
pattern: "^[0-9a-f]{16}$"

View file

@ -277,7 +277,21 @@ components:
properties: properties:
type: type:
type: string type: string
enum: [TimelineCoverBehaviorDismiss] enum: [TimelineCoverBehaviorDismiss, TimelineCoverBehaviorNavigate]
url:
type: TimelineCoverBehaviorUrl
TimelineCoverBehaviorUrl:
required:
- "url"
- "url_type"
properties:
url:
type: string
format: uri
url_type:
type: string
enum: ["ExternalUrl"]
Callback: Callback:
required: required:

View file

@ -7,8 +7,6 @@ paths: {}
components: components:
schemas: schemas:
TimelineV2: TimelineV2:
required:
- "timeline"
properties: properties:
timeline: timeline:
$ref: "#/components/schemas/Timeline" $ref: "#/components/schemas/Timeline"

View file

@ -12,12 +12,14 @@ components:
- $ref: "#/components/schemas/Tweet" - $ref: "#/components/schemas/Tweet"
- $ref: "#/components/schemas/TweetWithVisibilityResults" - $ref: "#/components/schemas/TweetWithVisibilityResults"
- $ref: "#/components/schemas/TweetTombstone" - $ref: "#/components/schemas/TweetTombstone"
- $ref: "#/components/schemas/TweetUnavailable"
discriminator: discriminator:
propertyName: __typename propertyName: __typename
mapping": # deprecated mapping": # deprecated
Tweet: "#/components/schemas/Tweet" Tweet: "#/components/schemas/Tweet"
TweetWithVisibilityResults: "#/components/schemas/TweetWithVisibilityResults" TweetWithVisibilityResults: "#/components/schemas/TweetWithVisibilityResults"
TweetTombstone: "#/components/schemas/TweetTombstone" TweetTombstone: "#/components/schemas/TweetTombstone"
TweetUnavailable: "#/components/schemas/TweetUnavailable"
TweetWithVisibilityResults: TweetWithVisibilityResults:
required: required:
@ -138,6 +140,13 @@ components:
$ref: "./typename.yaml#/components/schemas/TypeName" # TweetWithVisibilityResults $ref: "./typename.yaml#/components/schemas/TypeName" # TweetWithVisibilityResults
additionalProperties: true # todo additionalProperties: true # todo
TweetUnavailable: # nsfw tweet
properties:
__typename:
$ref: "./typename.yaml#/components/schemas/TypeName" # TweetUnavailable
reason:
type: string
Tweet: Tweet:
required: required:
- "rest_id" - "rest_id"
@ -162,7 +171,6 @@ components:
$ref: "#/components/schemas/TweetEditPrespective" $ref: "#/components/schemas/TweetEditPrespective"
is_translatable: is_translatable:
type: boolean type: boolean
default: false
source: source:
type: string # html (<a href="http://twitter.com/download/android" rel="nofollow">Twitter for Android</a>) type: string # html (<a href="http://twitter.com/download/android" rel="nofollow">Twitter for Android</a>)
legacy: legacy:
@ -189,6 +197,8 @@ components:
$ref: "#/components/schemas/AuthorCommunityRelationship" $ref: "#/components/schemas/AuthorCommunityRelationship"
article: article:
$ref: "#/components/schemas/Article" $ref: "#/components/schemas/Article"
community_results:
$ref: "#/components/schemas/Community"
TweetEditControl: TweetEditControl:
properties: properties:
@ -884,10 +894,8 @@ components:
type: string # enum type: string # enum
possibly_sensitive: possibly_sensitive:
type: boolean type: boolean
default: false
possibly_sensitive_editable: possibly_sensitive_editable:
type: boolean type: boolean
default: false
quote_count: quote_count:
type: integer type: integer
reply_count: reply_count:
@ -1289,13 +1297,10 @@ components:
properties: properties:
adult_content: adult_content:
type: boolean type: boolean
default: false
graphic_violence: graphic_violence:
type: boolean type: boolean
default: false
other: other:
type: boolean type: boolean
default: false
MediaSizes: MediaSizes:
required: required:
@ -1464,8 +1469,6 @@ components:
type: integer type: integer
AllowDownloadStatus: AllowDownloadStatus:
required:
- "allow_download"
properties: properties:
allow_download: allow_download:
type: boolean type: boolean

View file

@ -35,9 +35,6 @@ components:
- "is_blue_verified" - "is_blue_verified"
- "legacy" - "legacy"
- "rest_id" - "rest_id"
- "super_follow_eligible"
- "super_followed_by"
- "super_following"
- "profile_image_shape" - "profile_image_shape"
properties: properties:
@ -50,13 +47,11 @@ components:
type: boolean type: boolean
has_nft_avatar: has_nft_avatar:
type: boolean type: boolean
default: false
id: id:
type: string type: string
pattern: "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$" # base64 pattern: "^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$" # base64
is_blue_verified: is_blue_verified:
type: boolean type: boolean
default: false
legacy: legacy:
$ref: "#/components/schemas/UserLegacy" $ref: "#/components/schemas/UserLegacy"
rest_id: rest_id:
@ -67,13 +62,10 @@ components:
additionalProperties: true # todo additionalProperties: true # todo
super_follow_eligible: super_follow_eligible:
type: boolean type: boolean
default: false
super_followed_by: super_followed_by:
type: boolean type: boolean
default: false
super_following: super_following:
type: boolean type: boolean
default: false
profile_image_shape: profile_image_shape:
type: string type: string
enum: enum:
@ -96,6 +88,10 @@ components:
$ref: "#/components/schemas/UserTipJarSettings" $ref: "#/components/schemas/UserTipJarSettings"
legacy_extended_profile: legacy_extended_profile:
$ref: "#/components/schemas/UserLegacyExtendedProfile" $ref: "#/components/schemas/UserLegacyExtendedProfile"
has_hidden_likes_on_profile:
type: boolean
premium_gifting_eligible:
type: boolean
UserProfessional: UserProfessional:
required: required:
@ -143,7 +139,6 @@ components:
properties: properties:
is_identity_verified: is_identity_verified:
type: boolean type: boolean
default: false
reason: reason:
$ref: "#/components/schemas/UserVerificationInfoReason" $ref: "#/components/schemas/UserVerificationInfoReason"
@ -214,6 +209,8 @@ components:
type: string type: string
gofundme_handle: gofundme_handle:
type: string # uri type: string # uri
bandcamp_handle:
type: string # uri
UserLegacyExtendedProfile: UserLegacyExtendedProfile:
properties: properties:
@ -243,10 +240,6 @@ components:
UserLegacy: UserLegacy:
required: required:
- "blocked_by"
- "blocking"
- "can_dm"
- "can_media_tag"
- "created_at" - "created_at"
- "default_profile" - "default_profile"
- "default_profile_image" - "default_profile_image"
@ -254,52 +247,39 @@ components:
- "entities" - "entities"
- "fast_followers_count" - "fast_followers_count"
- "favourites_count" - "favourites_count"
# 31 # - "follow_request_sent"
# 31 # - "followed_by"
- "followers_count" - "followers_count"
# 31 # - "following"
- "friends_count" - "friends_count"
- "has_custom_timelines" - "has_custom_timelines"
- "is_translator" - "is_translator"
- "listed_count" - "listed_count"
- "location" - "location"
- "media_count" - "media_count"
- "muting"
- "name" - "name"
- "normal_followers_count" - "normal_followers_count"
# 31 # - "notifications"
- "pinned_tweet_ids_str" - "pinned_tweet_ids_str"
- "possibly_sensitive" - "possibly_sensitive"
- "profile_image_url_https" - "profile_image_url_https"
- "profile_interstitial_type" - "profile_interstitial_type"
# 31 # - "protected"
- "screen_name" - "screen_name"
- "status" - "status"
- "statuses_count" - "statuses_count"
- "translator_type" - "translator_type"
- "verified" - "verified"
- "want_retweets"
properties: properties:
blocked_by: blocked_by:
type: boolean type: boolean
default: false
blocking: blocking:
type: boolean type: boolean
default: false
can_dm: can_dm:
type: boolean type: boolean
default: false
can_media_tag: can_media_tag:
type: boolean type: boolean
default: false
created_at: created_at:
$ref: "./general.yaml#/components/schemas/TwitterTimeFormat" $ref: "./general.yaml#/components/schemas/TwitterTimeFormat"
default_profile: default_profile:
type: boolean type: boolean
default: false
default_profile_image: default_profile_image:
type: boolean type: boolean
default: false
description: description:
type: string type: string
entities: entities:
@ -309,54 +289,40 @@ components:
type: integer type: integer
favourites_count: favourites_count:
type: integer type: integer
default: 0
follow_request_sent: follow_request_sent:
type: boolean type: boolean
default: false
followed_by: followed_by:
type: boolean type: boolean
default: false
followers_count: followers_count:
type: integer type: integer
default: 0
following: following:
type: boolean type: boolean
default: false
friends_count: friends_count:
type: integer type: integer
default: 0
has_custom_timelines: has_custom_timelines:
type: boolean type: boolean
default: false
is_translator: is_translator:
type: boolean type: boolean
default: false
listed_count: listed_count:
type: integer type: integer
default: 0
location: location:
type: string type: string
media_count: media_count:
type: integer type: integer
default: 0
muting: muting:
type: boolean type: boolean
default: false
name: name:
type: string type: string
normal_followers_count: normal_followers_count:
type: integer type: integer
default: 0
notifications: notifications:
type: boolean type: boolean
default: false
pinned_tweet_ids_str: pinned_tweet_ids_str:
type: array type: array
items: items:
type: string type: string
possibly_sensitive: possibly_sensitive:
type: boolean type: boolean
default: false
profile_banner_extensions: profile_banner_extensions:
type: object type: object
profile_banner_url: profile_banner_url:
@ -371,12 +337,10 @@ components:
type: string type: string
protected: protected:
type: boolean type: boolean
default: false
screen_name: screen_name:
type: string type: string
statuses_count: statuses_count:
type: integer type: integer
default: 0
translator_type: translator_type:
type: string type: string
url: url:
@ -385,7 +349,6 @@ components:
type: boolean type: boolean
want_retweets: want_retweets:
type: boolean type: boolean
default: false
verified_type: verified_type:
type: string type: string
enum: ["Business", "Government"] enum: ["Business", "Government"]

View file

@ -1,6 +1,7 @@
import base64 import base64
import concurrent.futures import concurrent.futures
import glob import glob
import inspect
import json import json
import logging import logging
import os import os
@ -180,6 +181,8 @@ if __name__ == "__main__":
f'cookie.json not found. Please run `{"; ".join(commands)}` first.' f'cookie.json not found. Please run `{"; ".join(commands)}` first.'
) )
if isinstance(cookies, list):
cookies = {k["name"]: k["value"] for k in cookies}
cookies_str = "; ".join([f"{k}={v}" for k, v in cookies.items()]) cookies_str = "; ".join([f"{k}={v}" for k, v in cookies.items()])
with open("src/config/placeholder.json", "r") as f: with open("src/config/placeholder.json", "r") as f:
@ -208,6 +211,15 @@ if __name__ == "__main__":
task_callback(file, thread=False) task_callback(file, thread=False)
logger.info(f"Match rate: {rate}") logger.info(f"Match rate: {rate}")
for file in glob.glob("other/**/*.json", recursive=True):
with open(file, "r") as f:
data = json.load(f)
try:
_ = pt.Errors.from_dict(data)
except Exception as e:
error_dump(e)
api_conf = pt.Configuration( api_conf = pt.Configuration(
api_key={ api_key={
"ClientLanguage": "en", "ClientLanguage": "en",
@ -231,7 +243,7 @@ if __name__ == "__main__":
error_count = 0 error_count = 0
for x in [pt.DefaultApi, pt.TweetApi, pt.UserApi, pt.UsersApi, pt.UserListApi]: for x in [pt.DefaultApi, pt.TweetApi, pt.UserApi, pt.UsersApi, pt.UserListApi]:
for props, fn in x.__dict__.items(): for props, fn in inspect.getmembers(x):
if not callable(fn): if not callable(fn):
continue continue
if props.startswith("__") or not props.endswith("_with_http_info"): if props.startswith("__") or not props.endswith("_with_http_info"):
@ -284,7 +296,7 @@ if __name__ == "__main__":
try: try:
logger.info("Try: Self UserByScreenName Test") logger.info("Try: Self UserByScreenName Test")
kwargs = get_kwargs("UserByScreenName", {"screen_name": "NxWDOyLMd483329"}) kwargs = get_kwargs("UserByScreenName", {"screen_name": "ptcpz3"})
res = pt.UserApi(api_client).get_user_by_screen_name_with_http_info(**kwargs) res = pt.UserApi(api_client).get_user_by_screen_name_with_http_info(**kwargs)
data = res.data.to_dict() data = res.data.to_dict()
@ -295,7 +307,7 @@ if __name__ == "__main__":
) )
logger.info(f"Match rate: {rate}") logger.info(f"Match rate: {rate}")
screen_name = data["data"]["user"]["result"]["legacy"]["screen_name"] screen_name = data["data"]["user"]["result"]["legacy"]["screen_name"]
if not screen_name == "NxWDOyLMd483329": if not screen_name == "ptcpz3":
raise Exception("UserByScreenName failed") raise Exception("UserByScreenName failed")
except Exception as e: except Exception as e:
error_dump(e) error_dump(e)
@ -330,10 +342,12 @@ if __name__ == "__main__":
"1720975693524377759", "1720975693524377759",
"1721006592303251551", "1721006592303251551",
"1739194269477331076", "1739194269477331076",
"1697450269259522256", # "1697450269259522256",
"1697450278742884799", # "1697450278742884799",
"1749500209061663043", "1749500209061663043",
"1759056048764469303", "1759056048764469303",
"1349129669258448897",
"1810188416812019999",
] ]
for id in ids: for id in ids:
try: try:
@ -342,6 +356,13 @@ if __name__ == "__main__":
res = pt.TweetApi(api_client).get_tweet_detail_with_http_info(**kwargs) res = pt.TweetApi(api_client).get_tweet_detail_with_http_info(**kwargs)
data = res.data.to_dict() data = res.data.to_dict()
save_cache(
{
"raw": res.raw_data.decode("utf-8"),
"type": res.data.__class__.__name__,
}
)
rate = match_rate( rate = match_rate(
data, data,
json.loads(res.raw_data), json.loads(res.raw_data),

View file

@ -2,6 +2,7 @@ import json
from pathlib import Path from pathlib import Path
import openapi_client as pt import openapi_client as pt
import urllib3
def get_kwargs(key, additional): def get_kwargs(key, additional):
@ -19,6 +20,8 @@ if __name__ == "__main__":
if Path("cookie.json").exists(): if Path("cookie.json").exists():
with open("cookie.json", "r") as f: with open("cookie.json", "r") as f:
cookies = json.load(f) cookies = json.load(f)
if isinstance(cookies, list):
cookies = {k["name"]: k["value"] for k in cookies}
cookies_str = "; ".join([f"{k}={v}" for k, v in cookies.items()]) cookies_str = "; ".join([f"{k}={v}" for k, v in cookies.items()])
with open("src/config/placeholder.json", "r") as f: with open("src/config/placeholder.json", "r") as f:
@ -31,9 +34,17 @@ if __name__ == "__main__":
"GuestToken": cookies["gt"], "GuestToken": cookies["gt"],
}, },
) )
latest_user_agent_res = urllib3.PoolManager().request(
"GET",
"https://raw.githubusercontent.com/fa0311/latest-user-agent/main/output.json",
)
latest_user_agent = json.loads(latest_user_agent_res.data.decode("utf-8"))
api_conf.access_token = "AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA" api_conf.access_token = "AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA"
api_client = pt.ApiClient(configuration=api_conf, cookie=cookies_str) api_client = pt.ApiClient(configuration=api_conf, cookie=cookies_str)
api_client.user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36" api_client.user_agent = latest_user_agent["chrome-fetch"]
pt.TweetApi(api_client).get_user_tweets_with_http_info( pt.TweetApi(api_client).get_user_tweets_with_http_info(
**get_kwargs("UserTweets", {}), **get_kwargs("UserTweets", {}),

View file

@ -6,6 +6,7 @@ from hooks import (
AddSecuritySchemesOnSecuritySchemes, AddSecuritySchemesOnSecuritySchemes,
RemoveErrorHandle, RemoveErrorHandle,
SetResponsesHeader, SetResponsesHeader,
SetUserAgentOnSecuritySchemes,
) )
@ -40,7 +41,10 @@ class Config:
additionalHooks.append(RemoveErrorHandle()) additionalHooks.append(RemoveErrorHandle())
return { return {
"openapi": [AddSecuritySchemesOnSecuritySchemes()], "openapi": [
AddSecuritySchemesOnSecuritySchemes(),
SetUserAgentOnSecuritySchemes(),
],
"schemas": [], "schemas": [],
"other": [], "other": [],
"request": { "request": {

130
tools/generater.py Normal file
View file

@ -0,0 +1,130 @@
# https://github.com/tsukumijima/KonomiTV/blob/master/server/misc/TwitterAPIQueryGenerator.py
# https://github.com/tsukumijima/KonomiTV/blob/master/License.txt
#!/usr/bin/env python3
# Usage: poetry run python -m misc.TwitterAPIQueryGenerator
import json
import re
import urllib.parse
from rich import print
from rich.rule import Rule
def main():
print(Rule(characters="="))
print(
"Chrome DevTools の Network タブで「表示されているものをすべてfetch としてコピー」したコードを`input.js`に貼り付けてください。"
)
print("Enter を押すと続行します。")
print(Rule(characters="="))
input()
with open("./tools/input.js", "r") as f:
fetch_code_raw = f.read()
print(Rule(characters="="))
splited = fetch_code_raw.split("\n")
fetch_code_list = []
code = ""
for line in splited:
if line.startswith("fetch("):
if code:
fetch_code_list.append(code)
code = line
else:
code += line + "\n"
fetch_code_list.append(code)
for fetch_code in fetch_code_list:
# query_idとendpointを抽出
query_id_match = re.search(r'/i/api/graphql/([^/]+)/([^"?]+)', fetch_code)
if not query_id_match:
print("query_id と endpoint の抽出に失敗しました。")
print(Rule(characters="="))
return
query_id = query_id_match.group(1)
endpoint = query_id_match.group(2)
# リクエストメソッドを判定
method_match = re.search(r'"method"\s*:\s*"(GET|POST)"', fetch_code)
if not method_match:
print("リクエストメソッドの判定に失敗しました。")
print(Rule(characters="="))
return
method = method_match.group(1)
if method == "POST":
# POST リクエストの場合、fetch() コードの第二引数にある {} で囲まれたオブジェクトを正規表現で抽出したものを JSON としてパース
body_match = re.search(r'"body"\s*:\s*"({.*})"', fetch_code, re.DOTALL)
if not body_match:
print("body の抽出に失敗しました。")
print(Rule(characters="="))
return
body_json_str = body_match.group(1).replace("\\", "")
body_json = json.loads(body_json_str)
features = body_json.get("features", None)
variables = body_json.get("variables", None)
else:
# GET リクエストの場合、まず URL を抽出
url_match = re.search(r'"(https?://[^"]+)"', fetch_code)
if not url_match:
print("URL の抽出に失敗しました。")
print(Rule(characters="="))
return
url = url_match.group(1)
# URL をパースして query string を取得
parsed_url = urllib.parse.urlparse(url)
query_string = parsed_url.query
# query string を dict 形式にパース
query_dict = urllib.parse.parse_qs(query_string)
# features を取得
features_json_str = query_dict.get("features", [None])[0]
if features_json_str is None:
features = None
variables = None
else:
try:
features = json.loads(features_json_str)
except json.JSONDecodeError:
print(
"features の JSON パースに失敗しました。features は None として続行します。"
)
features = None
variables = None
with open("./src/config/placeholder.json", "r") as f:
placeholder = json.load(f)
def check(a, b, msg):
if isinstance(a, dict) and isinstance(b, dict):
for k in {*a.keys(), *b.keys()}:
if k not in b:
print(f"{msg} key: {k} が存在しません。")
elif k not in a:
print(f"{msg} key: {k} が存在しません。")
else:
check(a[k], b[k], msg)
check(
variables,
placeholder.get(endpoint, {}).get("variables", {}),
f"{endpoint} の variables が不一致です。",
)
with open("./src/config/placeholder.json", "w") as f:
placeholder[endpoint] = placeholder.get(endpoint, {})
placeholder[endpoint]["queryId"] = query_id
if features:
placeholder[endpoint]["features"] = features
json.dump(placeholder, f, indent=4)
if __name__ == "__main__":
main()

View file

@ -1,5 +1,6 @@
import json import json
import urllib3
import yaml import yaml
@ -60,6 +61,13 @@ class HookBase:
with open("src/config/placeholder.json", mode="r", encoding="utf-8") as f: with open("src/config/placeholder.json", mode="r", encoding="utf-8") as f:
return yaml.safe_load(f) return yaml.safe_load(f)
def load_user_agent(self) -> str:
user_agent = urllib3.PoolManager().request(
"GET",
"https://raw.githubusercontent.com/fa0311/latest-user-agent/main/output.json",
)
return json.loads(user_agent.data)["chrome-fetch"]
# HookBase extends # HookBase extends
@ -106,6 +114,14 @@ class AddSecuritySchemesOnSecuritySchemes(OpenapiHookBase):
return value return value
class SetUserAgentOnSecuritySchemes(OpenapiHookBase):
def hook(self, value: dict):
value = super().hook(value)
param = value["components"]["securitySchemes"]
param["UserAgent"]["description"] = self.load_user_agent()
return value
# SchemasHookBase extends # SchemasHookBase extends
@ -151,6 +167,15 @@ class AddSecuritySchemesOnHeader(RequestHookBase):
return path, value return path, value
class SetUserAgentOnHeader(RequestHookBase):
def hook(self, path: str, value: dict):
path, value = super().hook(path, value)
component = self.load_component("security_schemes")
param = component["paths"]["/parameters"]["get"]["parameters"]
value["parameters"].extend(param)
return path, value
class ReplaceQueryIdPlaceholder(RequestHookBase): class ReplaceQueryIdPlaceholder(RequestHookBase):
def hook(self, path: str, value: dict): def hook(self, path: str, value: dict):
path, value = super().hook(path, value) path, value = super().hook(path, value)