aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md7
-rwxr-xr-xextract_token_from_browser.py50
2 files changed, 57 insertions, 0 deletions
diff --git a/README.md b/README.md
index 87afa67..bc65c64 100644
--- a/README.md
+++ b/README.md
@@ -171,6 +171,13 @@ token (but not the token itself). If you're worried about this, you can use the
8. Return to WeeChat and run `/slack register <token>:<cookie>`.
9. Reload the script with `/python reload slack`.
+If you use Firefox, you can run the `extract_token_from_browser.py` script to
+get the tokens and cookies for all the teams you're logged into:
+
+```
+./extract_token_from_browser.py firefox
+```
+
#### Optional: Connecting to multiple teams
You can run the register command multiple times to connect to multiple teams.
diff --git a/extract_token_from_browser.py b/extract_token_from_browser.py
new file mode 100755
index 0000000..34235ab
--- /dev/null
+++ b/extract_token_from_browser.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python3
+
+import argparse
+import json
+from pathlib import Path
+import sqlite3
+import sys
+
+parser = argparse.ArgumentParser(
+ description="Extract Slack tokens from the browser files"
+)
+parser.add_argument(
+ "browser", help="Which browser to extract from", metavar="<browser>"
+)
+args = parser.parse_args()
+
+if args.browser != "firefox":
+ print("Currently only firefox is supported by this script", file=sys.stderr)
+ sys.exit(1)
+
+if sys.platform.startswith("linux"):
+ firefox_path = Path.home().joinpath(".mozilla/firefox")
+elif sys.platform.startswith("darwin"):
+ firefox_path = Path.home().joinpath("Library/Application Support/Firefox/Profiles")
+else:
+ print("Currently only Linux and macOS is supported by this script", file=sys.stderr)
+ sys.exit(1)
+
+try:
+ default_profile_path = next(firefox_path.glob("*.default-release"))
+except StopIteration:
+ print("Couldn't find the default profile for Firefox", file=sys.stderr)
+ sys.exit(1)
+
+cookies_path = default_profile_path.joinpath("cookies.sqlite")
+con = sqlite3.connect(f"file:{cookies_path}?immutable=1", uri=True)
+cookies_query = "SELECT value FROM moz_cookies WHERE host = '.slack.com' AND name = 'd'"
+cookie_d_value = con.execute(cookies_query).fetchone()[0]
+con.close()
+
+local_storage_path = default_profile_path.joinpath("webappsstore.sqlite")
+con = sqlite3.connect(f"file:{local_storage_path}?immutable=1", uri=True)
+local_storage_query = "SELECT value FROM webappsstore2 WHERE key = 'localConfig_v2'"
+local_config_str = con.execute(local_storage_query).fetchone()[0]
+con.close()
+
+local_config = json.loads(local_config_str)
+
+for team in local_config["teams"].values():
+ print(f"{team['name']}: /slack register {team['token']}:{cookie_d_value}")