@@ -144,6 +144,74 @@ impl TwitterRequester {
144144 . map_err ( |err| anyhow ! ( "failed to fetch user tweets: {err}" ) )
145145 }
146146
147+ pub async fn tweet_result_by_rest_id (
148+ & self ,
149+ tweet_id : impl AsRef < str > ,
150+ ) -> anyhow:: Result < reqwest:: Response > {
151+ let tweet_id = tweet_id. as_ref ( ) ;
152+
153+ let variables = json ! ( {
154+ "tweetId" : tweet_id,
155+ "includePromotedContent" : true ,
156+ "withBirdwatchNotes" : true ,
157+ "withVoice" : true ,
158+ "withCommunity" : true
159+ } ) ;
160+ let features = json ! ( {
161+ "creator_subscriptions_tweet_preview_api_enabled" : true ,
162+ "premium_content_api_read_enabled" : false ,
163+ "communities_web_enable_tweet_community_results_fetch" : true ,
164+ "c9s_tweet_anatomy_moderator_badge_enabled" : true ,
165+ "responsive_web_grok_analyze_button_fetch_trends_enabled" : false ,
166+ "responsive_web_grok_analyze_post_followups_enabled" : true ,
167+ "responsive_web_jetfuel_frame" : true ,
168+ "responsive_web_grok_share_attachment_enabled" : true ,
169+ "articles_preview_enabled" : true ,
170+ "responsive_web_edit_tweet_api_enabled" : true ,
171+ "graphql_is_translatable_rweb_tweet_is_translatable_enabled" : true ,
172+ "view_counts_everywhere_api_enabled" : true ,
173+ "longform_notetweets_consumption_enabled" : true ,
174+ "responsive_web_twitter_article_tweet_consumption_enabled" : true ,
175+ "tweet_awards_web_tipping_enabled" : false ,
176+ "responsive_web_grok_show_grok_translated_post" : true ,
177+ "responsive_web_grok_analysis_button_from_backend" : true ,
178+ "creator_subscriptions_quote_tweet_preview_enabled" : false ,
179+ "freedom_of_speech_not_reach_fetch_enabled" : true ,
180+ "standardized_nudges_misinfo" : true ,
181+ "tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled" : true ,
182+ "longform_notetweets_rich_text_read_enabled" : true ,
183+ "longform_notetweets_inline_media_enabled" : true ,
184+ "payments_enabled" : false ,
185+ "profile_label_improvements_pcf_label_in_post_enabled" : true ,
186+ "responsive_web_profile_redirect_enabled" : false ,
187+ "rweb_tipjar_consumption_enabled" : true ,
188+ "verified_phone_label_enabled" : false ,
189+ "responsive_web_grok_image_annotation_enabled" : true ,
190+ "responsive_web_grok_imagine_annotation_enabled" : true ,
191+ "responsive_web_grok_community_note_auto_translation_is_enabled" : false ,
192+ "responsive_web_graphql_skip_user_profile_image_extensions_enabled" : false ,
193+ "responsive_web_graphql_timeline_navigation_enabled" : true ,
194+ "responsive_web_enhance_cards_enabled" : false
195+ } ) ;
196+ let field_toggles = json ! ( {
197+ "withArticleRichContentState" : true ,
198+ "withArticlePlainText" : false
199+ } ) ;
200+ let mut url = Url :: from_str (
201+ "https://x.com/i/api/graphql/WvlrBJ2bz8AuwoszWyie8A/TweetResultByRestId" ,
202+ ) ?;
203+ {
204+ let mut query = url. query_pairs_mut ( ) ;
205+ query. append_pair ( "variables" , & json:: to_string ( & variables) ?) ;
206+ query. append_pair ( "features" , & json:: to_string ( & features) ?) ;
207+ query. append_pair ( "fieldToggles" , & json:: to_string ( & field_toggles) ?) ;
208+ }
209+
210+ self . request ( url)
211+ . await
212+ . map_err ( |err| anyhow ! ( "failed to fetch tweet result by rest id: {err}" ) )
213+ }
214+
147215 async fn request ( & self , url : impl AsRef < str > ) -> anyhow:: Result < reqwest:: Response > {
148216 let resp = helper:: reqwest_client ( ) ?
149217 . get ( url. as_ref ( ) )
0 commit comments