Aller au contenu

Notifications Signal API

Aperçu

Vous avez besoin d’un compte Signal et de l’application Signal pour iOS ou Android.

Vous devez également configurer le service API REST Signal.

Une configuration simple pourrait ressembler à ceci :

Fenêtre de terminal
# Créer un répertoire pour y stocker notre configuration
mkdir -p $HOME/.signal-api
# Lancer une instance Signal API qui écoute sur le port 9922
docker run -d --name signal-api --restart=always -p 9922:8080 \
-v $HOME/.signal-api:/home/.local/share/signal-cli \
-e 'MODE=native' -e SIGNAL_CLI_UID=$(id -u) -e SIGNAL_CLI_GID=$(id -g) \
bbernhard/signal-cli-rest-api

Si tout se passe bien, vous devriez pouvoir pointer votre navigateur vers : http://localhost:9922/v1/qrcodelink?device_name=signal-api et, depuis l’application de votre téléphone, suivre les instructions pour ajouter un Linked Device.

Le {FromPhoneNo} doit être le numéro associé à votre compte.

La syntaxe valide est la suivante :

  • signal://{user}:{password}@{hostname}/{from_phone}
  • signal://{user}:{password}@{hostname}:{port}/{from_phone}
  • signal://{user}:{password}@{hostname}/{from_phone}/{target}
  • signal://{user}:{password}@{hostname}:{port}/{from_phone}/{target}

Vous pouvez publier dans plusieurs conversations en les enchaînant simplement à la fin de l’URL.

  • signal://{user}:{password}@{hostname}:{port}/{from_phone}/{target1}/{target2}/{target3}
  • signals://{user}:{password}@{hostname}:{port}/{from_phone}/{target1}/{target2}/{target3}
VariableRequisDescription
hostnameOuiLe nom d’hôte du serveur Web
portNonLe port sur lequel notre serveur Web est en écoute. Par défaut, le port est 80 pour signal:// et 443 pour toutes les références signals://.
userNonSi votre système est configuré pour utiliser HTTP-AUTH, vous pouvez fournir le nom d’utilisateur pour l’authentification.
passwordNonSi votre système est configuré pour utiliser HTTP-AUTH, vous pouvez fournir le mot de passe pour l’authentification.
fromOuiIl doit s’agir d’un numéro de téléphone expéditeur que vous avez ajouté au service API.
to*NonUn numéro de téléphone ou un identifiant de groupe auquel vous souhaitez envoyer votre notification. Si aucun n’est spécifié, le champ from est utilisé à la place.
batchNonEnvoyer plusieurs notifications spécifiées en un seul lot (1 envoi en amont vers le serveur final). Par défaut, cette option est définie sur no.
statusNonInclure éventuellement une petite chaîne ASCII représentant le statut de la notification envoyée (en ligne avec celle-ci) ; par défaut, cette option est définie sur yes.
VariableDescription
overflowGère les messages qui dépassent la limite documentée d’un service. La valeur par défaut est upstream.
👉 upstream : envoie un seul message sans le découper ni le tronquer selon cette limite.
👉 truncate : conserve la partie qui tient dans la limite et supprime le reste.
👉 split : privilégie une coupure lisible, utilise une coupure stricte si nécessaire, puis envoie toutes les parties dans l’ordre.
Le découpage d’un contenu non déclaré ou structuré reste une solution au mieux. Utilisez upstream si le corps doit rester intact.
formatCe paramètre peut être défini sur text, html ou markdown. Certains services prennent en charge plusieurs formats de publication du contenu. La valeur par défaut varie selon le service choisi et peut correspondre à l’un de ces trois formats. Vous pouvez facultativement forcer cette option pour vous écarter du comportement par défaut. Si le service ne prend pas en charge plusieurs formats de transmission, ce champ est ignoré.
verifyLes requêtes externes vers des emplacements sécurisés, par exemple via https, utilisent des certificats. Par défaut, Apprise vérifie la validité de ces certificats ; si ce n’est pas le cas, aucune notification n’est envoyée à la source. Dans certains cas, un utilisateur ne dispose pas d’une autorité de certification pour valider la clé ou fait simplement confiance à la source ; dans ce cas, vous pouvez définir ce drapeau sur no. Par défaut, il vaut yes.
redirectPar défaut, Apprise suit les redirections HTTP (réponses 3xx) émises par le serveur distant, conformément au comportement de la bibliothèque requests sous-jacente. Si vous souhaitez empêcher la transmission des en-têtes personnalisés et des identifiants vers des destinations différentes de l’URL d’origine, définissez cette option sur no. Par défaut, elle vaut yes.
ctoSignifie Socket Connect Timeout. Il s’agit du nombre de secondes pendant lesquelles Requests attend que votre client établisse une connexion avec une machine distante, ce qui correspond à l’appel connect() sur la socket. La valeur par défaut est de 4.0 secondes.
rtoSignifie Socket Read Timeout. Il s’agit du nombre de secondes pendant lesquelles le client attend que le serveur envoie une réponse. La valeur par défaut est de 4.0 secondes.
emojisActive la prise en charge des emojis, par exemple :+1: qui sera traduit en 👍. Par défaut, cette option vaut no.
Remarque : selon la configuration côté serveur, l’administrateur peut désactiver globalement la prise en charge des emojis ; mais par défaut, ce n’est pas le cas.
tzIdentifie le fuseau horaire de la base IANA que vous souhaitez utiliser. Par défaut, celui-ci est détecté à partir de la configuration du serveur qui exécute Apprise. Vous pouvez le définir sur des valeurs comme America/Toronto, ou sur tout autre fuseau correctement formaté correspondant à votre région.
retryNombre de tentatives de remise supplémentaires après le premier échec, avant d’abandonner. Accepte un entier compris entre 0 et 10. La valeur par défaut est 0 (aucune nouvelle tentative — une seule tentative est effectuée). Lorsqu’il est combiné avec wait, Apprise marque une pause du nombre de secondes spécifié entre chaque tentative.
waitNombre de secondes à attendre entre les nouvelles tentatives. Accepte une valeur décimale comprise entre 0.0 et 20.0 ; les entiers sont automatiquement convertis en virgule flottante. La valeur par défaut est 0.5. Ce paramètre n’est utile que si retry est supérieur à zéro — un service avec retry=0 effectue exactement une tentative, quelle que soit la valeur de wait.
optionalLorsqu’il est défini sur yes, un échec de remise pour ce service est silencieusement absorbé. Le résultat global de notify() est quand même considéré comme réussi même si ce point de terminaison était injoignable, à condition que tous les services requis (non optionnels) du même lot aient réussi. Ce drapeau ne saute pas la remise ni ne contourne la logique de nouvelles tentatives — toutes les tentatives configurées sont effectuées avant que l’échec soit absorbé. Par défaut, il vaut no, ce qui signifie que chaque échec est propagé à l’appelant.

Les groupes peuvent être créés dans l’application ou via le Signal Rest API Service. Pour obtenir la liste des groupes disponibles et leurs identifiants, exécutez :

Fenêtre de terminal
curl -X GET -H "Content-Type: application/json" localhost:9922/v1/groups/+15555551234 | jq

Un exemple de sortie est le suivant :

[
{
"name": "Test Group",
"id": "group.abcdefghijklmnop=",
"internal_id": "aabbccdd/eeffgghh=",
"members": ["+1555555551234", "+16666661234"],
"blocked": false,
"pending_invites": [],
"pending_requests": [],
"invite_link": "",
"admins": ["+1555555551234"]
}
]

La valeur à retenir est l’id du groupe (ici group.abcdefghijklmnop=). Utilisez-la comme cible pour envoyer une notification à ce groupe.

Ajoutez ?format=markdown pour envoyer des messages mis en forme. Signal prend en charge le gras, l’italique, le barré, le monospace et le ||spoiler||. Signal n’a pas de titres de section : les titres apparaissent donc en gras.

Fenêtre de terminal
apprise -vv -i markdown -t "Rapport de Build" -b "**3** tests en _échec_" \
"signal://localhost:9922/15555551234?format=markdown"

Envoyer une notification Signal (via Signal API) :

Fenêtre de terminal
# Supposons que notre {Hostname} soit localhost (qui héberge bbernhard/signal-cli-rest-api)
# Supposons que notre {FromPhoneNo} soit +1-900-555-9999
# Supposons que notre {PhoneNo}
# - se trouve aux États-Unis, donc avec l'indicatif +1
# - corresponde à 800-555-1223
apprise -vv -t "Titre du Message de Test" -b "Corps du Message de Test" \
"signal://localhost/19005559999/18005551223"
# l'exemple suivant aurait également fonctionné, les espaces,
# parenthèses et tirets sont acceptés dans un numéro :
apprise -vv -t "Titre du Message de Test" -b "Corps du Message de Test" \
"signal://localhost/1-(900) 555-9999/1-(800) 555-1223"

D’après mon expérience personnelle, j’ai pu m’envoyer une notification à moi-même en procédant simplement comme suit :

Fenêtre de terminal
# Supposons que notre {Hostname} soit localhost (qui héberge bbernhard/signal-cli-rest-api)
# Supposons que notre {Port} soit 9922
# Supposons que notre {FromPhoneNo} soit +1 555 555 1234
apprise -vv -t "Titre du Message de Test" -b "Corps du Message de Test" \
"signal://localhost:9922/15555551234"

Si vous connaissez l’identifiant du groupe auquel vous souhaitez envoyer une notification, vous pouvez également le spécifier sur la ligne de commande :

Fenêtre de terminal
# Supposons que notre {Hostname} soit localhost (qui héberge bbernhard/signal-cli-rest-api)
# Supposons que notre {Port} soit 9922
# Supposons que notre {FromPhoneNo} soit +1 555 555 1234
# Supposons que notre {Group} soit group.abcdefghijklmnop=
apprise -vv -t "Message de Groupe :" -b "Bonjour aux membres du groupe" \
"signal://localhost:9922/+1555555551234/group.abcdefghijklmnop="

J’ai même pu envoyer une pièce jointe sans problème :

Fenêtre de terminal
apprise -vv -t -b "test" \
signal://localhost:9922/15555551234 --attach apprise-test.gif

Ce qui a produit : image

Signal API envoie mon SMS, mais Apprise signale un échec

Section intitulée « Signal API envoie mon SMS, mais Apprise signale un échec »

Le message a bien été envoyé, mais signal-cli-rest-api a dépassé le délai d’attente de 4 secondes d’Apprise avant de le confirmer. Avec l’API Apprise, le journal peut afficher A Connection error occured sending ..., et une chaîne de priorité peut alors passer au service suivant. Le problème peut être plus visible lors du premier message après le redémarrage d’un processus Gunicorn.

Donnez plus de temps au serveur pour répondre en ajoutant ?rto=8 à l’URL Apprise :

signal://localhost:9922/15555551234?rto=8

La valeur indique le nombre de secondes pendant lesquelles Apprise attendra. Si l’URL contient déjà des options après un ?, ajoutez plutôt &rto=8. Utilisez une valeur plus élevée si nécessaire.

Le mode natif peut également améliorer le temps de réponse sur certains systèmes. L’exemple Docker ci-dessus l’active déjà avec :

Fenêtre de terminal
-e 'MODE=native'

Si le problème persiste, essayez de déplacer le conteneur Signal API vers une machine plus rapide ou moins sollicitée.

Questions ou commentaires ?

Documentation

Vous avez repéré une faute de frappe ou une erreur ?

Problèmes Techniques

Vous rencontrez un problème avec le code ? Ouvrez un ticket sur GitHub :

Conçu avec amour depuis le Canada