yowsup
yowsup | |
---|---|
Zweck / Funktion | |
Schnittstelle, um WhatsApp-Nachrichten empfangen und senden zu können. | |
Allgemein | |
Typ | Gerätemodul |
Details | |
Dokumentation | EN / DE Thema |
Support (Forum) | Unterstuetzende Dienste |
Modulname | 32_yowsup.pm |
Ersteller | André / justme1968 (Forum / Wiki) |
Wichtig: sofern vorhanden, gilt im Zweifel immer die (englische) Beschreibung in der commandref! |
Das Modul yowsup dient dazu, WhatsApp-Nachrichten zu empfangen und zu senden.
Voraussetzungen
- Die Funktionalität ist vermutlich auf Linux/Unix Systeme beschränkt.
- Nach der Erstinstallation/-einrichtung muss zwingend das cmd Attribut korrekt gesetzt werden.
Installation
Die ursprüngliche Einrichtung wurde hier beschrieben, jedoch sind noch einige wichtige Dinge zu setzen.
Yowsup Installation
Bevor man loslegt sollte man wie immer sicherstellen, dass Debian auf dem aktuellen Stand ist:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
Los gehts mit den Paketen:
sudo apt-get install python-soappy python-dateutil python-pip python-dev build-essential
Nun erstmal pip updaten:
sudo pip install --upgrade pip
Und dann axolotl installieren (das dauert ne Weile):
sudo pip install python-axolotl
Will man Bilder verarbeiten, so braucht man noch ein paar Pakete mehr:
- Paketinstallationen:
- Unter Debian Wheezy:
sudo apt-get install libtiff4-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk
- Unter Debian Jessie:
sudo apt-get install libtiff5-dev libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.5-dev tk8.5-dev python-tk
- Unter Debian Wheezy:
- PIP:
sudo pip install pillow
Vor den weiteren Schritten sollte geprüft werden, ob dem User fhem eine Loginshell zugewiesen ist:
getent passwd fhem
Wird hier am Ende /bin/false ausgegeben, so muss dies angepasst werden:
sudo chsh -s /bin/bash fhem
Mittels getent passwd fhem kann auch bereits das Home-Verzeichnis ausgelesen werden, dies steht in der ausgegebenen Doppelpunkt-separierten Liste an vorletzter Stelle.
Nun loggt man sich unter dem User ein, unter dem fhem läuft (in den folgenden Beispielen werden die vom fhem-Setup-Script generierten Defaults verwendet: User=fhem , home=/opt/fhem Gruppe=dialout) und liest dort die $HOME-Variable aus und prüft das Home-Verzeichnis:
sudo su - fhem echo $HOME cd $HOME logout
Diesen Wert braucht man später - gut merken. Sollte hier ein Fehler auftreten (z.B. das home nicht vorhanden), so muss dies zuerst korrigiert werden.
Desweiteren muss man nun yowsup installieren, was wie folgt vonstatten geht:
cd /opt sudo mkdir yowsup-config sudo wget https://github.com/tgalal/yowsup/archive/master.zip sudo unzip master.zip rm master.zip cd yowsup-config sudo nano yowsup.config
Wie bemerkt, ist man nun im Editor für die yowsup.config gelandet. Diese wird nun wie folgt gefüllt:
## Actual config starts below ## #cc ist wichtig ansonsten funktioniert es nicht aus dem Script cc=49 phone=498912345678 id=0000000000 password=
Ersetze die Nummer 498912345678 gegen eine Festnetz oder Handynummer welche derzeit nicht mit WhatsApp verwendet wird. Mittels STRG+o wird die Datei nun gespeichert und mittels STRG+x verlässt man den Editor.
Vor den weiteren Schritten sollte man nun erstmal die yowsup Verzeichnisse dem fhem-user zugängig machen:
sudo chown -R fhem:dialout /opt/yowsup-master /opt/yowsup-config
Für die folgenden Schritte würde ich auf den FHEM-Nutzer wechseln:
sudo su - fhem cd /opt/yowsup-master
Nun erfolgt die Anmeldung am WhatsApp-Server. Dies kann man nun via voice
oder sms
machen. Bei einem Handy bietet sich SMS an, bei Festnetzanschlüssen sollte voice gewählt werden, wenn man sich nicht sicher ist, dass der Anschluss die Funktion 'SMS im Festnetz' unterstützt. Dann wird der Bestätigungscode zwar auf Englisch vorgelesen, dafür ist die Zuverlässigkeit des Registrierungsvorganges zuverlässiger. Bei Festnetznummern sollte man unbedingt etwas zum schreiben bereit halten!
python yowsup-cli registration -c /opt/yowsup-config/yowsup.config -r sms
Die Rückmeldung ist nun entscheidend. Wenn man diese zurückbekommt:
de sms status: fail retry_after: 3600 reason: no_routes
Dann ist die Nummer so nicht kompatibel. Was man dann noch probieren kann, ist die registration via voice - meistens ist das aber vergebene Liebesmüh'.
Wenn man folgende Rückmeldung bekommt:
Detected cc: 49 status: sent retry_after: 1805 length: 6 method: sms
So ist alles gut gelaufen und man sollte kurz später eine SMS bekommen. Darin ist ein Text, der am Ende z.B. 123-456 lautet. Diesen fügt man ohne Bindestrich am Ende des folgenden Befehls ein:
python yowsup-cli registration -c /opt/yowsup-config/yowsup.config -R 123456
Dann kommt ein Text der etwa so aussehen sollte:
status: ok kind: free pw: bfGA9wPWWNeHcSBxxxxxxxxxxxxxxxxx price: 0,89 € price_expiration: 1432127524 currency: EUR cost: 0.89 login: 498912345678 type: existing expiration: 1460832553
Den Text hinter dem Zeilenanfang pw:
benötigt man nun für die Konfigurationsdatei, wo dieser eingefügt werden muss:
nano /opt/yowsup-config/yowsup.config
Sodass die Datei beispielhaft dann so aussieht:
## Actual config starts below ## #cc ist wichtig ansonsten funktioniert es nicht aus dem Script cc=49 phone=498912345678 id=0000000000 password=bfGA9wPWWNeHcSBxxxxxxxxxxxxxxxxx
Wie man schon gesehen hat, ist der Account nur begrenzt gültig - die Gültigkeit kann man anhand der als expiration:
bezeichneten Zeile ablesen, welche einen Unix-Timestamp beinhaltet. Diese kann man HIER umrechnen lassen.
Nun mal ein schneller test an die eigene Nummer (im Beispiel 491751234567):
python yowsup-cli demos -c /opt/yowsup-config/yowsup.config -s 491751234567 "Das ist ein Test"
Das sollte dir eine Nachricht einbringen. Wenn du darauf antwortest, kommt diese allerdings noch nicht an - der Client hat sich nach dem Befehl sofort beendet. Damit dieser dauerhaft im Hintergrund läuft legen wir nun in FHEM ein Gerät an, welches dies steuert.
FHEM Define
- Fhem Device anlegen:
define <name> yowsup
, also z.B.define WhatsApp yowsup
- Nun muss man den Pfad zu yowsup anpassen:
attr WhatsApp cmd /opt/yowsup-master/yowsup-cli demos -c /opt/yowsup-config/yowsup.config --yowsup
- Und das Home directory mit dem Pfad zum Home des fhem users:
attr WhatsApp home PWD
- Wenn alles gut geht, gibt es danach im Device ein internal PID und das Reading state
- Im Whatsapp Client auf dem Handy sollte man sehen, dass Fhem online ist
- Zum Senden aus Fhem kann man das Kommando
set WhatsApp send <nummer> <text>
verwenden
Attribute
Bitte sehe immer in der [Commandref] nach - diese hier könnten veraltet sein.
cmd
komplettes Kommando, um den yowsup Client zu starten. z.B.:attr WhatsApp cmd /opt/yowsup-master/yowsup-cli demos -c /opt/yowsup-config/yowsup.config --yowsup
. Wenn die ab yowsup-Version 2.4 standartmässig aktivierte Verschlüsselung abgeschaltet werden muss weil die entsprechenden Libs nicht installiert sind:attr WhatsApp cmd /opt/local/bin/yowsup-cli demos -c /root/yowsup-config --yowsup -M
.accept_from
kommagetrennte Liste von Kontakten (Nummern), von denen Nachrichten akzeptiert werden. Ist das Attribut nicht gesetzt, so werden die Nachrichten von jedem akzeptiert.commandPrefix
nicht gesetzt -> es werden keine Befehle akzeptiert.
0 -> es werden keine Befehle akzeptiert.
1 -> erlaubt Befehle, jede Nachricht wird als Fhem-Befehl interpretiert.
alles andere -> Wenn die Nachricht mit diesem Prefix startet, wird alles weitere als Befehle interpretiert.
allowedCommands
Eine Komma-getrennte Liste von zulässigen Befehlen für diesen Kontakt. Wenn die Liste leer ist (z.B. nur ein Komma), dann werden keine Befehle akzeptiert.home
Setzt das Home-directory welches für yowsup verwendet werden soll.
Befehle
- image -> Über diesen Befehl können Bilder gesendet werden.
- raw -> Status ändern :
set WhatsApp raw /profile setStatus 'mein Status' <--- die ' ' müssen bleiben
Name der angezeigt werden soll, wenn eine Nachricht z.B. ans iPhone geschickt wird:
set WhatsApp raw /presence name <DeinNick>
Anzeige online :
set WhatsApp raw /presence available
Profilbild ändern :
set WhatsApp raw /profile setPicture '/opt/fhem/fhem_logo.png'
<--- der gesamte Pfad zum Bild muss angegeben werden und Rechte müssen ggfs. bei fhem liegen
Falls es nicht funktioniert disconnect/connect probieren.
Anwendungsbeispiele
Beispielnachricht
Beim Empfang einer Nachricht wird automatisch ein Fhem Device für diesen Kontakt angelegt. In diesem Device gibt es das Reading message für die empfangene Nachricht und ab der ersten Nachricht auch das Reading chatstate, in dem zu sehen ist, ob gerade getippt wird. Nachdem ein Device für einen Kontakt angelegt ist, lässt sich auch direkt dieses Device zum Senden verwenden:
set <device> send <text>
,
d.h., man spart sich die Angabe der Nummer.
Gruppen
Gruppen müssen über die App (Smartphone / Tablet) angelegt werden. Nach dem Empfang einer entsprechenden Nachricht werden Gruppen genauso behandelt, wie einfache Teilnehmer.
Broadcast
Beim Senden über das Masterdevice lassen sich mehrere Empfänger mit Komma (und ohne Leerzeichen) getrennt angeben. Die entsprechenden Nachrichten werden dann per Broadcast an alle Teilnehmer gesendet. Die Broadcastempfänger müssen zuvor mindestens eine normale Nachricht erhalten haben.
Komponenten steuern
Um ein notify anlegen zu können, müssen wir zuerst eine Nachricht vom Handy an FHEM senden. Dadurch wird ein Device mit der Nummer als Namen angelegt. Danach sollte das Device umbenannt werden, da einige Befehle einen Namen ausschließlich aus Ziffern nicht akzeptieren. Dies geschieht wie folgt:
rename 49123456789 HandySeppel
Danach kann ein notify angelegt werden:
define notifySeppelLicht notify HandySeppel:message.* {
if( $EVENT eq 'message: Licht an' ) {
fhem "set HandySeppel send Licht ist nun an...";
fhem "set FS20_a5d800 dim100%";
} elsif( $EVENT eq 'message: Licht aus' ) {
fhem "set HandySeppel send Licht ist nun aus...";
fhem "set FS20_a5d800 dim0%";
} else {
fhem "set HandySeppel send Wie bitte?"
}
}
Natürlich ist dieses notify noch auf die eigenen Wünsche anzupassen.
Autoresponder
Nachdem man nun seine Festnetznummer bei WhatsApp registriert hat, wird auch diese natürlich als erreichbares Ziel auf jedem Gerät angezeigt, auf dem sie gespeichert ist. So kann es passieren, dass WhatsApp nicht gelesen werden. Hier schafft ein Autoresponder Abhilfe:
define not_WhatsApp_Autoresponder notify 491.*:message.* set $NAME send Hallo, Du hast eine Nachricht an unsere Festnetznummer geschickt. Da ist aber nur ein kleiner Computer auf Empfang, der Dir nur diese Antwort schicken kann. Bitte benutze unsere Mobilnummern, wenn Du willst, dass Deine Nachricht auch gelesen wird!
Das Problem hierbei ist, dass noch nicht bekannt ist, wer etwas sendet und so der Kontakt u.U. noch nicht angelegt ist. Daher wird im obigen Beispiel auf 491*:message.* reagiert. So bekommen nur deutsche Mobilrufnummern die Antwort. Um das noch globaler zu fassen, muss könnte z.B. auf \d*.*:message.* reagiert werden, was aber voraussetzt, dass keine weiteren Modulnamen (die das Reading message haben) mit einer Ziffer beginnen. Alle Kontakte, welche nicht den Autoresponder erhalten sollen, müssen wie oben beschrieben entspr. umbenannt werden:
rename 49123456789 HandySeppel
Links
- Forenthread, in dem die Whatsapp Anwendung beschrieben wird
- Foreneintrag, ab dem das yowsup Modul beschrieben wird
- Die Python Whatsapp Library auf github
- Imagehandling Bugfix github