Skip to content

Instantly share code, notes, and snippets.

@cmj
Last active October 31, 2025 10:03
Show Gist options
  • Select an option

  • Save cmj/2e100b2f09d83bfadd1c971c88ff4fd0 to your computer and use it in GitHub Desktop.

Select an option

Save cmj/2e100b2f09d83bfadd1c971c88ff4fd0 to your computer and use it in GitHub Desktop.
#!/bin/bash
# see https://github.com/lwthiker/curl-impersonate?tab=readme-ov-file#supported-browsers
curl_bin="curl_ff117" # curl, curl_ff117 (works), curl-impersonate-ff (doesn't work), etc
debug=1 # [0|1]
# create tempfile for cookie jar
#cookie="${temp/%//cookies.txt}"
cookie="cookies.txt"
if [[ "$curl_bin" == "curl" ]]; then user_agent=(-H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"); fi
# main.js
#bearer_token="AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA"
# main.js alt
#bearer_token="AAAAAAAAAAAAAAAAAAAAAMupswEAAAAANC5Yk%2FHGiZmGDRV3EhXMBO3uX08%3DEwAT9YySxXZXGrYScXeoKUaeyqXQFeNVWUW4SaZUvtegCUVjIi"
# Twitter for Android
bearer_token='AAAAAAAAAAAAAAAAAAAAAFQODgEAAAAAVHTp76lzh3rFzcHbmHVvQxYYpTw%3DckAlMINMjmCwxUcaXbAN4XqJVdgMJaHqNOFgPMK0zN1qLqLQCF'
# Twitter for iPhone
#bearer_token="AAAAAAAAAAAAAAAAAAAAAAj4AQAAAAAAPraK64zCZ9CSzdLesbE7LB%2Bw4uE%3DVJQREvQNCZJNiz3rHO7lOXlkVOQkzzdsgu6wWgcazdMUaGoUGm"
# Twitter for Mac
#bearer_token="AAAAAAAAAAAAAAAAAAAAAIWCCAAAAAAA2C25AxqI%2BYCS7pdfJKRH8Xh19zA%3D8vpDZzPHaEJhd20MKVWp3UR38YoPpuTX7UD2cVYo3YNikubuxd"
# Twitter for iPad (bad)
#bearer_token="AAAAAAAAAAAAAAAAAAAAAGHtAgAAAAAA%2Bx7ILXNILCqkSGIzy6faIHZ9s3Q%3DQy97w6SIrzE7lQwPJEYQBsArEE2fC25caFwRBvAGi456G09vGR"
header=(-H "Host: api.twitter.com" -H "Accept: */*" -H "Authorization: Bearer ${bearer_token}" -H "Content-Type:application/json" -H "Referer: https://x.com/" ${user_agent[@]} -H "Accept-Language: en-US" -H "X-Twitter-Client-Language: en-US")
guest_token=$(${curl_bin} -s -XPOST "${header[@]}" -c "${cookie}" "https://api.twitter.com/1.1/guest/activate.json" | jq -r '.guest_token')
header2=("${header[@]}" -H "X-Guest-Token: ${guest_token}")
base_url='https://api.twitter.com/1.1/onboarding/task.json'
# x-transaction-id ? may not be needed
trans_id=$(tr -dc 0-9A-Za-z < /dev/urandom | head -c 94) # random string
# start flow
flow=$(${curl_bin} -sv -XPOST "${base_url}?flow_name=login" "${header2[@]}" -b "${cookie}" -c "${cookie}" \
-d '{"input_flow_data":{"requested_variant":"'"${trans_id}"'","flow_context":{"debug_overrides":{},"start_location":{"location":"manual_link"}}},"subtask_versions":{"action_list":2,"alert_dialog":1,"app_download_cta":1,"check_logged_in_account":2,"choice_selection":3,"contacts_live_sync_permission_prompt":0,"cta":7,"email_verification":2,"end_flow":1,"enter_date":1,"enter_email":2,"enter_password":5,"enter_phone":2,"enter_recaptcha":1,"enter_text":5,"enter_username":2,"generic_urt":3,"in_app_notification":1,"interest_picker":3,"js_instrumentation":1,"menu_dialog":1,"notifications_permission_prompt":2,"open_account":2,"open_home_timeline":1,"open_link":1,"phone_verification":4,"privacy_options":1,"security_key":3,"select_avatar":4,"select_banner":2,"settings_list":7,"show_code":1,"sign_up":2,"sign_up_review":4,"tweet_selection_urt":1,"update_users":1,"upload_media":1,"user_recommendations_list":4,"user_recommendations_urt":1,"wait_spinner":3,"web_modal":1}}')
flow_token=$(sed -n '$p' <<< "${flow}" | jq -r .flow_token 2>/dev/null)
[[ "$debug" -eq 1 ]] && echo -e "### flow start\n${flow}\n### flow_token\n${flow_token}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment