Make gkeep use a stored token.
authorScott Gasch <[email protected]>
Wed, 8 Feb 2023 21:32:31 +0000 (13:32 -0800)
committerScott Gasch <[email protected]>
Wed, 8 Feb 2023 21:32:31 +0000 (13:32 -0800)
gkeep_renderer.py

index c07ebd6a4c060cfb3f02a64001ed79528296b8e4..974076bd89b65d3bb0798d40a04e04afb82643ca 100644 (file)
@@ -34,22 +34,31 @@ class gkeep_renderer(renderer.abstaining_renderer):
             "teal": "#16504B",
         }
         self.keep = gkeepapi.Keep()
-        success = self.keep.login(
+        self.token_file = "./google_keep_token.json"
+        if os.path.exists(self.token_file):
+            logger.debug("Attempting to reuse persisted Google Keep login token...")
+            try:
+                with open(self.token_file, "r") as rf:
+                    token = "".join(rf.readlines()).strip()
+                self.keep.resume(secrets.google_keep_username, token)
+                logger.debug("Successfully reused existing login token.")
+            except gkeepapi.exception.LoginException:
+                logger.warning("Invalid token, attempting to re-login.")
+
+        if not self.keep.login(
             secrets.google_keep_username,
             secrets.google_keep_password,
             secrets.google_keep_mac,
-        )
-        if success:
-            logger.debug("Connected with gkeep.")
-        else:
-            logger.debug("Error connecting with gkeep.")
+        ):
+            raise Exception("Error connecting with Google Keep?!")
+        logger.debug("Successfully logged in with Google Keep")
 
     def debug_prefix(self) -> str:
         return "gkeep"
 
     def periodic_render(self, key: str) -> bool:
         strikethrough = re.compile("(\u2611[^\n]*)\n", re.UNICODE)
-        #linkify = re.compile(r".*(https?:\/\/\S+).*")
+        # linkify = re.compile(r".*(https?:\/\/\S+).*")
 
         self.keep.sync()
         result_list = self.keep.find(labels=[self.keep.findLabel("kiosk")])
@@ -67,7 +76,7 @@ class gkeep_renderer(renderer.abstaining_renderer):
                 contents = contents.replace(
                     "\u2610 ", '<LI><INPUT TYPE="checkbox">&nbsp;'
                 )
-                #contents = linkify.sub(r'<a href="\1">\1</a>', contents)
+                # contents = linkify.sub(r'<a href="\1">\1</a>', contents)
 
                 individual_lines = contents.split("\n")
                 num_lines = len(individual_lines)
@@ -92,23 +101,24 @@ class gkeep_renderer(renderer.abstaining_renderer):
                     logger.debug(f"Unknown color '{color}'")
                 print(f"TITLE: {color} {note.title}")
                 with file_writer.file_writer(filename) as f:
-                    f.write("""
+                    f.write(
+                        """
 <STYLE type="text/css">
   a:link { color:#88bfbf; }
   ul { list-style-type:none; }
 </STYLE>
 <DIV STYLE="border-radius:25px; border-style:solid; padding:20px; background-color:%s; color:#eeeeee; font-size:x-large;">
-""" % color
-                            )
-                    f.write(f"""
+"""
+                        % color
+                    )
+                    f.write(
+                        f"""
 <p style="color:#ffffff; font-size:larger"><B>{note.title}</B></p>
 <HR style="border-top:3px solid white;">
 """
-                            )
+                    )
                     if num_lines >= 10:
-                        logger.debug(
-                            f"{num_lines} lines: two column mode"
-                        )
+                        logger.debug(f"{num_lines} lines: two column mode")
                         f.write('<TABLE BORDER=0 WIDTH=100%><TR valign="top">')
                         f.write(
                             '<TD WIDTH=50% style="color:#eeeeee; font-size:large">\n'
@@ -124,11 +134,9 @@ class gkeep_renderer(renderer.abstaining_renderer):
                                     '<TD WIDTH=50% style="color:#eeeeee; font-size:large">\n'
                                 )
                                 f.write("<FONT><UL STYLE='list-style-type:none'>")
-                        f.write("</UL></FONT></TD></TR></TABLE></DIV>\n")
+                        f.write("</UL></FONT></TD></TR></TABLE></DIV>")
                     else:
-                        logger.debug(
-                            f"{num_lines} lines: one column mode"
-                        )
+                        logger.debug(f"{num_lines} lines: one column mode")
                         f.write(f"<FONT><UL>{contents}</UL></FONT>")
                     f.write("</DIV>")
             else:
@@ -138,15 +146,27 @@ class gkeep_renderer(renderer.abstaining_renderer):
                     os.remove(_)
                 except:
                     pass
-        return True
+
+    if self.token_file:
+        token = self.keep.getMasterToken()
+        os.umask(0)
+        descriptor = os.open(
+            path=self.token_file,
+            flags=(os.O_WRONLY | os.O_CREAT | os.O_TRUNC),
+            mode=0o600,
+        )
+        with open(descriptor, "w") as wf:
+            print(token, file=wf)
+        logger.debug("Saved Google Keep token successfully.")
+    return True
 
 
 # Test
-#logger.setLevel(logging.DEBUG)
-#ch = logging.StreamHandler()
-#ch.setLevel(logging.DEBUG)
-#formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
-#ch.setFormatter(formatter)
-#logger.addHandler(ch)
-#x = gkeep_renderer({"Test", 1234})
-#x.periodic_render("Test")
+# logger.setLevel(logging.DEBUG)
+# ch = logging.StreamHandler()
+# ch.setLevel(logging.DEBUG)
+# formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
+# ch.setFormatter(formatter)
+# logger.addHandler(ch)
+# x = gkeep_renderer({"Test", 1234})
+# x.periodic_render("Test")