【问题标题】:Salesforce: Download Reports via URL in RSalesforce:通过 R 中的 URL 下载报告
【发布时间】:2019-05-14 16:57:41
【问题描述】:

我尝试通过 URL 下载 Salesforce 中可用的报告,例如

http://YOURInstance.my.salesforce.com/012389u13541?export=1&enc=UTF-8&xf=csv

在 R.

我已经进行了一些调查以通过 HTTR-GET 访问报告,但是直到今天还没有任何有意义的结果。不幸的是,R 正在下载 HTML 代码而不是所需的 csv 文件。我也尝试实现这里建议的方法:

https://salesforce.stackexchange.com/questions/47414/download-a-report-using-python

“RForcecom”包允许通过 API 进行交互,但我无法弄清楚如何在 R 中实现上述解决方案。

一般 GET 请求:

GET("http://YOUR_Instance.my.salesforce.com/012389u13541?export=1&enc=UTF-8&xf=csv")

我希望输出为 csv 格式,但我收到的报告数据是 html 源代码。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3...
<html>
<head>
    <meta HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
...

有没有人遇到过同样的问题并可以提供指导?非常感谢任何形式的帮助。提前致谢!

已更新且无法正常工作的 R-Snippet:

library(RForcecom)
library(httr)
username='username'
password='password'
instanceURL <- "https://login.salesforce.com/"
session <- rforcecom.login(username, password, instanceURL)
sid=as.character(session['sessionID'])

url='http://YOURInstance.my.salesforce.com/012389u13541?export=1&enc=UTF-8&xf=csv'
getData=GET(url,add_headers('Content-Type'='application/json','Authorization'=paste0("Bearer ",sid),'X-PrettyPrint'='1'),set_cookies('sid'=sid))

【问题讨论】:

    标签: r url salesforce report httr


    【解决方案1】:

    您确定您的报告 ID 有效吗?它看起来不正确(你只是为了这篇文章的目的而混淆了它吗?)。您得到的 HTML 中有什么错误消息? SF登录界面?

    您正在做的实际上是“屏幕抓取”。这不是一个真正的 API,它可能随时中断,您应该找到/构建正确使用 Salesforce Analytics API 的东西。您已收到警告。

    但如果你想要一个快速而肮脏的解决方案......

    您需要假装自己是经过身份验证的用户,并且拥有有效的会话 ID。将 cookie 添加到您的 GET 请求中。

    如何获取有效的会话 ID?

    一旦你拥有它 - 在你的 GET 中添加一个 Cookie 标头,其值为 sid=&lt;session id goes here&gt;

    这是 SoapUI 中的原始请求和响应。

    【讨论】:

    • 你好!感谢您的回答 :-) 报告 ID 不是有效的,只是出于解释目的输入了一些随机内容。无论如何,我已经尝试使用您建议的方法(添加标题和 cookie)。您可以在上面更新的帖子中查看 R-sn-p。我不明白为什么我仍然得到 HTML 源代码。在 Python 中实现的相同方法为我提供了正确的输出。还有其他建议吗?在此先感谢 - 最好的,安德烈
    • 对不起,我一生中从未写过一行 R。您可以将您的请求发送到像requestbin.fullcontact.com 这样的包罗万象的服务而不是 SF,以查看 Cookie 是否设置好?当然你不需要授权一...
    【解决方案2】:

    我最近遇到了同样的问题,您需要在查询中添加一个神奇的参数:isdtp=p1

    所以如果你尝试: http://YOURInstance.my.salesforce.com/012389u13541?export=1&enc=UTF-8&xf=csv&isdtp=p1

    它应该直接返回文件。

    【讨论】:

    • 当我简单地将它作为 URL 输入时,这种链接格式对我来说非常有用,但是当我尝试使用 python/requests 时,我遇到的问题与围绕它提到的原始问题仅在我的 csv 中下载 HTML 相同.当您下载这些报告时,您是否正在做一些特别的事情?我所做的只是使用 requests.get(url) 约定,其中我的 URL 是您上面的格式。
    【解决方案3】:

    在您的示例中,我认为您不能在尝试时将 rforcecom 会话与 httr 函数一起使用。

    这里有一个稍微不同的解决问题的方法。

    与其尝试检索您已经在 Salesforce 中创建的报告,不如在 SOQL 中指定报告并使用rforcecom.query 函数从 r 执行 SOQL。这将返回数据帧中的数据,并且不需要在 r 中进一步处理数据以使其可用。

    我经常使用这种技术,一旦您习惯了 Salesforce API,我认为它对于大多数用例来说可能更快、更强大。

    这是我用来返回 Salesforce 中所有机会的选择机会数据的简单函数。

    getSFOpps <- function(session) {
    
        #Construct SOQL Query
        soql <- "SELECT Id,
                    Name,
                    AccountId,
                    Amount,
                    CurrencyIsoCode,
                    convertCurrency(Amount) usd_amount,
                    CloseDate,
                    CreatedDate,
                    Region__c,
                    IsClosed,
                    IsWon,
                    LastActivityDate,
                    LeadSource,
                    OwnerId,
                    Probability,
                    StageName,
                    Type,
                    IsDeleted
                        FROM Opportunity"
    
        #Retrieve Opp information
            as_tibble(RForcecom::rforcecom.query(session, soql))
    }
    

    它要求您从 Rforcecom.login 传入一个有效会话,但您似乎可以从上面的代码中使用该部分。

    希望对你有帮助……

    【讨论】:

    • 嘿!感谢您的详细回答 - 我非常熟悉 Salesforce API,想知道是否可以通过 SOQL 提取数据,甚至跨不同对象(例如自定义对象 B 的自定义字段 A 以及对象 D 的字段 C) ?在这种情况下,您的方法绝对是更好的解决方案。无论如何,我在 reticulate 包的帮助下实现了我的想法——我在 R 环境中执行 python 代码并将输出转换为我可以使用的数据框。最好的,安德烈
    • 所以,我不是 SOQL 方面的专家,但我知道足够危险。您可以在 SOQL 中跨不同对象编写 SQL 样式的联接,但 salesforce 还支持点概念,我发现它更容易在 SOQL 中导航多个对象。这是它的 salesforce API 参考。此外,如果您更愿意在 r 中工作,您可以将每个对象的数据单独下载并在 r 中进行操作。
    【解决方案4】:

    从 v0.2.0 开始,{salesforcer} R 包实现了 Salesforce Reports and Dashboards REST API。您可以执行和管理报表,而无需从头开始编写函数来拉取报表数据。以下是如何在您的组织中查找报告然后检索其数据的示例。您也可以只使用在 Salesforce 中查看报表时出现在 URL 栏中的报表 ID(在下面的屏幕截图中以红色突出显示)。

    # install.packages('salesforcer')
    library(dplyr, warn.conflicts = FALSE)
    library(salesforcer)
    
    # Authenticate using username, password, and security token ...
    sf_auth(username = "test@gmail.com", 
            password = "{PASSWORD_HERE}",
            security_token = "{SECURITY_TOKEN_HERE}")
    
    # ... or using OAuth 2.0 authentication
    sf_auth()
    
    # find a report in your org and run it
    all_reports <- sf_query("SELECT Id, Name FROM Report")
    this_report_id <- all_reports$Id[1]
    results <- sf_run_report(this_report_id)
    results
    

    【讨论】:

      猜你喜欢
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 2019-12-25
      • 1970-01-01
      相关资源
      最近更新 更多