Go to file
Sune 44b223a49e edit python example 2023-09-07 10:55:02 +02:00
data init commit 2023-09-07 00:54:12 +02:00
README.md edit python example 2023-09-07 10:55:02 +02:00

README.md

signal-cli

First and foremost a big thank you to AsamK, most of this guide is copied from AsamK's signal-cli repo and modified to fit my own needs.

This guide is for installing and running signal-cli as a daemon and setting up a system-wide dbus. signal-cli is a commandline interface for the Signal messenger. It supports registering, verifying, sending and receiving messages. signal-cli uses a patched libsignal-service-java, extracted from the Signal-Android source code. For registering you need a phone number where you can receive SMS or incoming calls.

Installation

System requirements:

  • at least Java Runtime Environment (JRE) 17
  • wget

Debian/Ubuntu:

$ sudo apt install wget openjdk-17-jre

Install system-wide on Linux

See latest version.

$ export VERSION=<latest version, format "x.y.z">
$ wget https://github.com/AsamK/signal-cli/releases/download/v"${VERSION}"/signal-cli-"${VERSION}"-Linux.tar.gz
$ sudo tar xf signal-cli-"${VERSION}"-Linux.tar.gz -C /opt
$ sudo ln -sf /opt/signal-cli-"${VERSION}"/bin/signal-cli /usr/local/bin/

Initial Setup

Create user for running the service, --system creates a system user without home dir and password. :

# adduser --system --group signal-cli

Create a folder for signal account configs:

# mkdir /var/lib/signal-cli
# chown signal-cli: /var/lib/signal-cli

Register Account

# su signal-cli -s /bin/bash
$ /usr/local/bin/signal-cli --config /var/lib/signal-cli -u <PHONE NUMBER> register

Registering may require solving a CAPTCHA challenge: Registration with captcha

Verify the number using the code received via SMS or voice, optionally add --pin PIN_CODE if you've added a pin code to your account:

signal-cli$ /usr/local/bin/signal-cli --config /var/lib/signal-cli -u <PHONE NUMBER> verify <CODE>

Setup systemd service and dbus

To run on the system bus you need to take some additional steps. Its advisable to run signal-cli as a separate unix user, the following steps assume you created a user named signal-cli. To run a service on the system bus, a config file is needed to allow the signal-cli user to take a name on the system bus. An example config file can be found in data/org.asamk.Signal.conf. This file also configures that any user can talk with the signal-cli daemon. The data/org.asamk.Signal.service and data/signal-cli.service files configure a dbus activated systemd service for signal-cli, so the service is automatically started when the dbus service is requested.

Git clone this repo as you will need files from the data folder.

git clone https://git.data.coop/sune/Signal-cli.git

These steps, executed as root, should work on all distributions using systemd. Move the files:

# mv data/org.asamk.Signal.conf /etc/dbus-1/system.d/
# mv data/org.asamk.Signal.service /usr/share/dbus-1/system-services/
# mv data/signal-cli.service /etc/systemd/system/

Edit service file to match phone number and enable systemd service:

# sed -i -e "s|%number%|<PHONE NUMBER>|" /etc/systemd/system/signal-cli.service
# systemctl daemon-reload
# systemctl enable signal-cli.service
# systemctl reload dbus.service
# systemctl start signal-cli.service

Test

Send a message:

$ signal-cli --dbus-system send -m "hey test" <RECIPIENT> 

Receive messages from signal-cli daemon

The signal-cli daemon publishes new messages to dbus. Here's an example using python:

def msgRcv (timestamp, source, groupID, message, attachments):
   print ("Message", message, "received in group", signal.getGroupName (groupID))
   return

from pydbus import SystemBus
from gi.repository import GLib

bus = SystemBus()
loop = GLib.MainLoop()

signal = bus.get('org.asamk.Signal') 
signal.onMessageReceived = msgRcv
loop.run()