Find My iPhone / Wo Ist? / iPhone / iCloud / aktuellen Ort per WebAPI abfragen

Begonnen von Torxgewinde, 10 April 2022, 16:06:02

Vorheriges Thema - Nächstes Thema

eddy242

Hallo zusammen,

Patch habe ich angewendet, Secrets gesetzt, Method auf POST gesetzt. Trotzdem:
API_LAST_MSG
<hidden>: wrong authentication
API_LAST_RES
1665822598.65733


Was kann es sein? Danke!

erwin

ZitatWas kann es sein?

sorry, bin erst jetzt auf das Problem gestoßen...

Bei mir gleich! (wrong auth...) Offensichtlich hat Apple was an der API-geändert, letzter gültiger Wert vom 5/10 18:10:00
Weiß momentan auch keine Lösung.
l.g. erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

eddy242

Es hat sich was getan, zwar noch nicht zum besseren, aber immerhin. Vielleicht lässt sich die Response analysieren, was geändert werden muss?

API_LAST_MSG
invalid server response
API_LAST_RES
1667666086.79828

ReneR1986

Hallo zusammen,
hat noch einmal jemand versucht dem nachzugehen oder besteht kein Bedarf mehr?
Wollte mir ein paar AirTags kaufen. Wäre super, wenn man die Infos in FHEM bekommen würde  :D
Würde gern auch selber mal ein bisschen testen, allerdings bin ich noch nicht wirklich fit was JsonMod angeht.

erwin

Ja, hab ich versucht, die login Prozedur ist so komplex, ich durchschau das einfach nicht!
Es gibt ein JS script im web, das ist allerdings auch schon etwas älter. ich gehe davon aus, dass uns das nicht weiterhilft!

Interesse/Bedarf wär schon vorhanden,  es geht nicht um das knowhow v. HTTPMOD od. JSONMOD, sondern das apple-login zu verstehen....
Falls irgendwer eine Lösung findet, egal mit welcher Programmiersprache, kann man das sicher auch mit FHEM umsetzen....
l.g.erwin
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

ReneR1986

Hm OK,
hier ist es vermutlich nicht weniger komplex, oder?
https://www.icloud.com/

Oder läuft es am Ende eh auf den Link im obigen JsonMod raus..?

Das JS Script habe ich auch gesehen aber wie du sagst, es ist auch schon älter..

ReneR1986

Habe gerade auch noch gesehen, dass die Anmeldung über 2-Faktor Authentifizierung läuft.  :-\

erwin

ZitatOder läuft es am Ende eh auf den Link im obigen JsonMod raus..?
im Prinzip ja, mit einem zusätzlichen redirect.....
Ich hab offengestanden keine Idee wie man das login "nachbauen" könnte.
Da müsste sich ein JS / Browser experte finden!
Link zum Einstieg: https://www.icloud.com/find/
FHEM aktuell auf RaspberryPI Mdl 1-4
Maintainer: 00_KNXIO.pm 10_KNX.pm
User: CUNO2 (868 SLOWRF) - HMS100xx, FS20, FHT, 1-Wire  - 2401(iButton), 18x20, 2406, 2413 (AVR), 2450,..,MQTT2, KNX, SONOFF, mySENSORS,....
Hardware:  Busware ROT, Weinzierl IP731, 1-Wire GW,...

ReneR1986

Ich habe einen Workaround gefunden!
Hier kann man das über ein Python Script laufen lassen.
https://github.com/picklepete/pyicloud
Das ganze funktioniert auch mit 2-Faktor Authentifizierung.
Nach der ersten Anmeldung wird man nach der ID, also dem 2ten Faktor gefragt, der dann wie gewohnt auf dem Apple Device erscheint und der dann hier eingegeben werden muss. Bissher musste ich das nur einmal machen. Wie oft Apple danach fragt, weiß ich nicht.
Am Ende habe ich einen Cronjob laufen, der das Script stündlich ausführt.
Sicherlich nicht immer zuverlässig. Spätestens wenn erneut nach dem 2ten Faktor gefragt wird, muss man manuell wieder Hand anlegen. Bissher läuft es aber gut.

1. Abhängigkeiten installieren
pip install -r requirements.txt

requirements.txt

tzlocal==2.0.0
keyring==9.3.1
requests
keyrings.alt
click
certifi==2021.10.8
pyicloud
paho-mqtt


2.Phyton Script (Details siehe im Link oben)
EMAIL und PASSWORT anpassen.
Weiter unten die Werte beim Broker anpassen BROKERIP und Client ID bzw. Topics wenn gewünscht.


from pyicloud import PyiCloudService
from paho.mqtt import client as mqtt_client
import re

api = PyiCloudService('<EMail>', '<PASSWORT>')

if api.requires_2fa:
    print("Two-factor authentication required.")
    code = input("Enter the code you received of one of your approved devices: ")
    result = api.validate_2fa_code(code)
    print("Code validation result: %s" % result)

    if not result:
        print("Failed to verify security code")
        sys.exit(1)

    if not api.is_trusted_session:
        print("Session is not trusted. Requesting trust...")
        result = api.trust_session()
        print("Session trust result %s" % result)

        if not result:
            print("Failed to request trust. You will likely be prompted for the code again in the coming weeks")
elif api.requires_2sa:
    import click
    print("Two-step authentication required. Your trusted devices are:")

    devices = api.trusted_devices
    for i, device in enumerate(devices):
        print(
            "  %s: %s" % (i, device.get('deviceName',
            "SMS to %s" % device.get('phoneNumber')))
        )

    device = click.prompt('Which device would you like to use?', default=0)
    device = devices[device]
    if not api.send_verification_code(device):
        print("Failed to send verification code")
        sys.exit(1)

    code = click.prompt('Please enter validation code')
    if not api.validate_verification_code(device, code):
        print("Failed to verify verification code")
        sys.exit(1)
       
#print("Devices")
#print(api.devices)
print(api.iphone.location())


#Mqtt
broker = '<BrokerIP>'
port = 1883
topic = "location/ReneiPhone"
client_id = 'iCloud'
# username = 'xxx'
# password = 'xxx'

def connect_mqtt():
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client = mqtt_client.Client(client_id)
    #client.username_pw_set(username, password)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client


def publish(client):
    string = str(api.iphone.location())
   
    longitude_regex = re.compile(r"u'longitude':\s*([-+]?\d*\.\d+|\d+)")
    match = longitude_regex.search(string)
    longitude = match.group(1)
   
    latitude_regex = re.compile(r"u'latitude':\s*([-+]?\d*\.\d+|\d+)")
    match = latitude_regex.search(string)
    latitude = match.group(1)
   
    msg = latitude + "," + longitude
    result = client.publish(topic, msg)


client = connect_mqtt()
publish(client)