diff --git a/pages/bare_metal_cloud/virtual_private_servers/n8n_sms/guide.fr-fr.md b/pages/bare_metal_cloud/virtual_private_servers/n8n_sms/guide.fr-fr.md new file mode 100644 index 00000000000..937ece72dad --- /dev/null +++ b/pages/bare_metal_cloud/virtual_private_servers/n8n_sms/guide.fr-fr.md @@ -0,0 +1,250 @@ +--- + +title: "Automatiser l'envoi de SMS avec n8n via l'API OVHcloud" +excerpt: "Découvrez comment envoyer des SMS depuis n8n en utilisant l'API OVHcloud." +updated: 2025-07-15 +--- + +## Objectif + +Ce guide vous explique comment intégrer l'API SMS d'OVHcloud dans **n8n**, afin d'envoyer automatiquement des SMS depuis vos workflows. Vous apprendrez à configurer un appel HTTP signé via l'API OVHcloud pour déclencher l'envoi d’un message. + +**Découvrez comment envoyer des SMS depuis n8n en utilisant l'API OVHcloud.** + +## Prérequis + +- Disposer d'un compte OVHcloud actif avec le service **SMS** activé +- Des identifiants API OVHcloud (application key, application secret, consumer key) +- Un numéro d’expéditeur (ex. : votre nom ou numéro valide déclaré dans le Manager OVHcloud) +- Un VPS, un serveur ou un poste local avec [n8n](https://n8n.io/) installé et accessible + +## En pratique + +Si vous n'avez pas encore installé N8N sur votre VPS, suivez les instructions de notre guide [Installer n8n sur un VPS OVHcloud](). + +### Étape 1 – Générer les identifiants API OVHcloud + +Avant de pouvoir envoyer des SMS via l’API OVHcloud, récupérez les trois identifiants suivants : + +- Application key +- Application secret +- Consumer key + +Consultez la section « Utilisation avancée : coupler les API OVHcloud avec une application » de notre guide [Premiers pas avec les API OVHcloud](/pages/manage_and_operate/api/first-steps) puis copiez et conservez les trois identifiants `Application key`, `Application secret` et `Consumer key`. + +### Étape 2 — Créer le workflow et les nœuds + +Schéma (dans cet ordre) : + +Connectez-vous à votre interface n8n puis cliquez sur le bouton **Create Workflow**. + +Créez les nœuds suivants (vides pour le moment) : + +- `Set - Credentials` : de type **Edit Fields (Set)** +- `Set - Request Details` : de type **Edit Fields (Set)** +- `Merge` : de type **Merge** +- `Sign - Generate Signature` : de type **Code** +- `SMS - Send` : de type **HTTP Request** + +Pour plus de détails concernant la création de nœud, consultez la [documentation officielle de n8n](https://docs.n8n.io/integrations/creating-nodes/overview/). + +Reliez les nœuds dans cet ordre : + +![N8N SMS](images/nodes.png){.thumbnail} + +Le nœud `Merge` reçoit les sorties des deux nœuds `Set - Credentials` et `Set - Request Details`, puis alimente `Sign - Generate Signature`, qui alimente `SMS - Send`. + +### Étape 3 — Paramétrer le nœud `Set – Credentials` + +Ajoutez les paramètres suivants dans votre nœud `Set - Credentials` : + +- Mode : `Manual Mapping`. + +| Nom | Valeur | +|---------------|--------------------------| +| applicationKey | "VOTRE_APPLICATION_KEY" | +| consumerKey | "VOTRE_CONSUMER_KEY" | +| serviceName | "sms-ovh-123456" | +| applicationSecret | "AS_xxxxxxxxxxxxx" | +| timestamp | {{ Math.floor(Date.now() / 1000) }} | + +### Étape 4 — Paramétrer le nœud `Set – Request Details` + +Paramétrez le nœud `Set - Request Details` : + +- Mode : `Manual Mapping`. +- Ajoutez un champ nommé `body` de type `Object` avec le contenu ci-dessous (exemple minimal). + +```json +{ + "charset": "UTF-8", + "coding": "7bit", + "message": "Message test", + "noStopClause": true, + "priority": "high", + "receivers": ["+33612345678"], + "sender": "SENDER" +} +``` + +Assurez-vous : + +- D'utiliser un numéro au format international (ex. : +336...). +- D'avoir défini votre expéditeur dans votre compte OVHcloud. Pour tester sans déclarer d'expéditeur, remplacez `"sender": "SENDER"` par `"senderForResponse": true`. + +### Étape 5 — Paramétrer le nœud `Merge` + +Paramétrez le nœud `Merge` : + +- Mode : `Combine`. +- Combine by : `Position`. +- Number of Inputs : `2`. + +Reliez `Set - Credentials` en **Input 1** et `Set - Request Details` en **Input 2**. +En sortie (output), vous devez avoir au même niveau : `applicationKey`, `applicationSecret`, `consumerKey`, `serviceName`, `timestamp` et `body`. + +### Étape 6 — Paramétrer le nœud `Sign – Generate Signature` + +Paramétrez le nœud `Sign - Generate Signature` : + +- Mode : `Run once for each item`. +- Language : `JavaScript`. + +Collez le code ci-dessous : + +```js +// --- SHA1 pur (pas HMAC) --- +function sha1(input) { + function rotl(n, s) { return (n << s) | (n >>> (32 - s)); } + function hex(v){ let s=''; for(let i=7;i>=0;i--) s+=((v >>> (i*4)) & 0xf).toString(16); return s; } + function utf8(str){ + str=str.replace(/\r\n/g,'\n'); + let out=''; for (let i=0;i>6)|192, (c&63)|128); + else out+=String.fromCharCode((c>>12)|224, ((c>>6)&63)|128, (c&63)|128); + } return out; + } + let i,j,A,B,C,D,E,temp,H0=0x67452301,H1=0xEFCDAB89,H2=0x98BADCFE,H3=0x10325476,H4=0xC3D2E1F0; + const W=new Array(80), m=utf8(input), ml=m.length, wa=[]; + for(i=0;i>>29); wa.push((ml<<3)&0x0ffffffff); + for(let bs=0; bs [!warning] +> +> N'utilisez pas de **HMAC** ici (OVH attend8 `"$1$" + SHA1(AppSecret + … + Timestamp)`). Le paramètre `bodyString` est **exactement** le JSON qui sera envoyé ensuite (pas d’autre `stringify`). L’URL signée doit être **strictement identique** à celle de l’envoi (même host, pas de `/` final en plus). + +### Étape 7 — Paramétrer le nœud `SMS - Send` + +Paramétrez le nœud `SMS - Send` : + +- Method : `POST`. +- URL : `{{$json.url}}`. +- Authentication : `None`. +- Send Headers : `ON`. +- Specify Headers : `Using fields below`. + +Ajoutez les paramètres de header suivants : + +| Nom | Valeur | +|---------------|--------------------------| +| Content-Type | application/json | +| X-Ovh-Application | {{$json.applicationKey}} | +| X-Ovh-Consumer | {{$json.consumerKey}} | +| X-Ovh-Timestamp | {{$json.timestamp}} | +| X-Ovh-Signature | {{$json.signature}} | + +Activez le `Send Body` et ajoutez les paramètres de body suivants : + +| Nom | Valeur | +|---------------|--------------------------| +| Body Content Type | Raw | +| Content Type | application/json | +| Body | {{$json.bodyString}} | + +### Tester votre workflow + +Exécutez votre workflow. Les étapes suivantes s'exécutent : + +1. Set - Credentials : met à disposition applicationKey, consumerKey, serviceName (et éventuellement applicationSecret si vous ne l’avez pas externalisé). +2. Set - Request Details : prépare l’objet body contenant le corps du SMS. +3. Merge (Combine/Position) : fusionne les deux sorties des nœuds précédents. +4. Sign - Generate Signature (Code) : calcule bodyString, timestamp, signature (SHA‑1 simple) et l’URL d’appel. +5. SMS - Send (HTTP Request) : envoie le POST vers l'URL avec le body {{$json.bodyString}} et les headers X-Ovh-*. + +Le message est alors transmis via l’API OVHcloud à votre destinataire. + +### Erreurs fréquentes + +#### **Invalid_signature (400)** + +- L’URL signée est différente de l'URL envoyée (host différent, `/` final en trop). +- Le body signé est différent du body envoyé (re-`stringify`, espaces, ordre, etc.). +- L'horloge locale est trop décalée. Utilisez plutôt l’heure serveur OVH (voir la partie [Industrialisation et sécurité](#industrialisation)). + +#### **Sms sender ... does not exist (403)** + +Le `sender` (expéditeur) n’est pas déclaré/validé dans votre espace client OVHcloud. Testez avec `senderForResponse: true` ou validez votre émetteur. + +#### **Bad Request** + +- Vérifiez dans chaque nœud le nom et la valeur de vos paramètres. +- Assurez-vous que les headers et les body soient complets. +- Vérifiez que l'URL du nœud Send - SMS respecte bien le format suivant : `https://eu.api.ovh.com/1.0/sms/sms-ab12345/jobs` + +#### **Erreurs de nœud Code** + +- N'utilisez pas de `require('crypto')` dans n8n mais plutôt **SHA-1 pur Javascript** ci-dessus. +- Utilisez le mode *par item* et évitez d'appeler `$input.all()` dans votre code. + +### Industrialisation et sécurité + +Si vous souhaitez industrialiser votre workflow et le sécuriser davantage, appliquez les conseils suivants. + +#### Heure serveur OVHcloud + +Ajoutez un nœud de type **HTTP Request** avant la signature : + +- `GET https://eu.api.ovh.com/1.0/auth/time` +- Récupérez la valeur et remplacez `timestamp` par cette valeur **exacte**. + +#### Ne pas faire transiter l’`applicationSecret` + +- Stockez-le comme **variable d’environnement** (ex. `OVH_APP_SECRET`) et lisez-le dans le nœud de type Code (Sign - Generate Signature) via `$env.OVH_APP_SECRET`, ou via la fonctionnalité **Secrets/Credentials** de n8n. +- À défaut, **ne retournez jamais** le secret en sortie du nœud. + +#### Gestion des caractères + +Si votre message contient des emojis/accents non GSM, utilisez `"coding": "ucs2"`. + +## Aller plus loin + +Échangez avec notre [communauté d'utilisateurs](/links/community). \ No newline at end of file diff --git a/pages/bare_metal_cloud/virtual_private_servers/n8n_sms/images/nodes.png b/pages/bare_metal_cloud/virtual_private_servers/n8n_sms/images/nodes.png new file mode 100644 index 00000000000..54217192532 Binary files /dev/null and b/pages/bare_metal_cloud/virtual_private_servers/n8n_sms/images/nodes.png differ diff --git a/pages/bare_metal_cloud/virtual_private_servers/n8n_sms/meta.yaml b/pages/bare_metal_cloud/virtual_private_servers/n8n_sms/meta.yaml new file mode 100644 index 00000000000..895e8e8954d --- /dev/null +++ b/pages/bare_metal_cloud/virtual_private_servers/n8n_sms/meta.yaml @@ -0,0 +1,3 @@ +id: 828aa026-4a8c-4351-93b2-d0b32dc0ee6c +full_slug: vps-n8n-sms +reference_category: bare-metal-cloud-virtual-private-servers-tutorials \ No newline at end of file