inital release

This commit is contained in:
Simon Rieger 2024-06-29 16:37:41 +02:00
commit 3a10ed38cc
8 changed files with 258 additions and 0 deletions

8
.env.example Normal file
View file

@ -0,0 +1,8 @@
ICLOUD_EMAIL=your_email@example.com
ICLOUD_PASSWORD=your_password
ICLOUD_2FA_CODE=your_2fa_code
DB_ROOT_PASSWORD=your_db_root_password
DB_HOST=mariadb
DB_USER=your_db_user
DB_PASSWORD=your_db_password
DB_NAME=wo_ist

3
.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
.env
keyring_data/
mariadb_data/

18
Dockerfile Normal file
View file

@ -0,0 +1,18 @@
# Basis-Image
FROM python:3.11-slim
# Git installieren
RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/*
# Arbeitsverzeichnis erstellen
WORKDIR /app
# Abhängigkeiten kopieren und installieren
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Skript kopieren
COPY script.py .
# Container-Einstiegspunkt
CMD ["python", "script.py"]

80
README.md Normal file
View file

@ -0,0 +1,80 @@
# iCloud Device Tracker
Dieses Projekt ermöglicht das Tracking von Geräten, Personen und Objekten über die Apple "Wo ist?"-Funktion und speichert die Standortdaten in einer MariaDB-Datenbank.
## Inhaltsverzeichnis
- [Installation](#installation)
- [Verwendung](#verwendung)
- [Umgebungsvariablen](#umgebungsvariablen)
- [Docker-Setup](#docker-setup)
- [Technologien](#technologien)
- [Lizenz](#lizenz)
## Installation
1. **Repository klonen**:
```bash
git clone https://github.com/dein-benutzername/icloud-device-tracker.git
cd icloud-device-tracker
```
2. **.env Datei erstellen**:
Erstelle eine `.env`-Datei im Stammverzeichnis und füge die folgenden Umgebungsvariablen hinzu:
```env
ICLOUD_EMAIL=your_email@example.com
ICLOUD_PASSWORD=your_password
ICLOUD_2FA_CODE=your_2fa_code
DB_HOST=mariadb
DB_USER=your_db_user
DB_PASSWORD=your_db_password
DB_NAME=wo_ist
```
3. **Docker-Container bauen und starten**:
```bash
docker-compose up --build
```
## Verwendung
- Starte das Projekt mit dem Befehl `docker-compose up --build`.
- Die Standortdaten werden in der Konsole angezeigt und in der MariaDB-Datenbank gespeichert.
## Umgebungsvariablen
- **ICLOUD_EMAIL**: Deine iCloud-E-Mail-Adresse.
- **ICLOUD_PASSWORD**: Dein iCloud-Passwort.
- **ICLOUD_2FA_CODE**: Zwei-Faktor-Authentifizierungscode für iCloud.
- **DB_HOST**: Hostname des MariaDB-Dienstes.
- **DB_USER**: Benutzername für die MariaDB-Datenbank.
- **DB_PASSWORD**: Passwort für die MariaDB-Datenbank.
- **DB_NAME**: Name der MariaDB-Datenbank.
## Docker-Setup
- **`Dockerfile`**: Enthält die Anweisungen zum Erstellen des Docker-Images.
- **`docker-compose.yml`**: Definiert die Dienste, Volumes und Umgebungsvariablen.
- **`requirements.txt`**: Listet alle Python-Abhängigkeiten auf, einschließlich `pyicloud`, `mysql-connector-python` und `keyrings.alt`.
## Technologien
- **Python**: Backend-Programmiersprache.
- **MariaDB**: Relationale Datenbank zur Speicherung von Standortdaten.
- **Docker**: Containerisierungstechnologie zur Verwaltung der Anwendungsumgebung.
- **ICloud**: Schnittstelle zur Apple "Wo ist?"-Funktion.
## Lizenz
Dieses Projekt ist unter der MIT-Lizenz lizenziert.
---
### Hinweise
- Stelle sicher, dass du alle erforderlichen Berechtigungen hast, um auf iCloud-Daten zuzugreifen.
- Die Verwendung von `keyrings.alt` speichert Passwörter im Klartext. In Produktionsumgebungen sollten sicherere Alternativen verwendet werden.

44
docker-compose.yml Normal file
View file

@ -0,0 +1,44 @@
version: '3.8'
services:
mariadb:
image: mariadb:latest
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASSWORD}
volumes:
- ./mariadb_data:/var/lib/mysql
#ports:
# - "3306:3306"
restart: always
networks:
default:
dns:
ipv4_address: 172.28.0.40
app:
build: .
environment:
ICLOUD_EMAIL: ${ICLOUD_EMAIL}
ICLOUD_PASSWORD: ${ICLOUD_PASSWORD}
ICLOUD_2FA_CODE: ${ICLOUD_2FA_CODE}
DB_HOST: ${DB_HOST}
DB_USER: ${DB_USER}
DB_PASSWORD: ${DB_PASSWORD}
DB_NAME: ${DB_NAME}
depends_on:
- mariadb
volumes:
- ./keyring_data:/root/.local/share/python_keyring # Persistenter Speicher für den Keyring
#restart: always
networks:
default:
dns:
ipv4_address: 172.28.0.41
networks:
dns:
name: dns
external: true

5
keyrings.alt Normal file
View file

@ -0,0 +1,5 @@
import keyring
from keyrings.alt.file import PlaintextKeyring
# Keyring auf Dateisystem setzen
keyring.set_keyring(PlaintextKeyring())

3
requirements.txt Normal file
View file

@ -0,0 +1,3 @@
pyicloud
mysql-connector-python
keyrings.alt

97
script.py Normal file
View file

@ -0,0 +1,97 @@
import os
import time
import logging
import keyring
from keyrings.alt.file import PlaintextKeyring
from pyicloud import PyiCloudService
import mysql.connector
from mysql.connector import Error
from datetime import datetime
# Logging konfigurieren
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# Keyring auf Dateisystem setzen
keyring.set_keyring(PlaintextKeyring())
# Datenbankverbindung prüfen
def connect_to_database():
while True:
try:
db = mysql.connector.connect(
host=os.getenv('DB_HOST'),
user=os.getenv('DB_USER'),
password=os.getenv('DB_PASSWORD'),
database=os.getenv('DB_NAME')
)
if db.is_connected():
logging.info("Erfolgreich mit der Datenbank verbunden.")
return db
except Error as e:
logging.error(f"Fehler beim Verbinden zur Datenbank: {e}")
logging.info("Erneuter Verbindungsversuch in 5 Sekunden...")
time.sleep(5)
# iCloud-Verbindung herstellen
icloud = PyiCloudService(
os.getenv('ICLOUD_EMAIL'),
os.getenv('ICLOUD_PASSWORD'),
cookie_directory='/root/.local/share/python_keyring'
)
# Zwei-Faktor-Authentifizierung
if icloud.requires_2fa:
code = os.getenv('ICLOUD_2FA_CODE')
if not code:
logging.error("Zwei-Faktor-Authentifizierung erforderlich. Kein Code gefunden.")
sys.exit(1)
result = icloud.validate_2fa_code(code)
if not result:
logging.error("Ungültiger Zwei-Faktor-Code.")
sys.exit(1)
logging.info("Zwei-Faktor-Authentifizierung erfolgreich.")
if icloud.requires_2fa and not icloud.is_trusted_session:
logging.error("Vertrauenswürdige Sitzung erforderlich.")
sys.exit(1)
# Datenbankverbindung herstellen
db = connect_to_database()
cursor = db.cursor()
# Tabelle erstellen, falls sie nicht existiert
cursor.execute("""
CREATE TABLE IF NOT EXISTS device_locations (
id INT AUTO_INCREMENT PRIMARY KEY,
device_name VARCHAR(255),
latitude DOUBLE,
longitude DOUBLE,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
)
""")
# Standortdaten abrufen
devices = icloud.devices
for device in devices:
location = device.location()
if location:
device_name = device['name']
latitude = location['latitude']
longitude = location['longitude']
timestamp = datetime.fromtimestamp(location['timeStamp'] / 1000)
# Koordinaten in der Konsole ausgeben
logging.info(f"Gerät: {device_name}, Latitude: {latitude}, Longitude: {longitude}, Zeit: {timestamp}")
# Daten in die Datenbank einfügen
cursor.execute("""
INSERT INTO device_locations (device_name, latitude, longitude, timestamp)
VALUES (%s, %s, %s, %s)
""", (device_name, latitude, longitude, timestamp))
# Änderungen speichern und Verbindung schließen
db.commit()
cursor.close()
db.close()