Logo of Signal

1) Introduction

Bonjour et bienvenue à tous.
Êtes-vous utilisateur de l'application Signal ? Si oui, cette page pourrait vous intéresser.
Cette application est très pratique car elle permet d'envoyer à ses amis des messages et des fichiers multimédia depuis son smartphone (Android ou iphone) ou à partir d'un ordinateur (Linux, Windows ou MacOS).
De mon côté, j'avais besoin d'envoyer des messages via Signal, et cela de façon automatique. J'ai donc cherché sur internet un utilitaire ou une API qui permette d'envoyer des messages en mode CLI (interface en ligne de commande), et j'ai trouvé l'interface "signal-cli" qui permet d'envoyer des messages depuis un Terminal.
Mon objectif ici est donc de décrire les différentes étapes pour utiliser l'interface "signal-cli".
Possédant plusieurs Raspberry Pi, ma solution s'est vite tournée vers ce nano-ordinateur, et l'écriture d'un petit script Python avec utilisation de l'API gspread (pour lire/importer des données depuis Google Sheets).
Voyons donc comment installer "signal-cli" sur un raspberry, puis comment s'en servir.


2) Prérequis

Voici 2 liens importants contenant tout ce qu'il faut:

Le premier lien mène à la page générale de "signal-cli". Lisez attentivement toute la page (en entier) avant toute manipulation.
Le deuxième est la page que nous utiliserons pour télécharger "rpi_signal-cli-0.8.1.tar" qui est spécialement packagé pour le raspberry et qui embarque toutes les dépendances (càd toutes les bibliothèques requises).

Le prérequis avant de commencer toute installation est d'avoir au moins Java Runtime Environment (JRE) 11.
Comme mon raspberry est sous Raspberry Pi OS Lite, j'ai dû faire cette installation:
# Si besoin installer Java
pi@raspberrypi1:~ $ sudo apt update
pi@raspberrypi1:~ $ sudo apt install default-jdk

# Vérifier la version de Java
pi@raspberrypi1:~ $ java -version
openjdk version "11.0.9.1" 2020-11-04
OpenJDK Runtime Environment (build 11.0.9.1+1-post-Raspbian-1deb10u2)
OpenJDK Server VM (build 11.0.9.1+1-post-Raspbian-1deb10u2, mixed mode)
pi@raspberrypi1:~ $

# Positionner la variable JAVA_HOME dans le fichier /etc/environment, de façon à avoir:
pi@raspberrypi1:~ $ cat /etc/environment
JAVA_HOME="/usr/lib/jvm/java-11-openjdk-armhf"

# Rebooter et vérifier que la variable est bien positionnée
pi@raspberrypi1:~ $ sudo reboot
pi@raspberrypi1:~ $ echo $JAVA_HOME
/usr/lib/jvm/java-11-openjdk-armhf
pi@raspberrypi1:~ $

On pourra aussi suivre les instructions de la page suivante: https://linuxize.com/post/install-java-on-raspberry-pi/


3) Téléchargement et installation (de signal-cli pour raspberrypi)

# Téléchargement
pi@raspberrypi1:~ $ wget https://github.com/DutchForeigner/signal-cli_rpi/blob/main/rpi_signal-cli-0.8.1.tar

# On extrait sous /opt
pi@raspberrypi1:~ $ sudo tar -xvf rpi_signal-cli-0.8.1.tar -C /opt (ou si la commande ne marche pas, extraire et copier manuellement le répertoire dans /opt)

4) On relie le raspberry au compte Signal existant

En ce qui me concerne, je dispose déjà d'un compte Signal que j'utilise depuis mon smartphone Android et depuis mon PC Linux (sous Kubuntu); je n'ai donc pas eu besoin d'enregistrer un numéro puis de le vérifier.
Si vous avez besoin de le faire, il faudra utiliser les 2 commandes suivantes:
signal-cli -u USERNAME register (où USERNAME est votre numéro de téléphone avec le prefixe de votre pays, par exemple +336XXXXXXXX ou +337XXXXXXXX)
signal-cli -u USERNAME verify CODE (où CODE est le code que vous recevrez par SMS)
Mon besoin est donc simplement de lier mon raspberry à mon compte existant, pour cela il faut générer un URI puis générer un QR code (à partir de cet URI) qu'on pourra ensuite scanner depuis son smartphone.
# On génère l'URI
pi@raspberrypi1:~ $ /opt/rpi_signal-cli-0.8.1/bin/signal-cli link -n raspberrypi1
tsdevice:/?uuid=JDOX5lKq94gPzkRAqg7abccbQ&pub_key=BaB%2F8Ob7P61f9RltnISY6ExEkoVrkih56Q7my1NnpBtS

# Depuis mon PC je génère un QR code partir de l'URI
prabou@prabou-VPCZ23C5E:~$ sudo apt-get install qrencode
prabou@prabou-VPCZ23C5E:~$ qrencode "tsdevice:/?uuid=JDOX5lKq94gPzkRAqg7abccbQ&pub_key=BaB%2F8Ob7P61f9RltnISY6ExEkoVrkih56Q7my1NnpBtS" -o $HOME/signal_cli_qrcode.png

# Depuis l'appli Android, linker un nouveau device avec Paramètres>Appareils reliés, puis scanner le QR Code, et sur le raspberry on devrait voir ce message qui apparait:
...
Associated with: +337XXXXXXXX
pi@raspberrypi1:~ $

# On vérifie que le raspberry a bien été ajouté
pi@raspberrypi1:~ $ /opt/rpi_signal-cli-0.8.1/bin/signal-cli -u +337XXXXXXXX listDevices
- Device 1:
  Name: null
  Created: 1617485235825 (2021-04-03T21:27:15.825Z)
  Last seen: 1617408000000 (2021-04-03T00:00:00.000Z)
- Device 2 (this device):
  Name: null
  Created: 1617487907790 (2021-04-03T22:11:47.790Z)
  Last seen: 1617408000000 (2021-04-03T00:00:00.000Z)
pi@raspberrypi1:~ $

Et sur le smartphone on devrait avoir ceci pour les appareils reliés:
Signal linked devices

5) Test d'envoie d'un message

pi@raspberrypi1:~ $ /opt/rpi_signal-cli-0.8.1/bin/signal-cli -u +337XXXXXXXX send -m "Bonjour mon ami, ce message test est envoyé par signal-cli depuis mon raspberry" +336XXXXXXXX
1617488005341
pi@raspberrypi1:~ $

Et si on veut l'intégrer à un script python:
pi@raspberrypi1:~ $ cat send_signal_message.py 
#!/usr/bin/env python3
"""Send message via Signal"""

import os

MESSAGE = """Bonjour,
ceci est mon message."""
CMD = '/opt/rpi_signal-cli-0.8.1/bin/signal-cli -u +337XXXXXXXX send -m "' + MESSAGE + '" +336XXXXXXXX'
os.system(CMD)
pi@raspberrypi1:~ $

Sachez que de nombreuses options sont disponibles, comme envoyer un message à plusieurs personnes, créer/supprimer/quitter un groupe, etc...
Des exemples sont même proposés ici:
Signal linked devices