@@ -539,7 +539,8 @@ def auth(self, user, pwd):
539
539
"""
540
540
# Do the authentication dance.
541
541
params = self .getParams ()
542
- t = self .sendCreds (user , pwd , params )
542
+ params ["opid" ] = self .sendCreds (user , pwd , params )
543
+ t = self .sendOpid (params )
543
544
return self .getToken (t )
544
545
545
546
def getParams (self ):
@@ -558,21 +559,49 @@ def getParams(self):
558
559
559
560
def sendCreds (self , user , pwd , params ):
560
561
# Now pass the login credentials over.
562
+ loginResp = self .conn ("POST" , "{0}/ppsecure/post.srf" .format (SkypeConnection .API_MSACC ),
563
+ params = {"wa" : "wsignin1.0" , "wp" : "MBI_SSL" ,
564
+ "wreply" : "https://lw.skype.com/login/oauth/proxy?client_id=578134&site_name="
565
+ "lw.skype.com&redirect_uri=https%3A%2F%2Fweb.skype.com%2F" },
566
+ cookies = {"MSPRequ" : params ["MSPRequ" ], "MSPOK" : params ["MSPOK" ],
567
+ "CkTst" : "G{0}" .format (int (time .time () * 1000 ))},
568
+ data = {"login" : user , "passwd" : pwd ,
569
+ "PPFT" : params ["PPFT" ], "loginoptions" : "3" })
570
+ opid = re .search (r"""opid=([A-Z0-9]+)""" , loginResp .text , re .I )
571
+ if opid :
572
+ return opid .group (1 )
573
+ loginPage = BeautifulSoup (loginResp .text , "html.parser" )
574
+ for form in loginPage .findAll ("form" ):
575
+ if form ["name" ] == "fmHF" :
576
+ url = form ["action" ].split ("?" , 1 )[0 ]
577
+ raise SkypeAuthException ("Account action required ({0}), login with a web browser first"
578
+ .format (url ), loginResp )
579
+ else :
580
+ raise SkypeApiException ("Couldn't retrieve opid field from login response" , loginResp )
581
+
582
+ def sendOpid (self , params ):
583
+ # Now repeat with the opid parameter.
561
584
loginResp = self .conn ("POST" , "{0}/ppsecure/post.srf" .format (SkypeConnection .API_MSACC ),
562
585
params = {"wa" : "wsignin1.0" , "wp" : "MBI_SSL" ,
563
586
"wreply" : "https://lw.skype.com/login/oauth/proxy?client_id=578134&site_name="
564
587
"lw.skype.com&redirect_uri=https%3A%2F%2Fweb.skype.com%2F" },
565
588
cookies = {"MSPRequ" : params ["MSPRequ" ],
566
589
"MSPOK" : params ["MSPOK" ],
567
590
"CkTst" : str (int (time .time () * 1000 ))},
568
- data = {"login" : user , "passwd" : pwd , "PPFT" : params ["PPFT" ]})
591
+ data = {"opid" : params ["opid" ],
592
+ "site_name" : "lw.skype.com" ,
593
+ "oauthPartner" : "999" ,
594
+ "client_id" : "578134" ,
595
+ "redirect_uri" : "https://web.skype.com" ,
596
+ "PPFT" : params ["PPFT" ],
597
+ "type" : "28" })
569
598
tField = BeautifulSoup (loginResp .text , "html.parser" ).find (id = "t" )
570
599
if tField is None :
571
600
err = re .search (r"sErrTxt:'([^'\\]*(\\.[^'\\]*)*)'" , loginResp .text )
572
601
errMsg = "Couldn't retrieve t field from login response"
573
602
if err :
574
603
errMsg = re .sub (r"<.*?>" , "" , err .group (1 )).replace ("\\ '" , "'" ).replace ("\\ \\ " , "\\ " )
575
- raise SkypeAuthException (errMsg , loginResp )
604
+ raise SkypeApiException (errMsg , loginResp )
576
605
return tField .get ("value" )
577
606
578
607
def getToken (self , t ):
0 commit comments