Skip to content

Instantly share code, notes, and snippets.

@OldPanda
Created February 25, 2024 05:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save OldPanda/8b45eff99c56ed71cc089bfbfb30f0f9 to your computer and use it in GitHub Desktop.
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
certifi==2024.2.2
charset-normalizer==3.3.2
idna==3.6
requests==2.31.0
urllib3==2.2.1
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