Erreur de création de post LinkedIn via nœud requête HTTP avec format texte

Décrivez le problème/l’erreur/la question

J’utilise des nœuds IA pour générer du texte à [publier sur mon LinkedIn, j’ai testé les identifiants en utilisant la requête HTTP GET donc je sais que ça fonctionne.
En essayant de créer la publication pour le texte généré par l’IA, j’obtiens constamment des erreurs telles que :
400 - “{"status":400,"code":"ILLEGAL_ARGUMENT","message":"Request body could not be converted to data map"}”
Message complet
422 - “{"message":"ERROR :: /## Audit Log Ingestion Lag\n\nImagine you’re trying to catch a thief who just left a store :: unrecognized field found but not allowed\nERROR :: /author :: field is required but not found and has no default value\nERROR :: /commentary :: field is required but not found and has no default value\nERROR :: /visibility :: field is required but not found and has no default value\nERROR :: /distribution :: field is required but not found and has no default value\nERROR :: /lifecycleState :: field is required but not found and has no default value\n","status":422}”

Veuillez partager votre workflow

Impossible de copier les nœuds, ne semble pas copier le texte (Edge sur Windows 11)
Les nœuds IA fonctionnent correctement, c'est juste la publication LinkedIn via requête HTTP qui ne fonctionne pas

Partagez la sortie renvoyée par le dernier nœud

422 - “{"message":"ERROR :: /## Audit Log Ingestion Lag\n\nImagine you’re trying to catch a thief who just left a store :: unrecognized field found but not allowed\nERROR :: /author :: field is required but not found and has no default value\nERROR :: /commentary :: field is required but not found and has no default value\nERROR :: /visibility :: field is required but not found and has no default value\nERROR :: /distribution :: field is required but not found and has no default value\nERROR :: /lifecycleState :: field is required but not found and has no default value\n","status":422}”

Informations sur votre configuration n8n

  • Version n8n : 2.30.0
  • Base de données (par défaut : SQLite) : par défaut
  • Paramètre n8n EXECUTIONS_PROCESS (par défaut : own, main) : par défaut
  • Exécution de n8n via (Docker, npm, n8n cloud, application de bureau) : Proxmox lxc
  • Système d’exploitation : Proxmox

Merci de nous avoir informés à ce sujet. Nous avons créé le ticket de développement interne CV-9 pour enquêter sur cette question.

OK, j’ai réussi à résoudre les problèmes, c’était l’API LinkedIn de publication qui exigeait l’ajout de certains champs dans le corps du message.

J’ai aussi découvert qu’il y a une limite de 4000 caractères lors de la publication via l’API.

Les deux erreurs pointent vers les deux mêmes causes racines, et elles sont corrigeables :

  1. L’erreur 400 « Request body could not be converted to data map » signifie que le corps JSON lui-même est invalide — votre texte IA est injecté brut, donc ses guillemets, sauts de ligne et caractères comme : et # cassent le JSON. Solution : réglez le corps de la requête HTTP en mode JSON et enveloppez le texte avec JSON.stringify pour qu’il soit échappé, par exemple la valeur commentary devient ={{ JSON.stringify($json.text) }} (supprimez les guillemets externes dans le modèle). Cela seul supprime l’erreur « converted to data map ».

  2. L’erreur 422 « field is required » (author, commentary, visibility, distribution, lifecycleState) signifie que vous publiez sur le nouvel endpoint /rest/posts mais envoyez un corps partiel. Cet endpoint exige TOUS ces champs. Un corps minimal fonctionnel :

{
“author”: “urn:li:person:XXXX”, // ou urn:li:organization:XXXX
“commentary”: “votre texte ici”,
“visibility”: “PUBLIC”,
“distribution”: {
“feedDistribution”: “MAIN_FEED”,
“targetEntities”: ,
“thirdPartyDistributionChannels”:
},
“lifecycleState”: “PUBLISHED”,
“isReshareDisabledByAuthor”: false
}

Et deux en-têtes que les gens oublient habituellement : LinkedIn-Version: 202401 (utilisez un YYYYMM actuel) et X-Restli-Protocol-Version: 2.0.0. Sans l’en-tête de version, LinkedIn rejette silencieusement le schéma.

Une dernière subtilité spécifique au champ commentary de /rest/posts : il utilise le format « Little Text » de LinkedIn, donc les caractères littéraux (, ), <, >, @, #, * et quelques autres doivent être échappés avec une barre oblique inverse ou la requête 422s. Si votre texte IA contient des en-têtes markdown (##) ou des parenthèses, supprimez-les ou échappez-les avant d’envoyer. Votre exemple de texte contenait ## et ::, ce qui est presque certainement ce qui l’a fait basculer.

Si vous collez la configuration exacte du nœud (URL de l’endpoint + les champs que vous envoyez), je peux pointer le morceau manquant spécifique.

Nous avons examiné cette question et nous ne pouvons pas confirmer qu’il s’agit d’un bug. Pour le moment, nous avons fermé le ticket interne, mais si cela commence à ressembler à un bug, notre équipe de modération le signalera à nouveau.

Bonne trouvaille ! Pour quiconque arrive ici avec le même problème, voici le corps minimum requis pour le point d’accès ugcPosts de LinkedIn :

{
  "author": "urn:li:person:YOUR_PERSON_ID",
  "lifecycleState": "PUBLISHED",
  "specificContent": {
    "com.linkedin.ugc.ShareContent": {
      "shareCommentary": {
        "text": "Your post text here"
      },
      "shareMediaCategory": "NONE"
    }
  },
  "visibility": {
    "com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC"
  }
}

À noter également : la limite de 4000 caractères s’applique au champ text. Si vous utilisez l’IA pour générer du contenu, ajoutez une vérification de longueur avant d’envoyer — sinon l’API rejettera simplement la requête en silence.