Created
February 25, 2024 05:36
-
-
Save OldPanda/8b45eff99c56ed71cc089bfbfb30f0f9 to your computer and use it in GitHub Desktop.
A Python script to fetch Twitter user's profile via their API. Sometimes it works, sometimes it doesn't
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
certifi==2024.2.2 | |
charset-normalizer==3.3.2 | |
idna==3.6 | |
requests==2.31.0 | |
urllib3==2.2.1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
import requests | |
session = requests.session() | |
user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" | |
def get_bearer_token(): | |
headers = {"User-Agent": user_agent} | |
resp = session.get( | |
"https://abs.twimg.com/responsive-web/client-web/main.a2166cda.js", | |
headers=headers, | |
) | |
pos = resp.text.index("Bearer ") | |
i = pos | |
while i < len(resp.text): | |
if resp.text[i] == '"': | |
break | |
i += 1 | |
return resp.text[pos + 7 : i] | |
def get_guest_token(bearer_token): | |
headers = {"User-Agent": user_agent, "Authorization": f"Bearer {bearer_token}"} | |
resp = session.post( | |
"https://api.twitter.com/1.1/guest/activate.json", | |
headers=headers, | |
) | |
data = resp.json() | |
return data.get("guest_token") | |
def get_x_user_profile(bearer_token, guest_token, user_id): | |
headers = { | |
"User-Agent": user_agent, | |
"Authorization": f"Bearer {bearer_token}", | |
"x-guest-token": guest_token, | |
} | |
resp = session.get( | |
f"https://api.twitter.com/graphql/k5XapwcSikNsEsILW5FvgA/UserByScreenName?variables={{%22screen_name%22:%22{user_id}%22,%22withSafetyModeUserFields%22:true}}&features={{%22hidden_profile_likes_enabled%22:true,%22hidden_profile_subscriptions_enabled%22:true,%22responsive_web_graphql_exclude_directive_enabled%22:true,%22verified_phone_label_enabled%22:false,%22subscriptions_verification_info_is_identity_verified_enabled%22:true,%22subscriptions_verification_info_verified_since_enabled%22:true,%22highlights_tweets_tab_ui_enabled%22:true,%22responsive_web_twitter_article_notes_tab_enabled%22:true,%22creator_subscriptions_tweet_preview_api_enabled%22:true,%22responsive_web_graphql_skip_user_profile_image_extensions_enabled%22:false,%22responsive_web_graphql_timeline_navigation_enabled%22:true}}&fieldToggles={{%22withAuxiliaryUserLabels%22:false}}", | |
headers=headers, | |
) | |
return resp.json() | |
if __name__ == "__main__": | |
if len(sys.argv) < 2: | |
print( | |
"Please provide a twitter user id to continue. Sample usage: `python twitter_profile.py OldPanda`" | |
) | |
sys.exit(1) | |
user_id = sys.argv[1] | |
bearer_token = get_bearer_token() | |
guest_token = get_guest_token(bearer_token) | |
if guest_token is None: | |
print("Failed to fetch guest token, please wait for a while then try again") | |
else: | |
print(get_x_user_profile(bearer_token, guest_token, user_id)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment