Achtung: Mit iOS 9 funktioniert diese Version nicht mehr. Eine ausführliche Erklärung gibt es hier.

Im April hatte ich bereits SiriAPI auf GitHub veröffentlicht. Damals funktionierte sie bis einschließlich iOS 7 und hatte Tücken ohne Ende. Neben der komplizierten Installation, für die es erforderlich war Squid selber zu kompillieren, war der Code Quick&Dirty und der Betrieb ressourcenhunrig. Mit iOS 8 war das Ganze dann vorbei, Apple hatte offenbar eine erweiterte Zertifikatsprüfung eingebaut, die die Manipulation des HTTPS Traffics durch selbstsignierte Zertifikate nicht mehr zulies.

Dank einem Kommentar von Yannick unter dem ursprünglichen Beitrag, gibt es jetzt eine neue Version. Diesmal greift ein einfaches Python3 Script auf den IMAP Dienst der iCloud zu und liest damit die Notizen aus. Mit Siri können Notizen erstellt werden. Enthalten sie das Schlüsselwort (Standardmäßig iPhone), reagiert das Python Script und eine gewünschte Aktion wird ausgeführt.

Wildcards sind nach wie vor vorhanden, nur anstatt dem Einsatz irgendwelcher externen Tools wie Squid läuft alles in dieser einen Python Anwendung. Außerdem ist das Ganze jetzt objektorientiert aufgebaut. Damit wird SiriAPI also anstatt als Programm als Bibliothek genutzt und kann so auch direkt in bestehende Projekte eingebunden werden. Ich verwende SiriAPI8 beispielsweise für meine Heimautomatisierung.

Siri API heißt jetzt SiriAPI8 und ist in einem neuen GitHub Repository unter https://github.com/HcDevel/SiriAPI8 verfügbar. Damit möchte ich eine klare Abgrenzung zwischen der alten Version erreichen, die unter iOS 7 nach wie vor funktioniert. Theoretisch sollte aber SiriAPI8 unter iOS 7 funktionieren, sodass iOS 7 Nutzer nun wählen können. Für Siri API gibt es aber definitiv keine Updated oder Support mehr.

Erkannte Notizen werden nach dem Ausführen automatisch gelöscht, sodass sich auch kein Müll ansammelt. Man sollte natürlich davon absehen Notizen zu erstellen, die das Schlüsselwort enthalten und nicht für SiriAPI8 bestimmt sind, da auch diese gelöscht werden würden. Wer also Notizen mit dem Inhalt iPhone erstellt, der sollte das Schlüsselwort ändern.

Siri ist also wieder einmal gehackt worden, diesmal kann Apple theoretisch nichts mehr dagegen tun, weil genauso wie SiriAPI8 auch andere Email Programme wie Thunderbird oder Outlook auf IMAP zugreifen. Hoffen wir mal das Apple nicht wieder einen seltsamen Weg findet um mich auszusperren.

Subscribe
Notify of
103 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments

[…] Unter iOS8 funktioniert diese Version nicht. Es gibt aber inzwischen ein Update, das hier zu finden […]

marcus
9 years ago

Hey danke du bist echt genial!
aber eine kleine frage ich bin ein echter anfanger in sowas
könntest du mir erklaren wie ich das auf ein raspberry pi machen könnte? und so auch die ausgänge zu steuern?

marcus
9 years ago
Reply to  robin

Okey.
Ich habe die “setup.py” installiert aber wenn ich die “example.py” starten möchte mit python shell
sagt er:
nameError: name”get_version” is not defined.
was mache ich falsch? oder muss man die Datei anders öffnen?

Entschuldige für die dummen fragen. ich kenne mich zwar in der Elektronik aus und auch etwas in der Programierung von Microkontrollern mit Assambler aber ich habe keine Ahnung von Python und Linux.

marcus
9 years ago
Reply to  robin

Python3

Bloß es kommt immer dasselbe wenn ich example.py starten möchte

Oliver
9 years ago
Reply to  marcus

Falls du die GPIOs über SiriAPI ansteuern möchtest musst du zuerst die GPIO Bibliothek in dein Python Script einbinden.

import RPi.GPIO as GPIO “bindet Bibliothek ein”
GPIO.setmode(GPIO.BCM) “legt die Belegung der GPIOs fest.(Pinnummern oder GPIO-Nummern)”

Um das Python Script dann mit der SiriApi zu nutzen musst du diese einbinden. Anleitung dazu hat Robin ja verlinkt. Die GPIOs über Siri anzusteuern ist jedoch momentan? nicht sinnvoll, da das Ansteuern der GPIOs nur per sudo bzw. root möglich ist. Dein Pi könnte also leicht geknackt und missbraucht werden.

Ende meines kleinen Vortrags 😀

Andrej Sinenko
9 years ago

Hallo Robin, ich würde gerne mein raspberry pi mit siriproxy betreiben, wenn ich jetzt ein iphone mit iOS 6 besorge, wird es noch funktionieren?

Huby
9 years ago

Hallo
Das ist eine super Arbeit was du hier leistest danke.
Aber kannst du mir vielleicht kurz helfen?
Ich hab die Setup.py ausgeführt in der example.py den Login ausgebessert. Aber wenn ich Siri auf meinem iPhone starte und “erstelle Notiz iPhone hallo Name” sage wird nur eine neue Notiz angelegt ohne Antwort. Kannst du mir weiterhelfen? Ich möchte in Zukunft meine Hausautomatisierung von Homematic per Siri steuren. Ich kann alle Geräte über http Link ansprechen.
Hast du hierfür vielleicht schon ein Beispiel wie ich mir einen Link aufrufen kann?
Danke
lG Huby

Martin
9 years ago

Hallo Robin,

vielen Dank für Deine tolle Arbeit.

Kannst Du mir vielleicht noch sagen, wie ich als Aktion z.B. einen TCP Call starten kann ?
Normalerweise muss ich folgenden Befehl in der Kommandozeile eingeben:

echo “Hallo” > /dev/tcp/192.168.40.10/11024

Wie kann ich das aus der example.py starten, wenn alle Bedingungen stimmen ?

Danke für Deine Hilfe

Gruß
Martin

Martin
9 years ago
Reply to  Martin

Habe es jetzt schon selber hinbekommen. Danke trotzdem. 😀

Martin
9 years ago
Reply to  robin

Über Python Sockets. Ich übergebe das ganze an meinen HTPC, auf dem meine komplette Heimautomatisierung IP-Symcon läuft.

Martin
9 years ago

Hallo Robin,

Jetzt habe ich doch noch eine Frage:

Wie bekomme ich es hin, das die SiriAPI8 beim Start geladen wird ?

Habe mehrere Sachen versucht, es aber nicht hinbekommen.

Danke für Deine Hilfe
Martin

Martin
9 years ago
Reply to  robin

Ich habe es z.B. noch nicht hinbekommen, dass Umlaute ü, ä, ö ausgegeben werden.

Martin
9 years ago
Reply to  robin

Das wäre Super. Solange werde ich mein “Büro” als “Arbeitszimmer” deklarieren. 😀

8 years ago
Reply to  robin

Erst mal Danke !!!! Somit geht meine Voicesteuerung teilweise wieder.

Wegen der Umlaute hab ich die Dateien mit Notepad++ in UTF-8 gewandelt und in den Dateien im Kopf (Header) folgende 2 Zeilen eingefügt. Funktioniert.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

Tobias Häcker
9 years ago

Hallo Robin,
wie kann ich denn das Schlüsselwort “iPhone” in etwas anderes ändern?
Gibt es noch andere Möglichkeiten außer die Notitzen zu nutzen?
Mit schwebt ein einfacherer Befehl wie “Siri, Licht an!” vor.
Vielen Dank für deine Antwort.
Viele Grüße,
Tobi

Martin
9 years ago
Reply to  Tobias Häcker

Du kannst das Schlüsselwort in der SiriAPI.py (liegt im Unterverzeichnis SiriAPI8) ändern.

Es muss in den Zeilen 13 und 22 ausgetauscht werden:

self.keyword = “iphone”

def set_keyword(self, keyword=”iphone”):

===========================================================

Normalerweise gibt es auch eine Funktion für die example.py aber die funtioniert bei mir nicht:

SiriAPI.set_keyword(keyword) #Changes the keyword from iPhone to any string

Martin
9 years ago
Reply to  robin

Ähm, *hust* ich glaube das mit den Gänsefüßchen hättest Du für die ganz do….. nochmal dabeischreiben sollen. 😀

Martin
9 years ago

Hallo Robin,
ich habe jetzt alles versucht, die example.py beim reboot automatisch zu starten. Es wird auch in den tasks angezeigt, dass der Prozess läuft, allerdings tut sich nichts wenn ich eine Notiz erstelle. Wenn ich die example von Hand starte läuft alles bestens. Liegt das eventuell an falschen Rechten ? Ich habe nicht so die Ahnung was python betrifft. Vielleicht kannst Du mir nochmal genau sagen, mit welchem Befehl und welchen Rechten es bei Dir läuft.

Danke und Gruß
Martin

Martin
9 years ago
Reply to  Martin

Hi Robin,

habe jetzt auch das Problem lösen können.

Manchmal muss man einfach suchen und probieren. Auch wenns Stunden dauert. :/

Jetzt lasse ich Dich erstmal in Ruhe weiter an der SiriAPI8 feilen.

Ich freue mich schon auf weitere Releases von Dir.

Gruß
Martin

Martin
9 years ago
Reply to  Martin

Ich mache das Ganze jetzt über ein autostart bash Skript welches beim reboot Durch die /etc/rc.local ausgeführt wird.

Martin
9 years ago

Hier nochmal eine kleine Anerkennung und ein Feedback von mir:

http://youtu.be/z-ey2lvLq50

Paco
9 years ago
Reply to  Martin

Hey Martin, wie hast du denn deine Lichtsteuerung realisiert? Mit GPIO’s?

Gruß Paco

tom
9 years ago

Hi, super Sache!
Ist es möglich das ganze mit pilight zu verbinden oder wie funktioniert das ?

tom
9 years ago
Reply to  robin

okay gut.
es wäre nett wenn du deine konfiguration einmal hochladen kannst bzw wenn sie online ist den link senden kannst?

max
9 years ago

Wie kann ich einen einfachen Terminal Befehl ausführen mit der Software

AngryC
9 years ago

Hi Robin, erstmal danke für deine Mühe. Beim iCloud Login muss ich bei deinem Script meinen Usernamen (also das vor dem “@icloud.com”) angeben, nicht meine eMail, sonst kriege einen Login Fehler. Als ich das rausgefunden habe, dachte ich das example würde gehen, aber er gibt nichts aus. Ich habe 4 Notizen auf iCloud erstellt (iPhone Hallo Benjamin, iphone hallo Benjamin, … etc wegen Gross/Kleinschreibung), aber er gibt nur die Versionsnummer aus… Er löscht die Nachrichten auch nicht. Hast du eine Idee? Und kann ich auch komplett auf das keyword verzichten und alle Notizen parsen? Muss ich dann SiriAPI.set_keyword(“”) oder SiriAPI.set_keyword(”… Read more »

AngryC
9 years ago
Reply to  robin

Ich nutze die Notizen gar nicht, daher wäre mir egal, wenn er alle löscht 🙂

Ja, ich sehe die Notizen in iCloud. Ich habe die Notizen dort angelegt.

Und ich habe auch “hello” durch “hallo” ersetze in der example.py

AngryC
9 years ago
Reply to  AngryC

Nachtrag: er löscht die Nachrichten doch aus iCloud raus.
Aber ich kriege keine Ausgabe, nur die Version und Press any key
Auch mit anderen Schlüsselwörtern geht es nicht, zB “bla”…

AngryC
9 years ago
Reply to  AngryC

Ich glaube ich habe es falsch benutzt. Ich habe die Notizen immer vor dem Start angelegt. Aber ich habe im Code gesehen, dass du beim Start “aufräumst” und die vorhandenen Nachrichten löscht.

Wenn ich in iCloud selbst Notizen anlege, während dein Code läuft, dann kriege ich diese Ausgabe:
SiriAPI8 error: No action defined for iphone hallo ben

Wenn ich Notizen übers iPhone anlege, dann klappt es 🙂

Gibst du mir noch einen Tipp, wie ich den Code so anpasse, dass er ohne das keyword funktioniert?

AngryC
9 years ago
Reply to  AngryC

So, ich habe den Code mal angepasst:

if self.keyword.strip() == “”:
typ, data = self.connection.search(None, ‘ALL’) #Delete unhandled commands
else:
typ, data = self.connection.search(None, ‘ALL’, ‘SUBJECT “‘ + self.keyword + ‘”‘) #Delete

Funktioniert. Ist keine so super schöne Lösung, da man den gleichen Code an 2 Stellen hat: in connect und in fetch, aber es funktioniert

Paco
9 years ago

Hey Robin,

vielen Dank für deine Arbeit. Ich habe die ganze Zeit schon nach so etwas gesucht 😉
Hast du vielleicht eine Idee, wie man das ganze mit WiringPi realisieren könnte? Das Programm nutzt einfache Terminalbefehle z.B.: sudo ./send 00000 2 1
Darüber wird dann die Funksteckdose mit dem Systemcode 00000 B angeschaltet. Wenn man am Schluss anstatt der 1 eine 0 setzt, geht sie wieder aus…
Vielleicht kannst du mir helfen das mit Python und deiner SiriAPI8 zu realisieren 🙂

Danke
LG Paco

Paco
9 years ago
Reply to  Paco

Nachtrag: Ich habe leider fast keine Ahnung von Python, kann da also selber nicht viel machen…

AngryC
9 years ago
Reply to  Paco

Das geht so:


def cmdline(command):
from subprocess import PIPE, Popen
process = Popen(
args=command,
stdout=PIPE,
shell=True
)
return process.communicate()[0]

Und dann später verwenden:

cmdline(“sudo ./send 00000 2 1”)

Paco
9 years ago
Reply to  AngryC

Ok cool, danke!

Aber wie baue ich das jetzt in die SiriAPI ein? Ich würde z.B. gerne sagen: Notiz Licht Wohnzimmer an/aus. Tut mir leid, dass ich so blöd frage, aber ich bin absoluter Neuling in Sachen Python…

Martin
9 years ago
Reply to  Paco

Du musst alles in die example.py eintragen.

So sollte es eigentlich funktionieren:

from SiriAPI8.SiriAPI import *
import os

def lichttreppeon(q, wildcards): #Answer function
resultcode = os.system(“sudo ./send 00000 2 1”)

def lichttreppeoff(q, wildcards): #Answer function
resultcode = os.system(“sudo ./send 00000 2 0”)

SiriAPI = SiriAPI(“user@icloud.com”, “password”) #Create SiriAPI8 object
#print(SiriAPI.get_version())

SiriAPI.action.add([[‘licht treppe einschalten’, ‘*’]], lichttreppeon)
SiriAPI.action.add([[‘licht treppe ausschalten’, ‘*’]], lichttreppeoff)

SiriAPI.connect() #Connect to iCloud

SiriAPI.set_keyword(“siri”)

input(“Press any key…n”)
SiriAPI.disconnect() #Close connection

Paco
9 years ago
Reply to  Martin

Danke schon mal für deine Mühe 🙂
Leider bekomme ich jetzt einen Fehler angezeigt:

File “Siri.py”, line 1
from SiriAPI8.SiriAPI import os def ^

SyntaxError: invalid syntax

Paco
9 years ago
Reply to  Paco

Das “^” zeigt auf das “t” von “import”

Paco
9 years ago
Reply to  robin

Ok, aber jetzt bekomme ich erneut einen Error:

File “Licht.py”, line 5
resultcode = os.system(“sudo ./send 00000 2 1″)
^
IndentationError: expected an indented block

Paco
9 years ago
Reply to  robin

Das Zeichen zeigt auf das “e” bei “resultcode”

Paco
9 years ago
Reply to  robin

Ja ich weiß, es wäre total dämlich jetzt jeden einzelnen Fehler hier zu posten. Ich habe einfach den Code verwendet, den Martin mir geschrieben hat, aber jetzt meckert er schon wieder wegen dem ./send da der Punkt vor dem Befehl anscheinend nicht funktioniert (invalid character) :/

fabo
8 years ago
Reply to  robin

Korrigiere mal alle ” und ‘ in dem Code, dann funktioniert es. Mir hat es weiter geholfen, Danke dafür!

Phil
9 years ago

Super Projekt.
Nur da ich halt Windows Nutzer hat SiriApi8 bei mir nicht so ganz funktioniert.
Aber anhand deines Python Scriptes konnte ich eine Funktionierende Windows Version mit C# programmieren.

Werde ich evt demnächst auch auf GitHub stellen 🙂

Vielen Dank an dich & Mach weiter so!

Phil
8 years ago
Reply to  robin

Naja, macht ja nichts.
Habe inzwischen sogar noch ein wenig rumprobiert und nun Zwei weitere Wege unter Windows gefunden wie man Siri umleiten und somit eigene Befehle ausführen kann, manchmal braucht man nur einwenig Hilfestellung, die ich dank deines Skriptes hinbekommen habe 🙂

Jens
9 years ago

Nur mal so eine Idee um dein Hack auszubauen…

Da man für die Notizen ja ein Standartkonto angeben kann, könnte man ja z.B. auf einem RaspberryPi ein Server aufsetzen und dann die Notes darauf einrichten – im Prinzip dann ein dauerloop nach neuen Notes machen und sofort das Command ausführen – würde die zeitliche Verspätung durch die Nutzung vom IMAP deutlich reduzieren.

Jens
9 years ago
Reply to  Jens

Würde z.b. über Dovecot möglich sein. Eine andere Möglichkeit wäre es natürlich anstatt Notizen direkt mit e-mails zu arbeiten – obwohl da die Siri Befehle echt lang würden, wäre es bei Postfix z.b. möglich ein postalias einzurichten, so dass jede e-mail an einen bestimmten account direkt als script ausgeführt würde und erst gar nicht als E-mail im Postfach landet. Z.b. /etc/aliases siri: “|/siriAPI/script” Im script selber müsste dann aber sau viel regxp laufen, denn der gesamte Inhalt der e-mail inkl. Headers würde als stdin ankommen. Dann einen Eintrag im Adressbuch der z.B. “Mich” heisst und die e-mail hinterlegt hat –… Read more »

Tobias
8 years ago

Erstmal geniale Idee, das so zu machen! Und nun zu meiner Frage. Die Anmeldedaten werden ja nicht verschlüsselt übertragen? Richtig?

Tobias
8 years ago
Reply to  robin

Ok! Ne ich habe deinen Code nicht angeschaut. 🙂 Aber Danke für die rasche Antwort!

Jannis
8 years ago

Hallo Robin,

SiriAPI8 funktioniert Super!!! Vor allem ist das ja eigentlich nicht Siri abhängig und kann also auch auf älteren iPhones usw. genutzt werden. DANKE!! 🙂

Nun eine Frage: Kann SiriAPI8 auch selber Notizen anlegen?
Eine feedback von SiriAPI8 wehre manchmal nämlich schon praktisch. (Ob ein Prozess z. B. erfolgreich abgeschlossen wurde)

MfG
Jannis

Norbert
8 years ago

Hallo Robin,
klasse Arbeit – bin echt begeistert wie gut das funktioniert!
(nutze SiriAPI8 mit FHEM). Einzig das mit den Umlauten
hab ich noch nicht zum Laufen gebracht – ist hier schon
eine Lösung in Sicht?

Norbert
8 years ago
Reply to  robin

Hallo Robin, den Tip von Andreas mit der UTF-8 Umwandlung hab ich schon ausprobiert – hat bei mir leider nicht funktioniert. Evtl. weil ich nicht konsequent alle Dateien umgewandelt habe…

Aber vielleicht kann ja Andreas nochmal Details dazu geben, wie er’s gemacht hat.

Wär schon super wenn das noch klappen würde. Arbeitszimmer für Büro geht ja noch, bei Küche wird’s schon schwieriger…

Tom
8 years ago

Hallo in die Runde,
ich bin ziemlich frisch mit Python unterwegs. Alles hat super geklappt aber wenn ich example.py starte läuft es durch bis imaplib. Dann kommt “imaplib.error: SEARCH command error: BAD [‘Invalid Search criteria’]”. Habe es auf nem Mac installiert. Python 3.5. Lief auch alles sauber durch. Kann mir bitte jemand helfen. Bin am verzweifeln. Danke im Voraus.
Tom

Peter Müller
8 years ago

Irgendwo habe ich es schonmal gefuden, aber ich finde es nicht mehr wieder.

Wo lässt sich nochmal die Zeit für den Abrufintervall ändern? Und was ist die min Zeit die bei SiriAPI funktioniert?

Peter Müller
8 years ago

Okay Danke! Ich werd mal ein bisschen rumprobieren.

Bei mir dauert es von der Befehlannahme bis zum ausführen ca. 5-12 sec. Dabei weiss man aber auch nicht wie schnell das iphone die notiz auf der cloud abgelegt hat. Muss ja garnicht mal an SiriAPI liegen.

Jan
8 years ago

Hallo Robin,

vielen Dank fürs Teilen deines Projektes! Ich komme leider mit meinen Credentials nicht in die Cloud. Habe es schon nur mit dem ersten Teil vor dem @icloud.com probiert, aber es funktioniert nicht. Kann es ggf. an der 2Factor Authentifizierung liegen?

Jan
8 years ago
Reply to  robin

Danke! Damit komme ich schon etwas weiter, bekomme aber nun Fehler mit dem Keyword. Ich schaue mir das erstmal an….

Jan
8 years ago
Reply to  robin

funktioniert jetzt…. man muss auch die richtige Python Version nehmen 🙂
pi@raspberrypi1 ~/SiriAPI8 $ python –version
Python 2.7.3
pi@raspberrypi1 ~/SiriAPI8 $ python3 example.py
8.0.2
Press any key…

Manu
8 years ago

Hallo,
Wie bekomme ich das exaple.py in den Autostart?
Mit crontab -e hab ich es schon versucht, aber erfolglos!

8 years ago

Hi,

super API. Ich habe aber ein Problem. Wenn ich sie auf meinen PI und PI2 nutze, kommt nach mehreren Stunden folgende Meldung:

Exception in thread Thread-1:
Traceback (most recent call last):
File “/usr/lib/python3.2/threading.py”, line 740, in _bootstrap_inner
self.run()
File “/usr/lib/python3.2/threading.py”, line 693, in run
self._target(*self._args, **self._kwargs)
File “/home/pi/SiriAPI8/SiriAPI8/SiriAPI.py”, line 81, in __fetch
email_message = email.message_from_bytes(raw_email)
File “/usr/lib/python3.2/email/__init__.py”, line 48, in message_from_bytes
return BytesParser(*args, **kws).parsebytes(s)
File “/usr/lib/python3.2/email/parser.py”, line 135, in parsebytes
text = text.decode(‘ASCII’, errors=’surrogateescape’)
AttributeError: ‘int’ object has no attribute ‘decode’

Hast Du da eine Idee?
Danke.
Mfg
Basti

8 years ago
Reply to  robin

Hi,

ist die Version 8.02.
Momentan behelfe ich mir damit, dass ich stündlich einen Restart des Scriptes mache .. Dirty, aber geht ….

Mfg
Basti

tom
8 years ago

Gibt es mitlerweile eine möglichkeit, dass die Skripte automatisch im Hintergrund beim systemstart auf dem Raspberry Pi gestartet werden ?

Robert
8 years ago
Reply to  robin

Hi Robin,
Die Idee ist toll und es lief auch super unter IOS8.
Hast du eine Ahnung warum die Inbox “Notes” plötlich einfach leer ist?

AL
8 years ago

Hi Robin,

leider kann ich es nur bestätigen. Ich habe soeben iOS9 installiert und nichts geht mehr. Ich könnte echt kotzen. Das war total super. Mit dem Mopped nach Hause gekommen und eben mal der Haussteuerung gesagt, dass die Garage zu öffnen ist. Ich würde mich total freuen, wenn Du einen Weg finden könntest unter iOS9.

Viele Grüße
AL

[…] Beitrag ist eine Ergänzung zum Beitrag SiriAPI8 – Siri API für iOS 8. Dieser sollte zum besseren Verständnis vorher gelesen […]