<p>Tableau公开了一个restapi,可以用来下载csv文件。API端点是<code>https://MY-SERVER/api/VERSION_NUM/auth/signin</code>,其中<code>VERSION_NUM</code>取决于tableau服务器的版本,API版本和tableau服务器版本的映射可以找到<a href="https://onlinehelp.tableau.com/current/api/rest_api/en-us/REST/rest_api_concepts_versions.htm" rel="nofollow noreferrer">here</a>。为了使身份验证成功工作,您需要使用上面提到的API端点获取一个令牌。然后可以在头参数<code>'X-tableau-auth'</code>中传递此标记。代码如下:</p>
<pre><code>import requests, json
from config import USERNAME, PASSWORD, SERVER_NAME
# NOTE! Substitute your own values for the following variables
server_name = SERVER_NAME # Name or IP address of your installation of Tableau Server
user_name = USERNAME # User name to sign in as (e.g. admin)
password = PASSWORD
site_url_id = "" # Site to sign in to. An empty string is used to specify the default site.
signin_url = "http://{}/api/3.1/auth/signin".format(server_name)
csv_url = "https://{}/#/views/Test/Dash/A.csv".format(server_name)
payload = { "credentials": { "name": user_name, "password": password, "site": {"contentUrl": site_url_id }}}
headers = {
'accept': 'text/csv,application/json',
'content-type': 'application/json'
}
# Send the request to the server
req = requests.post(signin_url, json=payload, headers=headers)
req.raise_for_status()
# Get the response
response = json.loads(req.content)
# Parse the response JSON. The response body will look similar
# to the following example:
#
# {
# "credentials": {
# "site": {
# "id": "xxxxxxxxxx-xxxx-xxxx-xxxxxxxxxx",
# "contentUrl": ""
# },
# "user": {
# "id": "xxxxxxxxxx-xxxx-xxxx-xxxxxxxxxx"
# },
# "token": "AUTH-TOKEN"
# }
# }
# Get the authentication token from the <credentials> element
token = response["credentials"]["token"]
# Get the site ID from the <site> element
site_id = response["credentials"]["site"]["id"]
print('Sign in successful!')
print('\tToken: {token}'.format(token=token))
print('\tSite ID: {site_id}'.format(site_id=site_id))
# Set the authentication header using the token returned by the Sign In method.
headers['X-tableau-auth']=token
csv_req = requests.get(csv_url, headers=headers)
# ... Make other calls here ...
csv_req.raise_for_status()
print(csv_req.status_code) #200
with open('something.csv', 'wb') as f:
f.write(csv_req.content)
</code></pre>
<p>这通过了身份验证问题,但我得到的是响应中的页面源,而不是CSV文件</p>
<p>页面来源:</p>
^{pr2}$
<p>如果有人能指导我如何获得文本/csv响应而不是html,这将是非常有帮助的。在</p>