diff --git a/twikit/client/client.py b/twikit/client/client.py index d2a764b2..2c1713dd 100644 --- a/twikit/client/client.py +++ b/twikit/client/client.py @@ -15,6 +15,7 @@ from .._captcha import Capsolver from ..bookmark import BookmarkFolder from ..community import Community, CommunityMember +from ..constants import TOKEN from ..errors import ( AccountLocked, AccountSuspended, @@ -42,7 +43,7 @@ from ..trend import Location, PlaceTrend, PlaceTrends, Trend from ..tweet import CommunityNote, Poll, ScheduledTweet, Tweet, tweet_from_data from ..user import User -from ..utils import TOKEN, Flow, Result, build_tweet_data, build_user_data, find_dict, httpx_transport_to_url +from ..utils import Flow, Result, build_tweet_data, build_user_data, find_dict, httpx_transport_to_url from .gql import GQLClient from .v11 import V11Client diff --git a/twikit/client/gql.py b/twikit/client/gql.py index 4038e215..e806fe2e 100644 --- a/twikit/client/gql.py +++ b/twikit/client/gql.py @@ -2,7 +2,7 @@ from typing import TYPE_CHECKING -from ..utils import ( +from ..constants import ( BOOKMARK_FOLDER_TIMELINE_FEATURES, COMMUNITY_NOTE_FEATURES, COMMUNITY_TWEETS_FEATURES, @@ -11,10 +11,9 @@ LIST_FEATURES, NOTE_TWEET_FEATURES, SIMILAR_POSTS_FEATURES, - USER_FEATURES, - flatten_params, - get_query_id + USER_FEATURES ) +from ..utils import flatten_params, get_query_id if TYPE_CHECKING: from .client import Client @@ -112,7 +111,6 @@ async def gql_get( params |= extra_params if headers is None: headers = self.base._base_headers - return await self.base.get(url, params=flatten_params(params), headers=headers, **kwargs) async def gql_post( @@ -131,7 +129,6 @@ async def gql_post( data |= extra_data if headers is None: headers = self.base._base_headers - return await self.base.post(url, json=data, headers=headers, **kwargs) async def search_timeline( diff --git a/twikit/constants.py b/twikit/constants.py new file mode 100644 index 00000000..172c7cb4 --- /dev/null +++ b/twikit/constants.py @@ -0,0 +1,173 @@ +# This token is common to all accounts and does not need to be changed. +TOKEN = 'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA' + +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': 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, + 'standardized_nudges_misinfo': 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_timeline_navigation_enabled': True, + 'responsive_web_enhance_cards_enabled': False +} + +USER_FEATURES = { + 'hidden_profile_likes_enabled': True, + 'hidden_profile_subscriptions_enabled': True, + 'responsive_web_graphql_exclude_directive_enabled': True, + 'verified_phone_label_enabled': False, + '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': False, + 'creator_subscriptions_tweet_preview_api_enabled': True, + 'responsive_web_graphql_skip_user_profile_image_extensions_enabled': False, + 'responsive_web_graphql_timeline_navigation_enabled': True +} + +LIST_FEATURES = { + '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 +} + +COMMUNITY_NOTE_FEATURES = { + 'responsive_web_birdwatch_media_notes_enabled': True, + 'responsive_web_graphql_timeline_navigation_enabled': True, + 'rweb_tipjar_consumption_enabled': False, + 'responsive_web_graphql_exclude_directive_enabled': True, + 'verified_phone_label_enabled': False, + 'responsive_web_graphql_skip_user_profile_image_extensions_enabled': False +} + +COMMUNITY_TWEETS_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, + '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': 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 +} + +JOIN_COMMUNITY_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 +} + +NOTE_TWEET_FEATURES = { + 'communities_web_enable_tweet_community_results_fetch': 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': True, + 'tweet_awards_web_tipping_enabled': False, + 'creator_subscriptions_quote_tweet_preview_enabled': False, + 'longform_notetweets_rich_text_read_enabled': True, + 'longform_notetweets_inline_media_enabled': True, + 'articles_preview_enabled': False, + 'rweb_video_timestamps_enabled': True, + 'rweb_tipjar_consumption_enabled': True, + 'responsive_web_graphql_exclude_directive_enabled': True, + 'verified_phone_label_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, + 'tweet_with_visibility_results_prefer_gql_media_interstitial_enabled': True, + 'responsive_web_graphql_skip_user_profile_image_extensions_enabled': False, + 'responsive_web_graphql_timeline_navigation_enabled': True, + 'responsive_web_enhance_cards_enabled': False +} + +SIMILAR_POSTS_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': False, + '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': 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, + 'tweet_with_visibility_results_prefer_gql_media_interstitial_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 +} + +BOOKMARK_FOLDER_TIMELINE_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': False, + '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': 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, + 'tweet_with_visibility_results_prefer_gql_media_interstitial_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 +} diff --git a/twikit/utils.py b/twikit/utils.py index de8af5a4..896c5280 100644 --- a/twikit/utils.py +++ b/twikit/utils.py @@ -10,180 +10,6 @@ if TYPE_CHECKING: from .client.client import Client -# This token is common to all accounts and does not need to be changed. -TOKEN = 'AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA' - -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': 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, - 'standardized_nudges_misinfo': 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_timeline_navigation_enabled': True, - 'responsive_web_enhance_cards_enabled': False -} - -USER_FEATURES = { - 'hidden_profile_likes_enabled': True, - 'hidden_profile_subscriptions_enabled': True, - 'responsive_web_graphql_exclude_directive_enabled': True, - 'verified_phone_label_enabled': False, - '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': False, - 'creator_subscriptions_tweet_preview_api_enabled': True, - 'responsive_web_graphql_skip_user_profile_image_extensions_enabled': False, - 'responsive_web_graphql_timeline_navigation_enabled': True -} - -LIST_FEATURES = { - '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 -} - -COMMUNITY_NOTE_FEATURES = { - 'responsive_web_birdwatch_media_notes_enabled': True, - 'responsive_web_graphql_timeline_navigation_enabled': True, - 'rweb_tipjar_consumption_enabled': False, - 'responsive_web_graphql_exclude_directive_enabled': True, - 'verified_phone_label_enabled': False, - 'responsive_web_graphql_skip_user_profile_image_extensions_enabled': False -} - -COMMUNITY_TWEETS_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, - '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': 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 -} - -JOIN_COMMUNITY_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 -} - -NOTE_TWEET_FEATURES = { - 'communities_web_enable_tweet_community_results_fetch': 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': True, - 'tweet_awards_web_tipping_enabled': False, - 'creator_subscriptions_quote_tweet_preview_enabled': False, - 'longform_notetweets_rich_text_read_enabled': True, - 'longform_notetweets_inline_media_enabled': True, - 'articles_preview_enabled': False, - 'rweb_video_timestamps_enabled': True, - 'rweb_tipjar_consumption_enabled': True, - 'responsive_web_graphql_exclude_directive_enabled': True, - 'verified_phone_label_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, - 'tweet_with_visibility_results_prefer_gql_media_interstitial_enabled': True, - 'responsive_web_graphql_skip_user_profile_image_extensions_enabled': False, - 'responsive_web_graphql_timeline_navigation_enabled': True, - 'responsive_web_enhance_cards_enabled': False -} - -SIMILAR_POSTS_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': False, - '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': 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, - 'tweet_with_visibility_results_prefer_gql_media_interstitial_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 -} - -BOOKMARK_FOLDER_TIMELINE_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': False, - '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': 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, - 'tweet_with_visibility_results_prefer_gql_media_interstitial_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 -} - T = TypeVar('T')