Couldn't retrieve t field from login response(追記あり)

便利そうだったので使ってみたが、エラーが出ていたので、gitからソースを落としてみて原因を調査してみた。

 

Traceback (most recent call last):
  File "D:\Users\corei7\Anaconda3\lib\site-packages\skpy\main.py", line 67, in __init__
    self.conn.readToken()
  File "D:\Users\corei7\Anaconda3\lib\site-packages\skpy\conn.py", line 286, in readToken
    raise SkypeAuthException("No token file specified")
skpy.core.SkypeAuthException: No token file specified

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "skypebot.py", line 4, in 
    Skype('xxxxxxxx', 'xxxxxxxx')
  File "D:\Users\corei7\Anaconda3\lib\site-packages\skpy\main.py", line 69, in __init__
    self.conn.getSkypeToken()
  File "D:\Users\corei7\Anaconda3\lib\site-packages\skpy\conn.py", line 264, in getSkypeToken
    self.liveLogin(user, pwd)
  File "D:\Users\corei7\Anaconda3\lib\site-packages\skpy\conn.py", line 361, in liveLogin
    self.tokens["skype"], self.tokenExpiry["skype"] = SkypeLiveAuthProvider(self).auth(user, pwd)
  File "D:\Users\corei7\Anaconda3\lib\site-packages\skpy\conn.py", line 535, in auth
    t = self.sendCreds(user, pwd, params)
  File "D:\Users\corei7\Anaconda3\lib\site-packages\skpy\conn.py", line 568, in sendCreds
    raise SkypeAuthException(errMsg, loginResp)
skpy.core.SkypeAuthException: ("Couldn't retrieve t field from login response", )

 

skpyのサイトの下記とソースを見てみたがおかしいところはなかったので、
SKype ログイン画面Chromeのdevtoolで見るとCkTstの頭文字にGがついていた。

なので、connn.pyの568行目を
"CkTst": "G"+str(int(time.time() * 1000))},
とするとエラーは出なくなった。
このあとチャットができるかは明日以降に確認する。

追記(2017/08/25 15:00)
下記のissuesを見てみるとロシアは修正なしでログイン可能。アメリカと日本はログイン失敗となっている。
国によって成否が変わるってどういうことだ。。。

https://github.com/OllieTerrance/SkPy/issues/66

 

さらに追記(2017/08/25 20:00)
パケットの中を見てると最初のログインページのGetに対してレスポンスでCkTstが入っているので以下のように修正すれよいが値が取れなかった時の挙動が決めきれない。
日本国内だとGを追加すればよいが他の国ではダメなところがあるのでいい修正ではなさそう。

 

diff --git a/skpy/conn.py b/skpy/conn.py
index 885d643..92887ec 100644
--- a/skpy/conn.py
+++ b/skpy/conn.py
@@ -545,9 +545,13 @@ class SkypeLiveAuthProvider(SkypeAuthProvider):
             raise SkypeApiException("Couldn't retrieve PPFT from login form", loginResp)
         if "MSPRequ" not in loginResp.cookies or "MSPOK" not in loginResp.cookies:
             raise SkypeApiException("Couldn't retrieve MSPRequ/MSPOK cookies", loginResp)
+        CkTst = "G"+str(int(time.time() * 1000))
+        if "CkTst" in loginResp.cookies:
+            CkTst = loginResp.cookies.get("CkTst")
         return {"MSPRequ": loginResp.cookies.get("MSPRequ"),
                 "MSPOK": loginResp.cookies.get("MSPOK"),
-                "PPFT": ppftReg.group(1)}
+                "PPFT": ppftReg.group(1),
+                "CkTst": CkTst}
 
     def sendCreds(self, user, pwd, params):
         # Now pass the login credentials over.
@@ -557,7 +561,7 @@ class SkypeLiveAuthProvider(SkypeAuthProvider):
                                                 "lw.skype.com&redirect_uri=https%3A%2F%2Fweb.skype.com%2F"},
                               cookies={"MSPRequ": params["MSPRequ"],
                                        "MSPOK": params["MSPOK"],
-                                       "CkTst": str(int(time.time() * 1000))},
+                                       "CkTst": params["CkTst"]},
                               data={"login": user, "passwd": pwd, "PPFT": params["PPFT"]})
         tField = BeautifulSoup(loginResp.text, "html.parser").find(id="t")
         if tField is None: