import sys import requests import json class SupersetClient: def __init__(self, superset_url, username, password): self.superset_url = superset_url self.username = username self.password = password self.access_token = None self.csrf_token = None self.cookies = {} def error(self, message): print(f"Error: {message}", file=sys.stderr) sys.exit(77) def get_access_token(self): url = f"{self.superset_url}/api/v1/security/login" payload = { "password": self.password, "provider": "db", "username": self.username } response = requests.post(url, json=payload) if response.status_code != 200: self.error(f"Failed to login: {response.text}") access_token = response.json().get('access_token') if not access_token: self.error(f"Failed to extract access_token from the response: {response.text}") self.access_token = access_token def get_csrf_token(self): url_csrf = f"{self.superset_url}/api/v1/security/csrf_token/" headers = { "Authorization": f"Bearer {self.access_token}" } response = requests.get(url_csrf, headers=headers, cookies=self.cookies) if response.status_code != 200: self.error(f"Failed to get CSRF token: {response.text}") csrf_token = response.json().get('result') if not csrf_token: self.error(f"Failed to extract csrf_token from the response: {response.text}") self.csrf_token = csrf_token self.cookies = response.cookies def get_cookie_from_login(self): url = f"{self.superset_url}/login/" payload = { "csrf_token": self.csrf_token, "username": self.username, "password": self.password } response = requests.post(url, data=payload, cookies=self.cookies) self.cookies = response.cookies def list_dashboards(self): query = { "columns": ["dashboard_title", "id"], "page": 0, "page_size": 1000 } encoded_query = requests.utils.quote(json.dumps(query)) url = f"{self.superset_url}/api/v1/dashboard/?q={encoded_query}" headers = { "Content-Type": "application/json", "Authorization": f"Bearer {self.access_token}", "X-CSRFToken": self.csrf_token } response = requests.get(url, headers=headers, cookies=self.cookies) if response.status_code != 200: self.error(f"Failed getting dashboards: {response.text}") result = response.json().get('result') if not result: self.error(f"Failed getting dashboards: {response.text}") for dashboard in result: title = dashboard['dashboard_title'] dashboard_id = dashboard['id'] print(f"Dashboard: {title} - id: {dashboard_id}") def main(argv): client = SupersetClient("http://localhost:8888", "admin", "admin") client.get_access_token() client.get_csrf_token() client.get_cookie_from_login() client.list_dashboards() if __name__ == "__main__": main(sys.argv[1:])