33import json
44import sys
55import pyotp
6+ import cloudscraper
67
7- # NOTE: pyotp and requests are dependencies
8- # > pip install pyotp requests
8+ # NOTE: pyotp, requests and cloudscraper are dependencies
9+ # > pip install pyotp requests cloudscraper
910
1011TW_CONSUMER_KEY = '3nVuSoBZnx6U4vzUxf5w'
1112TW_CONSUMER_SECRET = 'Bcs59EFbbsdF6Sl9Ng71smgStWEGwXXKSjYvPVt7qys'
@@ -41,10 +42,10 @@ def auth(username, password, otp_secret):
4142 "X-Twitter-Client-DeviceID" : ""
4243 }
4344
44- session = requests . Session ()
45- session .headers = twitter_header
45+ scraper = cloudscraper . create_scraper ()
46+ scraper .headers = twitter_header
4647
47- task1 = session .post (
48+ task1 = scraper .post (
4849 'https://api.twitter.com/1.1/onboarding/task.json' ,
4950 params = {
5051 'flow_name' : 'login' ,
@@ -71,9 +72,9 @@ def auth(username, password, otp_secret):
7172 }
7273 )
7374
74- session .headers ['att' ] = task1 .headers .get ('att' )
75+ scraper .headers ['att' ] = task1 .headers .get ('att' )
7576
76- task2 = session .post (
77+ task2 = scraper .post (
7778 'https://api.twitter.com/1.1/onboarding/task.json' ,
7879 json = {
7980 "flow_token" : task1 .json ().get ('flow_token' ),
@@ -88,7 +89,7 @@ def auth(username, password, otp_secret):
8889 }
8990 )
9091
91- task3 = session .post (
92+ task3 = scraper .post (
9293 'https://api.twitter.com/1.1/onboarding/task.json' ,
9394 json = {
9495 "flow_token" : task2 .json ().get ('flow_token' ),
@@ -109,7 +110,7 @@ def auth(username, password, otp_secret):
109110 response_text = t3_subtask ["enter_text" ]["hint_text" ]
110111 totp = pyotp .TOTP (otp_secret )
111112 generated_code = totp .now ()
112- task4resp = session .post (
113+ task4resp = scraper .post (
113114 "https://api.twitter.com/1.1/onboarding/task.json" ,
114115 json = {
115116 "flow_token" : task3 .json ().get ("flow_token" ),
0 commit comments