Source code to extract data from your Tableau server instance. See this article: https://hackersandslackers.com/tableaus-rest-api-turning-tableau-into-an-etl-pipeline-gui/
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import requests | |
import xml.etree.ElementTree as ET | |
from . import r | |
import pandas as pd | |
import io | |
class ExtractTableauView: | |
"""Class for with the Tableau server API.""" | |
__baseurl = r.get('baseurl') | |
__username = r.get('username') | |
__password = r.get('password') | |
__database = r.get('uri') | |
__contenturl = r.get('contenturl') | |
@classmethod | |
def get_view(cls, site, xml, view, token): | |
"""Extract contents of a single view.""" | |
headers = {'X-Tableau-Auth': token, | |
'Content-Type': 'text/csv' | |
} | |
req = requests.get(cls.__baseurl + '/api/3.2/sites/' + str(site) +'/views/' + str(view) + '/data', headers=headers, stream=True) | |
csv_text = req.text | |
view_df = pd.read_csv(io.StringIO(csv_text), header=0) | |
return view_df | |
@classmethod | |
def list_views(cls, site, xml, token): | |
"""List all views belonging to a Tableau Site.""" | |
headers = {'X-Tableau-Auth': token} | |
req = requests.get(cls.__baseurl + '/api/3.2/sites/' + site + '/views', auth=(cls.__username, cls.__password), headers=headers) | |
root = ET.fromstring(req.content) | |
views_arr = [] | |
for child in root.iter('*'): | |
if child.tag == '{http://tableau.com/api}views': | |
for view in child: | |
view_dict = { | |
'name': view.attrib.get('name'), | |
'id': view.attrib.get('id'), | |
'url': cls.__baseurl + '/' + view.attrib.get('contentUrl'), | |
'created': view.attrib.get('createdAt'), | |
'updated': view.attrib.get('updatedAt') | |
} | |
views_arr.append(view_dict) | |
return views_arr | |
@classmethod | |
def get_token(cls, xml): | |
"""Receive Auth token to perform API requests.""" | |
for child in xml.iter('*'): | |
if child.tag == '{http://tableau.com/api}credentials': | |
token = child.attrib.get('token') | |
return token | |
@classmethod | |
def get_site(cls, xml): | |
"""Retrieve ID of Tableau 'site' instance.""" | |
root = xml | |
for child in root.iter('*'): | |
if child.tag == '{http://tableau.com/api}site': | |
site = child.attrib.get('id') | |
return site | |
@classmethod | |
def initialize_tableau_request(cls): | |
"""Retrieve core XML for interacting with Tableau.""" | |
headers = {'Content-Type': 'application/xml'} | |
body = '<tsRequest><credentials name="' + cls.__username + '" password="' + cls.__password + '" ><site contentUrl="' + cls.__contenturl + '" /></credentials></tsRequest>' | |
req = requests.post(cls.__baseurl + '/api/3.2/auth/signin', auth=(cls.__username, cls.__password), headers=headers, data=body) | |
root = ET.fromstring(req.content) | |
return root |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment