【问题标题】:Export salesforce report as CSV将 Salesforce 报告导出为 CSV
【发布时间】:2018-01-25 12:39:08
【问题描述】:

我正在尝试通过 python 提取销售人员报告。我试过这种方法:

import requests

l = requests.get('sfinstanceurl/?un=user&pw=passw')

report = requests.get('sfinstanceurl/reportid?view=d&snip&export=1&enc=UTF-8&xf=csv',cookies=l.cookies)

print(report.content)

还有这个:

def sfdc_to_pd(reportid):

    login_data = {'un': 'your_username', 'pw': 'your_password'}

    with requests.session() as s:
    s.get('https://your_instance.salesforce.com', params = login_data)
    d = requests.get("https://your_instance.salesforce.com/{}?export=1&enc=UTF-8&xf=csv".format(reportid), headers=s.headers, cookies=s.cookies)
    lines = d.content.splitlines()
    reader = csv.reader(lines)
    data = list(reader)
    data = data[:-7]
    df = pd.DataFrame(data)
    df.columns = df.iloc[0]
    df = df.drop(0)
    return df
    print df

对于两者,当我打印内容时,我得到了这个(即使状态响应总是 200):

b'\r\n<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\n<html>\n<head>\n    <meta HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">\n\n\n\n\n\n<script>\nif (this.SfdcApp && this.SfdcApp.projectOneNavigator) { SfdcApp.projectOneNavigator.handleRedirect(\'sfinstanceurl?ec=302&startURL=%2F00O0m000000JzRc%3Fview%3Dd%26enc%3DUTF-8%26export%3D1%26xf%3Dcsv%26snip%3D\'); }  else \nif (window.location.replace){ \nwindow.location.replace(\'sfinstanceurl?ec=302&startURL=%2F00O0m000000JzRc%3Fview%3Dd%26enc%3DUTF-8%26export%3D1%26xf%3Dcsv%26snip%3D\');\n} else {;\nwindow.location.href =\'sfinstanceurl?ec=302&startURL=%2F00O0m000000JzRc%3Fview%3Dd%26enc%3DUTF-8%26export%3D1%26xf%3Dcsv%26snip%3D\';\n} \n</script>\n\n</head>\n\n\n</html>\n\n\n\n\n\n<!-- Body events -->\n<script type="text/javascript">function bodyOnLoad(){if(window.PreferenceBits){window.PreferenceBits.prototype.csrfToken="null";};}function bodyOnBeforeUnload(){}function bodyOnFocus(){}function bodyOnUnload(){}</script>\n\t\t\t\n</body>\n</html>\n\n\n<!--\n...................................................................................................\n...................................................................................................\n...................................................................................................\n...................................................................................................\n-->\n'

我的公司使用 SSO,所以安全令牌不是我必须尝试不同方法的东西。我错过了什么吗?为什么我在内容中收不到报告?

编辑:

我也刚刚尝试过这种方法:

from simple_salesforce import Salesforce
import requests
import base64
import json

sf = Salesforce(username=    #login
                ,password=  # password
                ,security_token= # token )

print "get sid ", sf.session_id

response = requests.get("https://instancename/reportid?view=d&snip&export=1&enc=UTF-8&xf=csv",
                  headers = sf.headers, cookies = {'sid' : sf.session_id})

response.content

它仍然返回相同的 HTML 对象。

【问题讨论】:

  • 看起来你得到的是一个 HTML 对象,而不是预期的 csv 格式。尝试使用 simple-salesforce 之类的 salesforce python 模块进行身份验证并将其与访问特定报告的请求相结合。 salesforce.stackexchange.com/questions/47414/…
  • @BoboDarph 我刚刚尝试过(simple_salesforce 方法),仍然得到相同的 HTML 响应。将更新问题。

标签: python salesforce


【解决方案1】:

看起来您是直接从 SF 实例运行报告,这将始终返回 HTML,因为它不是 API 调用。

要通过 API 访问报告,请参阅 Salesforce 报告和仪表板 REST API 的文档:

https://developer.salesforce.com/docs/atlas.en-us.api_analytics.meta/api_analytics/sforce_analytics_rest_api_intro.htm

以下是报告专用资源的链接:

https://developer.salesforce.com/docs/atlas.en-us.api_analytics.meta/api_analytics/sforce_analytics_rest_api_get_reportdata.htm

使用 Simple Salesforce 时,您可以轻松调用 API,如下所示:

from simple_salesforce import Salesforce
import requests
import base64
import json

sf = Salesforce(username=[username],password=[password],security_token=[token])
reportId = '00OR0000000K2UeMAK'
reportRESTPath = ('analytics/reports/{id}'.format(id='00OR0000000K2UeMAK')

# Synchronous report get

reportJSON = sf.restful(reportRESTPath, {'includeDetails': 'true'})

# Asynchronous report create

asyncJobJSON = sf.restful(reportRESTPath, {'includeDetails': 'true'}, 'POST')

# Asynchronous report get

reportJSON = sf.restful(('{basePath}/instances/{instanceId}'.format(basePath=reportRESTPath,instanceId=asyncJobJSON.Id), {'includeDetails': 'true'})

【讨论】:

  • 非常感谢您的回复。经过几次调整后,我能够使这种方法起作用,但是,如何在同步请求中添加过滤器?我已经阅读了文档的几个部分,似乎它必须放在请求的正文中。我该怎么做?
  • @rodrigocf 看起来 Simple Salesforce 不允许修改正文。您也许可以自己编写代码? requests.session.request 方法的详细信息可以在这里找到docs.python-requests.org/en/master/api,这在扩展时会很有用。见参数“数据”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 2021-03-17
相关资源
最近更新 更多