[PYTHON] Obtenir des données Salesforce à l'aide de l'API REST

introduction

Après avoir lu cet article jusqu'au bout, vous pourrez:

--Définir l'API Salesforce (Activer les paramètres OAuth)

Exemple de code

python_sfdc_get_user.py


sf = Salesforce(username=USERNAME, password=PASSWORD,
                security_token=SECURITY_TOKEN, sandbox=False)
res = sf.query(
    'SELECT Id, Name, LastLoginDate FROM User WHERE Name =\'nsuhara\'')
print(json.dumps(res, indent=4))

«Résultat de l’exécution»

python_result.json


{
    "totalSize": 1,
    "done": true,
    "records": [
        {
            "attributes": {
                "type": "User",
                "url": "/services/data/v38.0/sobjects/User/0056F000006StK9QAK"
            },
            "Id": "0056F000006StK9QAK",
            "Name": "nsuhara",
            "LastLoginDate": "2019-05-18T13:07:00.000+0000"
        }
    ]
}

Articles Liés

Environnement d'exécution

environnement Ver. Note
macOS Mojave 10.14.4 OS
Salesforce Spring'19 SaaS
Python 3.7.3 Python
simple-salesforce 0.74.2 Python
requests 2.22.0 Python
Java 1.8.0_192 Java
httpclient 4.5.6 Java
json 20180813 Java
jackson-databind 2.9.8 Java

Code source

Je pense que vous pouvez approfondir votre compréhension en suivant réellement le contenu de l'implémentation et le code source. Veuillez l'utiliser par tous les moyens.

GitHub

Préparation préalable

Paramètres Salesforce OAuth

Paramètres> Créer> Applications> Applications connectées> Cliquez sur Nouveau

nom de l'article Définir la valeur
Nom de l'application connectée Sample
Nom de référence de l'API Sample
Email du contact [email protected]
Activer les paramètres OAuth TRUE
URL de rappel https://sample.auth0.com/login/callback
Plage OAuth sélectionnée Accès aux informations de base
Secret de flux du serveur Web requis TRUE
スクリーンショット 2018-12-19 23.42.27.png

`Veuillez attendre 2 à 10 minutes pour que les modifications prennent effet sur le serveur avant d'utiliser l'application connectée. ''

Aperçu des paramètres

Nom de variable La description Remarques
HOST Production: login.salesforce.com, Sandbox: test.salesforce.com
CLIENT_ID La clé du consommateur Référence 1
CLIENT_SECRET Secret du consommateur Référence 1
USERNAME Nom d'utilisateur Salesforce
PASSWORD Mot de passe Salesforce
SECURITY_TOKEN Jeton de sécurité Salesforce Référence 2
PASSWORD_AND_SECURITY_TOKEN Mot de passe Salesforce+Jeton de sécurité

** (Référence 1) **

スクリーンショット 2018-12-20 0.29.33.png

** (Réf 2) **

Les jetons de sécurité peuvent être réémis à partir de Mes paramètres> Personnel> Réinitialiser mon discours de sécurité.

スクリーンショット 2018-12-20 0.43.24.png

Exemple de script Shell

shell_script_sfdc_get_user.sh


#!/bin/sh

export HOST='<Référence des paramètres>'
export CLIENT_ID='<Référence des paramètres>'
export CLIENT_SECRET='<Référence des paramètres>'
export USERNAME='<Référence des paramètres>'
export PASSWORD_AND_SECURITY_TOKEN='<Référence des paramètres>'

export INSTANCE_URL=`curl -s https://$HOST/services/oauth2/token -d "grant_type=password" -d "client_id=$CLIENT_ID" -d "client_secret=$CLIENT_SECRET" -d "username=$USERNAME" -d "password=$PASSWORD_AND_SECURITY_TOKEN" | awk 'BEGIN{FS="instance_url\":"}{print $2}' | awk 'BEGIN{FS=","}{print $1}' | sed -e 's/\"//g'`
export ACCESS_TOKEN=`curl -s https://$HOST/services/oauth2/token -d "grant_type=password" -d "client_id=$CLIENT_ID" -d "client_secret=$CLIENT_SECRET" -d "username=$USERNAME" -d "password=$PASSWORD_AND_SECURITY_TOKEN" | awk 'BEGIN{FS="access_token\":"}{print $2}' | awk 'BEGIN{FS=","}{print $1}' | sed -e 's/\"//g'`

export SOQL="SELECT+Id,Name,LastLoginDate+FROM+User+WHERE+Name='nsuhara'"

curl $INSTANCE_URL/services/data/v45.0/query?q=$SOQL -H "Authorization: OAuth $ACCESS_TOKEN" -H "X-PrettyPrint:1"

shell_script_result.json


{
    "totalSize": 1,
    "done": true,
    "records": [
        {
            "attributes": {
                "type": "User",
                "url": "/services/data/v45.0/sobjects/User/0056F000006StK9QAK"
            },
            "Id": "0056F000006StK9QAK",
            "Name": "nsuhara",
            "LastLoginDate": "2019-05-18T14:04:05.000+0000"
        }
    ]
}

Échantillon Python

python_sfdc_get_user.py


import json

from simple_salesforce import Salesforce

USERNAME = '<Référence des paramètres>'
PASSWORD = '<Référence des paramètres>'
SECURITY_TOKEN = '<Référence des paramètres>'


def main():
    sf = Salesforce(username=USERNAME, password=PASSWORD,
                    security_token=SECURITY_TOKEN, sandbox=False)
    res = sf.query(
        'SELECT Id, Name, LastLoginDate FROM User WHERE Name =\'nsuhara\'')
    print(json.dumps(res, indent=4))


if __name__ == '__main__':
    main()

python_result.json


{
    "totalSize": 1,
    "done": true,
    "records": [
        {
            "attributes": {
                "type": "User",
                "url": "/services/data/v38.0/sobjects/User/0056F000006StK9QAK"
            },
            "Id": "0056F000006StK9QAK",
            "Name": "nsuhara",
            "LastLoginDate": "2019-05-18T14:06:19.000+0000"
        }
    ]
}

Échantillon Java

java_App.java


package rest_api;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicHeader;
import org.apache.http.util.EntityUtils;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class App {
    static final String HOST = "<Référence des paramètres>";
    static final String CLIENT_ID = "<Référence des paramètres>";
    static final String CLIENT_SECRET = "<Référence des paramètres>";
    static final String USERNAME = "<Référence des paramètres>";
    static final String PASSWORD_AND_SECURITY_TOKEN = "<Référence des paramètres>";

    static final String GRANT_SERVICE = "/services/oauth2/token?grant_type=password";

    public static void main(String[] args) {
        String UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36";
        List<Header> headers = new ArrayList<Header>();
        headers.add(new BasicHeader("User-Agent", UA));

        HttpClient httpClient = HttpClientBuilder.create().setDefaultHeaders(headers).build();

        String loginURL = "https://" + HOST + GRANT_SERVICE + "&client_id=" + CLIENT_ID + "&client_secret="
                + CLIENT_SECRET + "&username=" + USERNAME + "&password=" + PASSWORD_AND_SECURITY_TOKEN;

        HttpPost httpPost = new HttpPost(loginURL);
        HttpResponse response = null;

        try {
            response = httpClient.execute(httpPost);
        } catch (ClientProtocolException cpException) {
            // Handle protocol exception
        } catch (IOException ioException) {
            // Handle system IO exception
        }

        final int statusCode = response.getStatusLine().getStatusCode();
        if (statusCode != HttpStatus.SC_OK) {
            System.out.println("Error authenticating to Force.com: " + statusCode);
            // Error is in EntityUtils.toString(response.getEntity())
            return;
        }

        String getResult = null;
        try {
            getResult = EntityUtils.toString(response.getEntity());
        } catch (IOException ioException) {
            // Handle system IO exception
        }

        JSONObject jsonObject = null;
        String loginAccessToken = null;
        String loginInstanceUrl = null;

        try {
            jsonObject = (JSONObject) new JSONTokener(getResult).nextValue();
            loginInstanceUrl = jsonObject.getString("instance_url");
            loginAccessToken = jsonObject.getString("access_token");
        } catch (JSONException jsonException) {
            // Handle JSON exception
        }

        System.out.println(response.getStatusLine());

        httpPost.releaseConnection();
        try {
            final URIBuilder builder = new URIBuilder(loginInstanceUrl);
            final String SOQL = "SELECT Id, Name, LastLoginDate FROM User WHERE Name = \'nsuhara\'";
            builder.setPath("/services/data/v45.0/query/").setParameter("q", SOQL);
            final HttpGet get = new HttpGet(builder.build());
            get.setHeader("Authorization", "Bearer " + loginAccessToken);

            final HttpResponse queryResponse = httpClient.execute(get);

            ObjectMapper mapper = new ObjectMapper();
            final JsonNode queryResults = mapper.readValue(queryResponse.getEntity().getContent(), JsonNode.class);

            System.out.println("queryResults:" + queryResults);
        } catch (Exception e) {
            // Handle exception
        }
    }
}

java_result.json


{
    "totalSize": 1,
    "done": true,
    "records": [
        {
            "attributes": {
                "type": "User",
                "url": "/services/data/v45.0/sobjects/User/0056F000006StK9QAK"
            },
            "Id": "0056F000006StK9QAK",
            "Name": "nsuhara",
            "LastLoginDate": "2019-05-18T14:09:31.000+0000"
        }
    ]
}

Exemple d'implémentation de service Web REST

Implémentation Apex

apex_SampleRestApi.cls


@RestResource(urlMapping='/sample/restapi/*')
global without sharing class SampleRestApi {
	@HttpGet
	global static List<User> getUsers() {
		return [SELECT Id, Name, LastLoginDate FROM User WHERE Name = 'nsuhara' LIMIT 1];
	}
}

Service Apex REST activé

Paramètres> Gérer les utilisateurs> Jeu de privilèges (ou profil)> Modifier Privilège système

スクリーンショット 2019-05-19 0.17.52.png

Activer l'accès aux classes Apex

Paramètres> Gérer les utilisateurs> Ensemble d'autorisations (ou profil)> Modifier l'accès aux classes Apex`

スクリーンショット 2019-05-19 0.18.41.png

Test GET de la méthode HTTP

python_requests_sfdc.py


import requests

HOST = '<Référence des paramètres>'
CLIENT_ID = '<Référence des paramètres>'
CLIENT_SECRET = '<Référence des paramètres>'
USERNAME = '<Référence des paramètres>'
PASSWORD_AND_SECURITY_TOKEN = '<Référence des paramètres>'


def main():
    params = {
        'grant_type': 'password',
        'client_id': CLIENT_ID,
        'client_secret': CLIENT_SECRET,
        'username': USERNAME,
        'password': PASSWORD_AND_SECURITY_TOKEN
    }

    res_post = requests.post(
        'https://{}/services/oauth2/token'.format(HOST), params=params)

    access_token = res_post.json().get('access_token')
    instance_url = res_post.json().get('instance_url')
    services_url = '/services/apexrest/sample/restapi'
    headers = {
        'Content-type': 'application/json',
        'Accept-Encoding': 'gzip',
        'Authorization': 'Bearer {}'.format(access_token)
    }

    res_get = requests.request(method='get', url=instance_url+services_url,
                               headers=headers, params={'xxx': 'yyy'}, timeout=10)

    print(res_get.status_code)
    print(res_get.json())


if __name__ == '__main__':
    main()

python_result.json


[
    {
        "attributes": {
            "type": "User",
            "url": "/services/data/v45.0/sobjects/User/0056F000006StK9QAK"
        },
        "Id": "0056F000006StK9QAK",
        "Name": "nsuhara",
        "LastLoginDate": "2019-05-18T14: 11: 22.000+0000"
    }
]

Résumé-Examen du modèle de mise en œuvre

Considérez le modèle de mise en œuvre en fonction de l'environnement et des conditions

No. Conditions d'examen Modèle d'implémentation échantillon
1 Si un package pour Salesforce est disponible Implémenter à l'aide d'un package Échantillon Python
2 Lorsque le résultat de l'exécution de SOQL est suffisant Implémenter à l'aide d'une requête HTTP Exemple de script Shell,Échantillon Java
3 Autre que ce qui précède Implémenter les services Web Apex REST Exemple d'implémentation de service Web REST

Recommended Posts

Obtenir des données Salesforce à l'aide de l'API REST
Obtenez des données LEAD à l'aide de l'API REST de Marketo en Python
Obtenez des données Amazon à l'aide de Keep API # 1 Obtenez des données
Obtenez des données Youtube en Python à l'aide de l'API Youtube Data
Collecte de données FX à l'aide de l'API REST OANDA
[Python] Obtenez tous les commentaires à l'aide de Youtube Data Api
Comment obtenir des données d'article à l'aide de l'API Qiita
[Python] Obtenez des données insight à l'aide de l'API Google My Business
Acquisition de données à l'aide de l'API googlemap de python
Obtenez des données à l'aide de l'API du ministère des Affaires intérieures et des Communications
Mémo d'acquisition de données à l'aide de l'API Backlog
Obtenez des données de Twitter avec Tweepy
[Python] J'ai essayé d'obtenir diverses informations en utilisant l'API de données YouTube!
J'ai essayé d'utiliser l'API de données YOUTUBE V3
Recevoir des e-mails à l'aide de l'API Gmail en Java
Obtenez les données de l'API Google Fit en Python
Créer une feuille de calcul Google à l'aide de l'API Python / Google Data
Connaissance de l'utilisation de l'API de données Aurora Severless
Golang api obtenir
Créons une API REST en utilisant SpringBoot + MongoDB
Obtenir l'URL de l'image à l'aide de l'API Flickr en Python
Obtenez des données sur le cours de l'action avec l'API Quandl [Python]
Obtenez des données via l'API Salesforce (API en masse) en Python et chargez-les dans BigQuery
[Rails] Comment obtenir des informations de localisation à l'aide de l'API de géolocalisation
Analyse des données à l'aide de xarray
Obtenez des données Amazon RDS (PostgreSQL) à l'aide de SQL avec pandas
Nettoyage des données 2 Nettoyage des données à l'aide de DataFrame
Nettoyage des données à l'aide de Python
J'ai essayé APN (notification à distance) à l'aide de l'API REST Parse.com
Obtenez une liste des comptes GA, des propriétés et des vues sous forme de données verticales à l'aide de l'API
Créer un pseudo serveur d'API REST à l'aide de pages GitHub
Obtenez des commentaires et des abonnés avec l'API de données YouTube
J'ai essayé d'utiliser l'API de Sakenowa Data Project
Obtenez des données compressées par Gzip en mémoire
Recevez des tweets avec des mots-clés arbitraires à l'aide de l'API Streaming de Twitter
J'ai essayé de rechercher des vidéos à l'aide de l'API de données Youtube (débutant)
Comment réinitialiser le mot de passe via l'API à l'aide du framework Rest Django
Appuyez sur REST en Python pour obtenir des données de New Relic
Obtenez des données de l'API d'analyse avec le client API Google pour python
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
Obtenez le nom du produit et le prix le plus bas à l'aide de l'API Amazon Product Advertising
Obtenez la météo en utilisant l'API et laissez Raspberry Pi parler!
Jouez avec l'API de données YouTube v3 à l'aide du client Python de l'API Google
J'ai essayé d'obtenir rapidement des données d'AS / 400 en utilisant pypyodbc
Obtenir les données structurelles de CHEMBLID
Tester l'API CloudStack à l'aide du simulateur
Reconnaissance de l'âge à l'aide de l'API de Pepper
Obtenir des publications similaires en utilisant Doc2Vec
Sélectionnez des fonctionnalités avec des données textuelles
Obtenez des données Youtube avec python
Essayez d'utiliser l'API Twitter
Mettre en ligne des vidéos à l'aide de l'API YouTube
Obtenir des informations avec l'API Zabbix
Essayez d'utiliser l'API Twitter
Méthode de visualisation de données utilisant matplotlib (1)
Obtenir des informations GitHub à l'aide de PyGithub
Essayez d'utiliser l'API PeeringDB 2.0
Méthode de visualisation de données utilisant matplotlib (2)
Utilisez configparser lors de l'utilisation de l'API