Salesforce: загрузка отчетов через URL в R - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь загрузить отчеты, доступные в Salesforce, по URL, например,

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

в Р.

Я уже провел некоторое исследование, чтобы получить доступ к отчету через 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-фрагмент:

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))

Ответы [ 3 ]

0 голосов
/ 20 мая 2019

В вашем примере, я не думаю, что вы можете использовать сеанс rforcecom с httr функциями, как вы пытаетесь.

Вот немного другой способ решения проблемы.

Вместо того, чтобы пытаться получить отчет, который вы уже создали в Salesforce, почему бы не указать отчет в SOQL и использовать функцию rforcecom.query для выполнения SOQL из r. Это вернет данные в фрейм данных и не потребует дальнейшей обработки данных в 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, но, похоже, эта часть работает из кода выше.

Надеюсь, это поможет ...

0 голосов
/ 10 июля 2019

Я недавно боролся с той же проблемой, есть магический параметр, который нужно добавить в запрос: isdtp = p1

так что если вы попробуете: http://YOURInstance.my.salesforce.com/012389u13541?export=1&enc=UTF-8&xf=csv&isdtp=p1

он должен вернуть вам файл напрямую.

0 голосов
/ 16 мая 2019

Вы уверены, что у вас есть действительный идентификатор отчета?Это не выглядит правильным (Вы только запутали это для целей этого поста?).Что в том HTML, который вы получаете, сообщение об ошибке?Экран входа в систему SF?

То, что вы делаете, - это фактически "очистка экрана".Это не настоящий API, он может сломаться в любое время, вы должны найти / построить что-то, что правильно использует Salesforce Analytics API .Вас предупредили.

Но если вы ищете быстрое и грязное решение ...

Вам нужно сделать вид, что вы авторизованный пользователь, что у вас есть действительный идентификатор сеанса,Добавьте куки в ваш запрос GET.

Как получить действительный идентификатор сеанса?

  • Сначала вам необходимо войти в SF (например, используйте логин SOAP API вызов или я в спискеВот некоторые идеи REST API: https://stackoverflow.com/a/56034159/313628)
  • или отображение идентификатора сеанса какого-либо пользователя в формуле SF , страница visualforce , и пользователь скопирует и вставит его в ваше приложение.

Как только он у вас есть - добавьте заголовок Cookie в GET со значением sid=<session id goes here>

Вот необработанный запрос и ответ в SoapUI.

enter image description here

...