]> code.delx.au - monosys/blobdiff - opal-card-tool
aur-check-updates: don't complain if a newer version is installed locally
[monosys] / opal-card-tool
index 35bac422009c27a635e5f785dea7f5bbfa133233..26fc6c7618923f41948e71ca1126dfee862c3046 100755 (executable)
@@ -12,6 +12,7 @@ import requests
 import subprocess
 import sys
 import tempfile
+import time
 
 
 VERSION = 3
@@ -19,6 +20,7 @@ VERSION = 3
 CACHE_DIR = os.environ.get("XDG_CACHE_HOME", os.path.expanduser("~/.cache/opal-card-tool"))
 PICKLE_FILE = os.path.join(CACHE_DIR, "pickle")
 
+USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0"
 OPAL_BASE = "https://www.opal.com.au"
 LOGIN_URL = OPAL_BASE + "/login/registeredUserUsernameAndPasswordLogin"
 CARD_DETAILS_URL = OPAL_BASE + "/registered/getJsonCardDetailsArray"
@@ -66,11 +68,26 @@ class Opal(object):
         self.version = VERSION
         self.username = username
         self.password = password
+        self.cards = []
+
+        self.init()
 
+    def init(self):
         self.session = requests.Session()
-        self.cards = []
+        self.session.headers["User-Agent"] = USER_AGENT
 
     def login(self):
+        print("Attempting login ", end="", flush=True)
+        for i in range(10):
+            print(".", end="", flush=True)
+            self.login_once()
+            if self.check_login():
+                print(" ok")
+                return
+
+            time.sleep(1)
+
+    def login_once(self):
         r = self.session.post(LOGIN_URL, {
             "h_username": self.username,
             "h_password": self.password,
@@ -82,6 +99,14 @@ class Opal(object):
         if json["errorMessage"]:
             raise Exception("Failed to login: %s" % json["errorMessage"])
 
+    def check_login(self):
+        r = self.session.get(CARD_DETAILS_URL)
+        try:
+            r.json()
+            return True
+        except:
+            return False
+
     def load(self):
         self.load_cards()
         for card in self.cards:
@@ -385,6 +410,7 @@ def load_opal():
 
     if opal:
         upgrade_opal(opal)
+        opal.init()
     else:
         username = input("Username: ")
         password = getpass.getpass()