Appel curl d'un scénario de notification Telegram via API HTTP

Bonjour,

Il m’est venu en tête pour le fun, suite à l’excellent tuto de Spine sur le fail2ban, d’appeler mon scénario de notification Telegram via curl.
Ce scénario attend au moins 2 tags :

  • « qui » → destinataire
  • « message » → message.

Je n’y connais pas grande chose pour ne pas dire rien dans le formatage curl, donc pour le moment je n’incrimine pas le plugin Telegram (ou Telegram) dans mon soucis. Je verrai à modifier le tag si nécessaire.

Ma problématique est que « message » peut bien entendu contenir des espaces. Je ne peux donc pas utiliser la syntaxe de la doc API HTTP (en tout cas j’ai essayé mais cela n’a mené à rien).

J’ai créé cet appel curl :

curl -X POST http://192.168.1.20/core/api/jeeApi.php?apikey=xxxxxx -d type=scenario -d id=24 -d action=start -d tags='qui=ben message="toto1 toto2"'

Avec cette syntaxe j’arrive bien à passer « toto1 toto2 » au scénario.
Le tag apparaît sous cette forme, avec la double-quote échappée :

[SCENARIO] Start : Execution provoquee par un appel API . Tags : {"#qui#":"ben","#message#":"\"toto1 toto2\""}

Mais dans Telegram je reçois :

"toto1 toto2"

ce qui est cohérent avec le lot de Telegram qui indique dans le log :

[text] => "toto1 toto2"  

Y-a-t-il une astuce de syntaxe qui m’échappe ? Faut-il que je passe en API JSON ?
Ou bien la raison de mon problème vient-il du plugin Telegram (ou de Telegram) ?

1 « J'aime »

Salut,

Quand on passe de la data dans un paramètre du querystring, on doit faire un « encodage url » dessus (urlencode) pour justement éviter tous les caractères qui sont utilisés par ailleurs dans une URL.
(Espace sera transformé en %20, le = en %3D etc)

Si on utilise les méthodes prévues pour, curl fait cela pour nous mais si tu lui passes directement une URL final alors il ne peut pas savoir si c’est déjà encodé ou pas donc il ne va pas le refaire (avoir un double urlencode est un problème)

Donc soit tu encodes toi même les paramètres avant de générer l’url soit tu passes les paramètres explicitement et curl le fera, ce qui est la bonne solution à mon avis.

Je n’ai pas la syntaxe de tête pour utilisation en script bash (ce que tu fais je suppose) et je suis sur mobile mais une petite recherche sur le net et tu trouveras l’info, par exemple: bash - How to urlencode data for curl command? - Stack Overflow

Donc recevoir le message avec les guillemets dans telegram est le comportement normal et attendu vu l’exemple

1 « J'aime »

Salut,

Merci pour ta réponse.
Je n’ai pas compris la moitié mais je pense avoir globalement compris le sens :sweat_smile:

Je vais réaliser de nouveaux tests (en bash en effet) en m’appuyant sur le lien que tu as fourni.
Je ferai un retour :blush:

Salut,

Je me suis battu, probablement pas de la bonne façon, mais j’ai trouvé une façon d’arriver à mes fins :wink:

Mon Telegram étant par défaut en html, j’ai encodé les espaces en html (et aussi l’apostrophe tant qu’à faire).

Du coup dans le /action.d/jeedom.conf de fail2ban j’ai utilisé cette ligne curl :

curl -X POST http://192.168.1.20/core/api/jeeApi.php?apikey=xxxx -d type=scenario -d id=24 -d action=start --data-urlencode "tags=qui=ben message=L&#039;IP&#160;<ip>&#160;vient&#160;d'être&#160;bannie&#160;après&#160;<failures>&#160;tentative(s)&#160;contre&#160;<name>."

avec comme résultat dans le log de mon scénario de notification :

Start : Execution provoquee par un appel API . Tags : {"#qui#":"ben","#message#":"L&#039;IP&#160;66.249.XX.XX&#160;vient&#160;d'\u00eatre&#160;bannie&#160;apr\u00e8s&#160;1&#160;tentative(s)&#160;contre&#160;apache-multiport."}

Par contre, je me rappelle qu’on m’avait appris il y a très longtemps (le développement web était à ses balbutiements) qu’il était préférable de ne pas utiliser les espaces en séparateur de variables pour éviter ce type de problème (aka « les espaces ce n’est pas un vrai caractère »). Or, dans le cas de « tags » pour l’API HTTP scénario c’est ce qui est utilisé pour séparer les différents tags.

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.