{"id":904,"date":"2020-01-11T14:38:00","date_gmt":"2020-01-11T13:38:00","guid":{"rendered":"http:\/\/wollef.org\/?p=904"},"modified":"2020-01-11T14:38:00","modified_gmt":"2020-01-11T13:38:00","slug":"communiquer-avec-salesforce-en-python","status":"publish","type":"post","link":"https:\/\/wollef.org\/blog\/communiquer-avec-salesforce-en-python\/","title":{"rendered":"Raspberry Cars &#8211; Les Technos (4\/4) &#8211; Communiquer avec Salesforce en Python"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\"><a>Acc\u00e9der \u00e0 SF avec des APIs<\/a><\/h1>\n\n\n\n<p>Dans le travail\npersonnel pr\u00e9c\u00e8dent, tous les programmes \u00e9taient dans Salesforce et communiqu\u00e9\navec les serveurs de Mercedes (les programmes Salesforce appelaient les API\nMercedes). <\/p>\n\n\n\n<p>Dans ce Travail\npersonnel il faut d\u00e9velopper des programmes qui tournent sur le Raspberry Pi et\nqui vont envoyer des donn\u00e9s sur Salesforce. Ces programmes en Python vont\ndevoir appeler le API Salesforce.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\"><a>La librairie Simple Salesforce<\/a><\/h1>\n\n\n\n<p>Pour faciliter\nl\u2019utilisation des API de Salesforce en Python, des d\u00e9veloppeurs on cr\u00e9er une\nlibrairie Python&nbsp;: Simple Salesforce<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>Simple Salesforce is a basic Salesforce.com REST API client built for Python 2.6, 2.7, 3.3, 3.4, 3.5, and 3.6. The goal is to provide a very low-level interface to the REST Resource and APEX API, returning a dictionary of the API JSON response.<\/p><\/blockquote>\n\n\n\n<p>Cette librairie est disponible sur le site suivant&nbsp;:\n<a href=\"https:\/\/pypi.org\/project\/simple-salesforce\/\">https:\/\/pypi.org\/project\/simple-salesforce\/<\/a><\/p>\n\n\n\n<p>Pour trouver\ncomment utiliser cette librairie cette article est aussi int\u00e9ressant&nbsp;: <a href=\"https:\/\/towardsdatascience.com\/using-python-to-get-salesforce-data-97bb5a7ef2cf\">https:\/\/towardsdatascience.com\/using-python-to-get-salesforce-data-97bb5a7ef2cf<\/a><\/p>\n\n\n\n<p>Pour installer la\nlibrairie Python sur le Raspberry il suffit de taper&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>pip3 install simple-salesforce\n\n<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/sf1.png\" alt=\"\" class=\"wp-image-905\" width=\"727\" height=\"230\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\"><a>Se connecter aux API Salesforce<\/a><\/h1>\n\n\n\n<p>Pour se connecter \u00e0\nSalesforce avec les API il faut&nbsp;: user ID, un mot de passe, mais aussi un\ntoken.<\/p>\n\n\n\n<p>Pour obtenir ce token, il faut se connecter \u00e0 la GUI Salesforce avec son utilisateur et son mot de passe, et aller dans les settings demander \u00e0 recevoir le token par email. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/sf2.png\" alt=\"\" class=\"wp-image-906\"\/><\/figure>\n\n\n\n<p>On re\u00e7oit alors le token dans un email&nbsp;:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p><strong>Von:<\/strong>\u00a0&#8220;support@emea.salesforce.com&#8221; &lt;support@emea.salesforce.com><br \/> <strong>Datum:<\/strong>\u00a011. Januar 2020 um 1:45:07 PM MEZ<br \/> <strong>An:<\/strong>\u00a0&#8220;thibault.leblond@icloud.com&#8221; &lt;thibault.leblond@icloud.com><br \/> <strong>Betreff:<\/strong>\u00a0<strong>Your new Salesforce security token<\/strong><\/p><p>We&#8217;ve sent you a new Salesforce security token because you recently changed your password or requested to reset your security token. Use this updated security token with API or desktop clients that require it.<br \/> <br \/> Username: thibault.leblond@wollef.org<br \/> Security token (case-sensitive): uEGXRLd\u2026..Kef2mZANC<br \/> <br \/> For more information on using your security token, see Reset Your Security Token at https:\/\/help.salesforce.com\/HTViewHelpDoc?id=user_security_token.htm.<\/p><\/blockquote>\n\n\n\n<p>Pour se connecter depuis Python, on doit appeler la m\u00e9thode de connexion avec ces informations\u00a0:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sf = Salesforce(\n    username='thibault.leblond@wollef.org',\n    password=XXXXXXX,\n    security_token='uEGXRLdy\u2026Kef2mZANC'\n); <\/code><\/pre>\n\n\n\n<p>Voici le r\u00e9sultat dans l\u2019IDE Python sur le Raspberry\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/SF22.png\" alt=\"\" class=\"wp-image-907\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\"><a>Lire les donn\u00e9es<\/a><\/h1>\n\n\n\n<p>Dans le Travail pr\u00e9c\u00e8dent on a vu comment interroger Salesforce pour trouver des donn\u00e9es avec SOQL. \u00a0Par exemple, pour connaitre la liste des voitures enregistr\u00e9s dans la base, la requ\u00eate SOQL est\u00a0: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT Id, Name, Car_Number__c FROM Car__c<\/code><\/pre>\n\n\n\n<p>Voici ce que donne la requ\u00eate SOQL quand on la lance dans la console de Salesforce.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/sf4.png\" alt=\"\" class=\"wp-image-908\"\/><\/figure>\n\n\n\n<p>Ave la librairie simple Salesforce pour ex\u00e9cuter la requ\u00eate SOQL depuis Python, on utilise le code suivant<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cars= sf.query_all(\"SELECT Id, Name, Car_number__c FROM Car__c \");<\/code><\/pre>\n\n\n\n<p>Puis on peut afficher le r\u00e9sultat obtenu avec\u00a0:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>print(cars) ;<\/code><\/pre>\n\n\n\n<p>Voici le r\u00e9sultat dans l\u2019IDE Python sur le Raspberry\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/sf5.png\" alt=\"\" class=\"wp-image-909\"\/><\/figure>\n\n\n\n<p>Le r\u00e9sultat n\u2019est\npas facile \u00e0 lire, il faut donc trouver un moyen d\u2019acc\u00e9der aux\ninformations&nbsp; de chaque voiture.<\/p>\n\n\n\n<p>On r\u00e9cup\u00e8re donc la\nr\u00e9ponse&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>response= sf.query_all(\"SELECT Id, Name, Car_number__c FROM Car__c \");<\/code><\/pre>\n\n\n\n<p>On acc\u00e8de aux voitures (les records) dans la r\u00e9ponse&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cars = response&#91;'records']<\/code><\/pre>\n\n\n\n<p>On boucle sur les voitures et on affiche leur ID, leur nom, et leur num\u00e9ro\u00a0:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>for car in cars:\n   print(\"ID\",   car&#91;\"Id\"] );\n   print(\"Name\", car&#91;\"Name\"] );\n   print(\"Number\", car&#91;\"Car_number__c\"] );\n   print('');<\/code><\/pre>\n\n\n\n<p>Voici le r\u00e9sultat dans l\u2019IDE Python sur le Raspberry\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/sf7.png\" alt=\"\" class=\"wp-image-910\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\"><a>Ecrire des donn\u00e9es<\/a><\/h1>\n\n\n\n<p>Dans le cadre du\nprojet le programme Python devra \u00e9galement cr\u00e9er des donn\u00e9es dans Salesforce.<\/p>\n\n\n\n<p>Teston simplement\ncomment cr\u00e9er une voiture (Custom object SF&nbsp;: Car__c) &nbsp;dans Salesforce avec l\u2019API Simple Salesforce&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sf.Car__c.create({'Name':'My Raspberry Car !!!', 'Car_number__c':'RC 1234'})<\/code><\/pre>\n\n\n\n<p>Voici le r\u00e9sultat dans l\u2019IDE Python sur le Raspberry\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/sf8.png\" alt=\"\" class=\"wp-image-911\"\/><\/figure>\n\n\n\n<p>Il ne se passe rien\nde visible &nbsp;;-).<\/p>\n\n\n\n<p>En effet, il faut retourner voir avec le programme pr\u00e9c\u00e9dent (la liste des voitures) si la nouvelle voiture est bien l\u00e0\u00a0! Et c\u2019est le cas\u00a0!<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/sf9.png\" alt=\"\" class=\"wp-image-912\"\/><\/figure>\n\n\n\n<p>On peut aussi aller v\u00e9rifier dans la console Salesforce que l\u2019objet a bien \u00e9t\u00e9 cr\u00e9\u00e9 par l\u2019appel \u00e0 l\u2019API. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/sf10.png\" alt=\"\" class=\"wp-image-913\"\/><\/figure>\n\n\n\n<p>Ou m\u00eame aller regarder dans la GUI utilisateur Salesforce\u00a0:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"http:\/\/wollef.org\/wp-content\/uploads\/2020\/01\/sf11.png\" alt=\"\" class=\"wp-image-914\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\"><a>Utilisation dans le projet de l\u2019API simple salesforce<\/a><\/h1>\n\n\n\n<p>On a test\u00e9 avec un objet simple qu\u2019on peut lire et \u00e9crire\ndepuis Python depuis le Raspberry PI. Pour le projet principale on devra\nmanipuler beaucoup plus d\u2019objet mais le principe restera le m\u00eame.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Acc\u00e9der \u00e0 SF avec des APIs Dans le travail personnel pr\u00e9c\u00e8dent, tous les programmes \u00e9taient dans Salesforce et communiqu\u00e9 avec les serveurs de Mercedes (les programmes Salesforce appelaient les API Mercedes). Dans ce Travail personnel il faut d\u00e9velopper des programmes qui tournent sur le Raspberry Pi et qui vont envoyer des donn\u00e9s sur Salesforce. Ces <a class=\"read-more\" href=\"https:\/\/wollef.org\/blog\/communiquer-avec-salesforce-en-python\/\">Continue Reading<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[31,16,17,18,20],"tags":[],"class_list":["post-904","post","type-post","status-publish","format-standard","hentry","category-raspberry-cars","category-python","category-raspberry-pi","category-salesforce","category-soql"],"_links":{"self":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/posts\/904","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/comments?post=904"}],"version-history":[{"count":0,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/posts\/904\/revisions"}],"wp:attachment":[{"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/media?parent=904"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/categories?post=904"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wollef.org\/blog\/wp-json\/wp\/v2\/tags?post=904"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}