18
18
19
19
logger = logging .getLogger (__name__ )
20
20
21
- def interceptor (request ) -> str :
21
+ """ def interceptor(request) -> str:
22
22
if (
23
23
request.method == 'POST'
24
24
and request.url == 'https://passport.twitch.tv/protected_login'
@@ -29,11 +29,12 @@ def interceptor(request) -> str:
29
29
data['client_id'] = CLIENT_ID
30
30
request.body = json.dumps(data).encode('utf-8')
31
31
del request.headers['Content-Length']
32
- request .headers ['Content-Length' ] = str (len (request .body ))
32
+ request.headers['Content-Length'] = str(len(request.body))"""
33
33
34
34
class TwitchLogin (object ):
35
35
__slots__ = [
36
36
"client_id" ,
37
+ "device_id" ,
37
38
"token" ,
38
39
"login_check_result" ,
39
40
"session" ,
@@ -45,13 +46,14 @@ class TwitchLogin(object):
45
46
"cookies"
46
47
]
47
48
48
- def __init__ (self , client_id , username , user_agent , password = None ):
49
+ def __init__ (self , client_id , device_id , username , user_agent , password = None ):
49
50
self .client_id = client_id
51
+ self .device_id = device_id
50
52
self .token = None
51
53
self .login_check_result = False
52
54
self .session = requests .session ()
53
55
self .session .headers .update (
54
- {"Client-ID" : self .client_id , "User-Agent" : user_agent }
56
+ { "Client-ID" : self .client_id , "X-Device-Id" : self . device_id , " User-Agent" : user_agent }
55
57
)
56
58
self .username = username
57
59
self .password = password
@@ -69,8 +71,8 @@ def login_flow(self):
69
71
"remember_me" : True ,
70
72
}
71
73
# login-fix
72
- # use_backup_flow = False
73
- use_backup_flow = True
74
+ use_backup_flow = False
75
+ # use_backup_flow = True
74
76
75
77
for attempt in range (0 , 25 ):
76
78
password = (
@@ -131,8 +133,8 @@ def login_flow(self):
131
133
# If the user didn't load the password from run.py we can just ask for it again.
132
134
break
133
135
# login-fix
134
- # elif err_code == 1000:
135
- elif err_code in [1000 , 5022 ]:
136
+ elif err_code == 1000 :
137
+ # elif err_code in [1000, 5022]:
136
138
logger .info (
137
139
"Console login unavailable (CAPTCHA solving required)."
138
140
)
@@ -162,11 +164,18 @@ def set_token(self, new_token):
162
164
self .session .headers .update ({"Authorization" : f"Bearer { self .token } " })
163
165
164
166
def send_login_request (self , json_data ):
165
- response = self .session .post ("https://passport.twitch.tv/protected_login" , json = json_data )
167
+ #response = self.session.post("https://passport.twitch.tv/protected_login", json=json_data)
168
+ response = self .session .post ("https://passport.twitch.tv/login" , json = json_data , headers = {
169
+ 'Accept' : 'application/vnd.twitchtv.v3+json' ,
170
+ 'Accept-Encoding' : 'gzip' ,
171
+ 'Accept-Language' : 'en-US' ,
172
+ 'Content-Type' : 'application/json; charset=UTF-8' ,
173
+ 'Host' : 'passport.twitch.tv'
174
+ },)
166
175
return response .json ()
167
176
168
177
def login_flow_backup (self , password = None ):
169
- """Backup OAuth Selenium login"""
178
+ """Backup OAuth Selenium login
170
179
from undetected_chromedriver import ChromeOptions
171
180
import seleniumwire.undetected_chromedriver.v2 as uc
172
181
from selenium.webdriver.common.by import By
@@ -218,7 +227,9 @@ def login_flow_backup(self, password = None):
218
227
logger.error("Couldn't extract login, probably bad cookies.")
219
228
return False
220
229
221
- return self .get_cookie_value ("auth-token" )
230
+ return self.get_cookie_value("auth-token")"""
231
+ logger .error ("Backup login flow is not available. Use a VPN or wait a while to avoid the CAPTCHA." )
232
+ return False
222
233
223
234
def check_login (self ):
224
235
if self .login_check_result :
@@ -230,7 +241,17 @@ def check_login(self):
230
241
return self .login_check_result
231
242
232
243
def save_cookies (self , cookies_file ):
233
- pickle .dump (self .cookies , open (cookies_file , "wb" ))
244
+ #pickle.dump(self.cookies, open(cookies_file, "wb"))
245
+ # ^ only this line was needed with Selenium ^
246
+ cookies_dict = self .session .cookies .get_dict ()
247
+ cookies_dict ["auth-token" ] = self .token
248
+ if "persistent" not in cookies_dict : # saving user id cookies
249
+ cookies_dict ["persistent" ] = self .user_id
250
+
251
+ self .cookies = []
252
+ for cookie_name , value in cookies_dict .items ():
253
+ self .cookies .append ({"name" : cookie_name , "value" : value })
254
+ pickle .dump (self .cookies , open (cookies_file , "wb" ))
234
255
235
256
def get_cookie_value (self , key ):
236
257
for cookie in self .cookies :
0 commit comments