Sendet bei Änderung die neue externe IP-Adresse per E-Mail.
Wie tut er es?
Ein Bash-Skript läuft alle 15 Minuten per Cronjob in einem Alpine-LXC-Container. Es prüft die externe IP über ifconfig.me, speichert sie in eine .txt Datei und vergleicht sie mit der letzten. Bei Änderung erfolgt der Versand per sendmail / ssmtp.
ssmtp
per „apk add ssmtp“ installieren config file anpassen unter „/etc/ssmtp/ssmtp.conf“
root: E-Mail-Adresse, an die System-Mails (z.B. von root) weitergeleitet werden
mailhub: SMTP-Server-Adresse mit Port (465 = SMTPS, verschlüsselt)
AuthUser: Benutzername für die SMTP-Authentifizierung
AuthPass: Passwort für die SMTP-Authentifizierung
UseTLS: Aktiviert TLS/SSL-Verschlüsselung
FromLineOverride: Erlaubt das Überschreiben der Absenderadresse beim Senden
Script
#!/bin/bash
# Pfad zur Datei, in der die letzte IP-Adresse gespeichert wird
IP_FILE="/home/ipchange/last_ip.txt"
# E-Mail-Empfänger
EMAIL_RECIPIENT="asdf@asdf.ch"
# Absender-E-Mail
EMAIL_SENDER="asdf@asdf.ch"
# Aktuelle externe IP-Adresse abfragen
CURRENT_IP=$(curl -s ifconfig.me)
# Prüfen, ob die Datei mit der letzten IP existiert
if [ -f "$IP_FILE" ]; then
LAST_IP=$(cat "$IP_FILE")
else
LAST_IP=""
fi
# Vergleich der IP-Adressen
if [ "$CURRENT_IP" != "$LAST_IP" ]; then
echo "IP-Adresse hat sich geändert:"
echo "Alte IP: $LAST_IP"
echo "Neue IP: $CURRENT_IP"
# E-Mail-Inhalt erstellen (mit Headern)
(
echo "To: $EMAIL_RECIPIENT"
echo "From: $EMAIL_SENDER"
echo "Subject: Externe IP-Adresse hat sich geändert"
echo ""
echo "Die externe IP-Adresse hat sich geändert."
echo ""
echo "Alte IP: $LAST_IP"
echo "Neue IP: $CURRENT_IP"
) | sendmail "$EMAIL_RECIPIENT"
# Neue IP-Adresse speichern
echo "$CURRENT_IP" > "$IP_FILE"
else
echo "IP-Adresse unverändert: $CURRENT_IP"
fi
Ich nutze InfluxDB 2.7 zusammen mit OpenHAB, beide laufen in separaten Docker-Containern. OpenHAB schreibt fleissig Messwerte, aber manchmal möchte man nachträglich historische Daten hinzufügen, korrigieren oder löschen. In der „neuen tollen GUI“ von 2.7 gibt es jedoch keine direkte Möglichkeit, Messwerte zu löschen oder zu bearbeiten.
Ein Downgrade auf InfluxDB1.* und Chronograf habe ich zwar versucht (dort hat das damals nämlich „einfach so“ funktioniert) aber klappte schlussendlich nicht wegen den Daten die ich nicht migrieren konnte sowie der Chronograf der einfach nicht starten wollte.
Einen halben Tag damit versauert und entnervt aufgegeben mit dem Gedanken, den Scheiss nie mehr anzufassen.
New Day, New Trys…
Aber, am nächsten Tag: nächster Versuch gestartet. Diesmal Daten per CSV eintragen (das hab ich nämlich damals mit 1.8 und Chronograf einfach so gemacht). Jetzt mit einer neueren Version von Influx sollte das ja noch viel einfacher sein! Doch egal was ich tat – immer Fehlermeldungen. Immer mit dem Hinweis, man solle doch den Raw-Import versuchen. „Ja wiedenn?!?“ Kein Button, keine Infos, nichts was dir hilft. Ich dachte, die müssen die CLI meinen, also hab ich mich darauf ausgerichtet. Kurz gesagt: der Scheiss hat auch nicht funktioniert, immer Probleme mit dem Zeitstempel: Weder Epoch noch ISO noch RFC3339 wollten so wie ich. Am ehesten noch Epoch (Unix nanoseconds), aber auch da stimmten die Werte/Zeitstempel nie. Auch jede Zeile einzeln – keine Chance.
Line Protocol habe ich natürlich ebenfalls getestet, exakt nach Doku mit Headern und Metadaten – Fehlanzeige. Auch abgespeckte Varianten mit minimalen Headern funktionierten nicht. Also weiter mit CSV probiert, in der Annahme, das sei doch „einfacher“. War es nicht.
Nach einigen weiteren Stunden gab ich auf. Mein letzter Versuch war, in der GUI eine LineProtocol-Datei hochzuladen. Schlug natürlich fehl – trotz UTF-8 und LF (alle drei Varianten getestet) als Zeilenende. Doch dann, die Wendung die alles veränderte: „Enter manually“ Ausprobiert:
<measurement> value=123 <19stelligerZeitstempel>
SIMPLE AS FUCKING THAT
Enter. Akzeptiert. Korrekt drin. Bier aufgemacht. Rest der Daten genauso eingegeben. (Export aus LibreOffice Calc mit der Zellenformatierung *“value=“#* als CSV mit Leerzeichen-Trenner, in Notepad++ geöffnet, alles kopiert, im GUI eingefügt, Enter → alle Einträge drin.)
Natürlich…
habe ich hier nicht alles dokumentiert – ursprünglich wollte ich über den ganzen Frust noch ausführlicher ranten, inklusive meiner Abstecher in Python-Skripte, die einem den Import erleichtern würden, die API mit der das auch geht, und warum ich das alles dann doch nicht nutzte. Früher™ in InfluxDB 1.* war das in meiner Erinnerung einfacher.
Ich frage mich schon, warum die Entwickler von Influx sich nicht ein Beispiel an eben diesen Scripten nehmen und das direkt in ihr Produkt einbauen… Dann wäre doch allen geholfen?
Aber: Ich habe meinen Weg gefunden – und das wollte ich hier festhalten, vielleicht hilft es ja irgendwem der einfach nicht weiterkommt.
TL;DR
Um einige historische Daten in influxDB2.7 zu bekommen würde ich die GUI -> Load Data -> Lineprotocol -> Enter Manually verwenden.
Docker Container interaktiv (Shell) ausführen (auch wenn euch die KI sagt, man solle hintendran anstatt /bin/bash -> influx schreiben, funktioniert nur in influx1.* richtig)
docker exec -it <containername> /bin/bash
Login in die InfluxDB GUI
Falls Benutzer/Passwort unbekannt sind: in der docker-compose.yml oder den ENV-Variablen nachschauen. In der GUI anmelden → oben links auf den Namen klicken → About.
Org: manchmal funktioniert die ID, bei mir brauchte ich den Klartext-Namen.
Token: unter Load Data → API Tokens abrufbar. Bei Bedarf neuen Token anlegen und später wieder löschen.
dort drin konnte ich schnell überprüfen ob die Werte reingeschrieben wurden. Zuerst mit „use <db>“ die Datenbank/Bucket auswählen, dann mit „SELECT * FROM _measurement“ anzeigen lassen (aktualisiert sich nicht von selbst, mit q raus und Pfeil nach oben, Enter = neue Daten), oder mit drop eben das ganze measurement löschen.
Linux läuft als Server bei mir tipptopp: stabil, zuverlässig und spannend. Besonders als Smarthome-Zentrale auf dem Raspberry Pi sind die Möglichkeiten nahezu unbegrenzt. Terminal-Kenntnisse sind dabei klar von Vorteil aber kein muss.
Aktuell nutze ich OpenHAB mit eigenen Rules, angebundene Datenbanken (InfluxDB u.a.) und grafische Aufbereitung über Grafana.
Als Medienplayer
Auch als Medienplayer überzeugt Linux vollständig. Egal ob Debian, openSUSE, Mint oder andere Distributionen – alles läuft schnell, flüssig und ohne weitere Probleme. Zurzeit setze ich auf openSUSE Tumbleweed, möchte aber bald CachyOS ausprobieren. Ich bin gespannt auf die Erfahrungen.
Als Arbeitsstation
Noch ist Linux bei mir nicht die Haupt-Workstation. Wie viele habe auch ich die bekannte Ausrede: „Ich brauche Software X, die nur unter Windows oder macOS läuft.“
Mein Plan: genau diese Software künftig in einer Windows-VM unter Linux nutzen – und damit den letzten Schritt machen.
Als Windows-Ersatz auf Altgeräten
Viele meiner Kunden möchten nicht gezwungen werden, ihren PC zu ersetzen, nur weil Microsoft sagt, Windows 11 läuft sonst nicht.
Meine Empfehlung: Linux Mint (oder eine andere, gängige Distri) installieren. Läuft stabil und hatte bisher keine Probleme. Die Umstellung ist gering im Vergleich zu den Umstellungen, die wir erfahren durften – von Windows XP auf 8, auf 10 und von 10 auf 11, oder all die spannenden „Featureupdates“ die uns Microsoft in den Arsch bläst.
Gerade wenn man ohnehin schon Firefox, Thunderbird und LibreOffice als Büro-Anwendungen verwendet, ist der Wechsel problemlos. Natürlich läuft auch Chrome unter Linux, also ist man überall gut versorgt.
Gaming unter Linux
Das Steam Deck hat gezeigt: Linux kann Gaming. Dank Proton laufen mittlerweile die meisten Windows-Spiele problemlos unter Linux. Steam macht die Installation kinderleicht – einfach installieren und spielen. Viele native Linux-Spiele laufen sogar besser als unter Windows.
Einzig Anti-Cheat-Systeme machen noch Probleme, aber auch hier tut sich einiges. Für Gelegenheitsspieler ist Linux längst gaming-tauglich.
Hardware-Unterstützung
Früher war Hardware-Support unter Linux ein Glücksspiel. Heute? Die meiste Hardware läuft out-of-the-box. Drucker, WLAN, Grafikkarten – alles wird meist automatisch erkannt.
Besonders praktisch: Alte Hardware bekommt unter Linux ein zweites Leben. Während Windows 11 moderne Hardware voraussetzt, läuft Linux flott auf 10 Jahre alten Rechnern.
Kosten
Linux ist kostenlos. Punkt. Keine Lizenzgebühren, keine Zwangs-Updates, keine geplante Obsoleszenz. Ein 500-Franken-Laptop mit Linux kann jahre- oder jahrzehntelang genutzt werden.
Shift+F10 -> CMD -> OOBE\BYPASSNRO -> Einrichtungsassistent/Computer startet neu
Später: „Ich habe kein Internet“ auswählen (ist ein Text-„Button“) Die Tastenkombi für den Backslash wäre: Alt+92
Ich bin mir noch nicht ganz sicher, wie die Zukunft betreffend Betriebssystem aussieht. Ich weiss auch nicht wie sehr sich Windows 11 noch verändern wird, aber der aktuelle Kurs von Microsoft ist für mich schon eher fragwürdig.
Da hats McKay ganz treffend gesagt in Stargate Atlantis, Staffel 3 Episode 1…
Vor rund drei Monaten habe ich einem Kunden den Lenovo M70t Gen 5 verkauft und das System eingerichtet. Alles lief zunächst problemlos.
Doch seit etwa fünf Tagen gab es massive Startprobleme: Noch bevor das Lenovo-Logo erscheint, vergehen bis zu 40 Sekunden. Danach dauert es gefühlt ewig, bis der PC überhaupt einsatzbereit ist. Der Windows-Start selbst geht zwar schnell (5–10 Sekunden), aber das BIOS/UEFI scheint teilweise komplett zu hängen.
Bootversuche über USB-Stick halfen nicht – das Problem liegt klar vor dem OS. Teilweise wurde keine Hardware erkannt, der Start brach mit „No OS found“ ab. Warum er trotz deaktiviertem Network-Stack im Netzwerk nach einem OS sucht ist ein weiteres Mysterium.
Ein Firmware-Update wurde versucht, schlug aber fehl, da die Datei nach dem Neustart nicht mehr gefunden wurde. Kein Wunder wenn das Teil nicht das macht, was es will. Zurücksetzen der UEFI-Einstellungen brachte keine Verbesserung. Auch andere Anpassungen blieben wirkungslos.
Ich bin enttäuscht – von einem Business-PC hätte ich mehr erwartet.
Problemlösung
Ich habe dann noch eine Funktion im UEFI gefunden: „Zurückstellen auf Werkseinstellung“ – nicht zu verwechseln mit „Defaults laden“, das war ein eigener Unterpunkt. Klang erstmal klug. Beim Auslösen kam eine Warnung: TPM und das „Absolute Persistence® Module“ werden nicht zurückgesetzt. Dachte mir, passt schon – TPM sollte eh erhalten bleiben, und von APM hatte ich bisher nie gehört, und wenns ja eh nicht verändert wird dann isses ja Wurscht.
Also weiter. Der PC startete neu, und sofort merkte ich: Es geht schneller. Aber nicht etwa zum Lenovo-Logo – nein, er piepste zweimal und machte gleich nochmal einen Neustart. Das Ganze liess ich viermal zu und dachte: „dat mus so“.
Aber dann kam die Ernüchterung: Ich hatte den PC erfolgreich kaputt-repariert.
Die Seriennummer und der Machine-Type fehlten „plötzlich“ im BIOS. Und offenbar kann der PC ohne diese Infos nicht mehr starten.
Wie wäre es Lenovo: DIESER FUCKING HINWEIS könnte man doch auch noch in die vorigen Warnung schreiben können?! Herrgottnochmal.
Natürlich kann man die Seriennummer nicht einfach eingeben, nein… PC Schrott? Garantieeinsendung? Ich brach den Kundenbesuch ab, gönnte mir ein Bierli und nahm die Kiste mit zurück in die Werkstatt. Dort stand sie nun. Und ich verbrachte die Nacht damit, über mögliche Lösungswege nachzudenken.
Problemlösung, die zweite
Wie ich herausfand, muss man einen bootbaren Datenträger erstellen, darauf das Flash-Utility (für BIOS-Updates z. B.) bereithalten, und kann dann im richtigen Moment die passenden Befehle eingeben, um Seriennummer und Machine-Type zu aktualisieren. Hier ein Link zur Lenovo-Seite, die das beschreibt: Link
Da ich sowieso ein Firmwareupdate machen wollte, nutzte ich gleich diese Gelegenheit. Firmware geladen, USB-Stick erstellt, TPM im BIOS deaktiviert (sonst läufts nicht), vom Stick gebootet und das Update gestartet.
Zu meiner Erleichterung fragt das Tool direkt, ob man Seriennummer und Machine-Type anpassen will – hab ich natürlich gemacht. Die Seriennummer fand ich auf der Lieferantenrechnung (9-stellig, fast die gleiche die physisch auf dme Gerät aufgeklebt ist, aber mit „S“ davor). Als Machine-Type trug ich „ThinkCentre M70t Gen 5“ ein.
Update lief durch, PC startete wieder normal. Danach ins BIOS, TPM wieder aktiviert, Bootreihenfolge und Einstellungen angepasst – und:
Juhuu, PC läuft.
Etliche Tests weiter, Stresstest CPU, RAM und GPU sowie HDD I/O und einige male Standby und wieder zurück, das Teil läuft immer noch wie es sollte. Bin gespannt ob sich das Problem nun erledigt hat, oder ob ich in ein paar Monaten wieder wegen so einem Mist ausrücken muss.
TL;DR
Lenovo M70t Gen 5, nach 3 Monaten plötzlich massive UEFI-Probleme. Boot dauerte ewig, teilweise kein OS erkannt. Firmware-Update schlug fehl, UEFI-Reset machte alles schlimmer – Seriennummer und Machine-Type gelöscht, PC startete gar nicht mehr. Lösung: BIOS-Tool auf Stick, Infos manuell nachgetragen, Firmware erfolgreich geflasht. Jetzt läuft er wieder.
Lenovo, get your shit together.
Auszug der Problemlösung wegen SN/MachineType der Lenovo Seite, falls die das mal löschen oder der Link nicht mehr aktuell ist:
The system machine type and model (MTM), serial number, or system brand ID in the BIOS menu can be corrected through a command line program in the system BIOS flash utility. Refer to the instructions below.
From the Lenovo support site, search for the applicable system BIOS Package for the system, and download the USB Drive/DOS flash program (.zip file).
If using the USB Flash Package with the amidedos.exe tool:
Create the DOS bootable memory key and unzip the contents of the USB BIOS Flash package to the key.
Power on the system and make sure the device with the flash program is selected as a boot device.
Use the below commands to flash the machine type and model, serial number, or system brand ID in BIOS:
To flash machine type and model: amidedos.exe /sp “String”
To flash serial number: amidedos.exe /ss “String”
To flash system brand ID: amidedos.exe /sv “String”
“String” is the target MTM, SN and System Brand ID.
The following command line shows how to update the machine type and model number to 1234567:
amidedos.exe /sp “1234567” Note: The MTM is typically ten characters in length.
To update the System Brand ID for ThinkCentre M900, for example:
amidedos.exe /sv "ThinkCentre M900"
Reboot the system after the update is complete.
If using the USB Flash Package with the amideefix64.efi tool:
Format a USB key FAT32 and unzip the contents of the USB BIOS Flash package to the key.
Boot to the key and press Esc immediately when the message Press ESC in 5 seconds to skip startup.nsh or any other key to continue appears onscreen.
Once the Shell> prompt appears, run the commands below to flash the machine type and model, serial number, or system brand ID in BIOS.
To flash machine type and model: amideefix64.efi /sp “String”
To flash serial number: amideefix64.efi /ss “String”
To flash system brand ID: amideefix64.efi /sv “String”
“String” is the target MTM, SN and System Brand ID.
The following command line shows how to update the machine type and model number to 1234567:
amideefix64.efi /sp “1234567” Note: The MTM is typically ten characters in length.
For System Brand ID for ThinkCentre M900:
amideefix64.efi /sv "ThinkCentre M900"
3. Reboot the system after the update is complete.
Mit Freude berichte ich über die erfolgreiche Modernisierung eines besonderen Webprojekts. Vor über sechs Jahren durfte ich für die Forensik Praxis Bern erstmals ihre bestehende Homepage überarbeiten. Nun, fast ein Jahrzehnt später, stand eine weitere umfassende Überarbeitung an, da die bisherige Version nicht mehr zeitgemäss war und sich einige Anforderungen geändert haben.
Die grösste Herausforderung lag für mich in der Branchenthematik, die mir nicht vertraut war. Trotz dieser Hürde gelang es, alle bestehenden Texte zu optimieren und mit relevantem Content zu ergänzen.
Besonders erfreulich war die schnelle und unkomplizierte Kommunikation, die einen effizienten Arbeitsprozess ermöglichte. Die Website präsentiert sich nun in einem zeitgemässen Design, ohne dabei ihre bewährte Grundstruktur zu verlieren. Es erfüllt mich mit Stolz, dass ich nach so vielen Jahren erneut das Vertrauen erhielt, die digitale Präsenz weiterzuentwickeln.
Diese langfristige Kundenbeziehung bestätigt meine Arbeitsweise und motiviert mich für zukünftige Projekte. Herzlichen Dank für diese bereichernde Zusammenarbeit!
Die zunehmende Bevormundung durch Windows: Ein kritischer Blick
In der Welt der Betriebssysteme vollzieht sich ein besorgniserregender Wandel. Was einst mit Windows XP als benutzerfreundliches System begann und sich über Windows 7 fortsetzte, hat sich zu einem regelrechten Datenhunger-Monster entwickelt. Microsoft zwingt seine Nutzer von Update zu Update, von Windows 10 zu Windows 11, ohne Rücksicht auf individuelle Bedürfnisse oder Präferenzen.
Die permanente Veränderung als Geschäftsmodell
Das neue Windows 11 verändert sich ständig. Updates bringen nicht nur Sicherheitsverbesserungen, sondern auch unerwünschte Funktionen und Werbung. Die Benutzeroberfläche wird regelmässig umgestaltet, was besonders für langjährige Nutzer frustrierend ist. Bemerkenswert ist, dass Windows 10 ursprünglich als „letztes Windows“ beworben wurde – heute wissen wir, dass dem nicht so ist.
Der Zwang zur Cloud
Microsoft drängt seine Nutzer regelrecht in die Cloud. Beim ersten Start werden wir mit Aufforderungen zur Account-Erstellung und Cloud-Nutzung bombardiert. Die lokale Nutzung wird zunehmend erschwert, obwohl viele Nutzer ihre Daten lieber lokal speichern möchten. Auch nach der normalen Nutzung des Systems kommen immer wieder PopUps und Bildschirmfüllende Aufforderungen doch noch die Cloud zu nutzen.
KI um jeden Preis
Der neueste Trend ist die Integration von künstlicher Intelligenz. Selbst wenn man einen Laptop mit spezieller NPU (Neural Processing Unit) erwirbt, lässt sich diese nicht ohne Online-Zwang und Microsoft-Account nutzen. Die beworbene „lokale KI“ bleibt immer noch unerreichbar. Ohne Abo und Account gehts halt trotzdem nicht.
Fazit
Windows entwickelt sich immer mehr von einem Werkzeug zu einem Datensammler. Die Bedürfnisse der Nutzer nach Privatsphäre, Kontrolle und Offline-Nutzung werden systematisch ignoriert. Statt auf Änderungen von Microsoft zu hoffen, liegt es an jedem Einzelnen, bewusste Entscheidungen zu treffen. Es sollte jedem Nutzer wichtig sein, was mit seinen persönlichen Daten geschieht. Als Alternative bieten sich Open-Source-Betriebssysteme wie Linux an, die ohne Datensammelei und Zwangsanbindung auskommen. Die Macht liegt bei den Nutzern – sie können und sollten durch ihre Systemwahl ein Zeichen setzen.
Die versteckten Kosten
Unerwähnt bleiben oft die wahren Kosten. Nicht nur die Lizenzgebühren belasten Nutzer und Unternehmen, sondern auch die enormen Umweltauswirkungen durch das Training der KI-Modelle. Die grossen Sprachmodelle zu trainieren fressen eine riesige Menge an Strom/Energie, aber darüber macht sich offenbar niemand Gedanken.
Noch gravierender sind die versteckten Produktivitätskosten: Studien zeigen (z.B. von Forrester Research), dass sich durch die stetige Änderungen auf OS-Ebene, gelernte und angewandte Arbeitsschritte unnötig verkomplizieren. Dies führt zu erheblichen Mehraufwendungen von Arbeitsstunden, sich neu einarbeiten, etc. nur um im Endeffekt endlich wieder auf dem Stand von vorher zu sein, ohne eine Effizienzsteigerung erfahren zu haben.
Täglich nutzen wir Computer – für Arbeit, Freizeit und Kommunikation. Doch während wir uns an proprietäre Software wie Windows gewöhnt haben, zahlen wir dafür nicht nur mit Geld, sondern auch mit unserer digitalen Selbstbestimmung. Es gibt jedoch eine Alternative, die beides bietet: Kontrolle und Kosteneinsparung. Open Source Software zeigt, dass moderne Computerwelt auch anders funktioniert.
Kosten:
Proprietäre Systeme wie Windows & Office:
Lizenzkosten für Betriebssystem
mittlerweile Jährliche Gebühren für Office-Programme
erzwungene Updates und Upgrades
Open Source:
Komplett kostenlos
Keine versteckten Gebühren
Kostenlose Updates und Programme
Kontrolle über Ihr System:
Windows:
Erzwungene Updates
Unerwünschte Änderungen der Oberfläche
Aufgedrängte Werbung und Browser
Automatische Datensammlung
Penetrantes Cloud-Nutzung-Angebot
Linux & Open Source:
Updates nur nach Ihren Wünschen
Stabile, gleichbleibende Oberfläche
Keine Datensammlung
Volle Kontrolle über Ihr System
Mit einer einmaligen professionellen Einrichtung nutzen Sie sofort alle wichtigen Programme – von Office bis Bildbearbeitung. Alles kostenlos und werbefrei.
Persönlicher Umstieg in die digitale Freiheit
Als selbstständiger IT-Berater unterstütze ich Sie gerne bei Ihrem Weg zu Open Source. Ich komme zu Ihnen nach Hause, richte alles individuell ein und zeige Ihnen in Ruhe die wichtigsten Funktionen. Ihre Daten und Dokumente übertrage ich dabei sicher auf das neue System. Kontaktieren Sie mich an – gemeinsam machen wir Ihren Computer wieder zu dem, was er sein sollte: Ihr persönliches Werkzeug.
Von Zeit zu Zeit entwickle ich massgeschneiderte Softwarelösungen, um den Alltag meiner Kunden zu erleichtern. Ein Kunde stand vor der Herausforderung, MP3-Dateien von YouTube herunterzuladen. Bisher hat er dies über verschiedene Drittanbieter-Websites getan. Da sich diese Seiten jedoch ständig ändern (oftmals, um mehr Werbung zu schalten), war dieser Prozess nicht mehr reibungslos.
Um dieses Problem zu lösen, habe ich ein einfaches Skript entwickelt, das den Download-Prozess vereinfacht und meinen Kunden von der Notwendigkeit befreit, sich auf Drittanbieter-Websites zu verlassen.
In der ersten Version des Programms versuchte ich, mit möglichst wenigen Bibliotheken auszukommen, um das Programm so schlank wie möglich zu halten. Der Benutzer musste den Browser öffnen, ein Video auf YouTube auswählen, die Adresse des Videos in mein Programm kopieren, auf Herunterladen klicken und den Speicherort der MP3-Datei auswählen. Nach dem Download war das Programm bereit für den nächsten Download.
Mir wurde schnell klar, dass dies nicht zielführend ist. Der Prozess war zu kompliziert. Benutzer, die in der Lage waren, diese Schritte auszuführen, konnten wahrscheinlich auch ohne mein Programm MP3-Dateien von YouTube herunterladen.
Daher habe ich das Skript weiterentwickelt, um den Prozess zu vereinfachen und benutzerfreundlicher zu gestalten. In der nächsten Iteration meines Programms konnte man es öffnen, ein Klick weiter öffnete direkt den Browser mit der youtube.com Domain und überwachte ab dann die Zwischenablage. Sobald erkannt wurde, dass es sich um eine korrekte Video-URL von Youtube handelt wurde diese weiter überprüft um zu sehen, ob sich eine mp3-Datei herunterladen lässt. Falls dies auch klappte wurde die Datei direkt heruntergeladen und im selben Verzeichnis, wo sich mein Programm befand, gespeichert. Firefox wurde automatisch geschlossen, nach erfolgreichem Download auch mein Programm um danach direkt ein Fenster zu öffnen, in welchem sich die mp3-Datei befand.
Grösste Unterschiede?
Erste Version (11-Schritte):
Programm öffnen
Firefox öffnen
Youtube öffnen
Video suchen
URL kopieren
Firefox schliessen
URL einfügen
herunterladen klicken
Speicherort auswählen
OK drücken
Programm schliessen
(suchen wo die mp3-Datei gelanden sein könnte…)
Zweite Version (4-Schritte):
Programm öffnen
Youtube klicken
Video suchen
URL kopieren
Kunde zufrieden, ich zufrieden und viel dazu gelernt, alles in allem wunderbar. Seither verstehe ich viel besser, warum Entwickler meistens am User vorbeiprogrammieren. Vieles, was aus meiner Sicht ja ganz klar und einfach ist sowie Möglichkeiten für Weiteres bieten würde, ist einfach nicht zielführend. Auf einem Windows-PC bei solch einem kleinen Programm auf Effizienz achten zu wollen ist zum Beispiel überhaupt nicht notwendig, da die Rechenpower der allermeisten Computer heutzutage gross genug ist auch „Murksprogramme“ wie meines auszuführen. Auch macht es keinen Sinn, weitere mp3’s herunterladen zu können, wenn er doch nur ein File will…
Script
import yt_dlp
import os
import tkinter as tk
import tkinter.filedialog as fd
import webbrowser
import pyperclip
import re
import subprocess
import psutil
import time
import sys
# globale Variablen
video_title = ""
filename = ""
# Funktion Youtube-öffnen
def open_website():
webbrowser.open_new("https://www.youtube.com/")
yt_open_status.config(text="\u2713", fg="light grey")
yt_linkcheck_status.config(text="\u2713", fg="orange")
yt_open.config(text="")
check_clipboard(counter_label)
open_website_button.config(state="disabled")
# Funktion zur Überwachung der Zwischenablage
def check_clipboard(counter_label):
current_clipboard = pyperclip.paste()
# Überprüfen, ob die Zwischenablage eine YouTube-URL enthält
if "youtube.com" in current_clipboard:
# Zwischenablage löschen
pyperclip.copy("")
# Video-Info abrufen (ist video? ist kürzer als 20min?)
youtube_url_regex = r"https?://(www\.)?youtube\.com/watch\?v=[\w-]+(&\S*)?"
if re.match(youtube_url_regex, current_clipboard):
with yt_dlp.YoutubeDL() as ydl:
try:
video_info = ydl.extract_info(current_clipboard, download=False)
except yt_dlp.utils.DownloadError:
# URL ist ungültig oder das Video ist privat/gelöscht
return
# Überprüfen, ob das Video kürzer als 20 Minuten ist
if "duration" in video_info and video_info["duration"] <= 1200: # = 20min x 60s
close_button.config(state="disabled")
global video_title
with yt_dlp.YoutubeDL() as ydl:
video_info = ydl.extract_info(current_clipboard, download=False)
try:
video_info = ydl.extract_info(current_clipboard, download=False)
video_title = video_info["title"]
except yt_dlp.utils.DownloadError:
return
# URL in das Benutzereingabefeld einfügen
url_entry2.delete(0, tk.END)
url_entry2.insert(0, current_clipboard)
counter_label.config(text="Bitte warten!", fg="green")
yt_linkcheck_status.config(text="\u2713", fg="green")
url_entry2.config(state="disabled")
close_firefox()
download_audio()
return
# Vorherige Zwischenablage speichern
previous_clipboard = current_clipboard
# Zähler aktualisieren
counter_label.config(text="Überwache Zwischenablage seit {} Sekunden.".format(counter_label.counter))
counter_label.counter += 1
# Zwischenablage jede Sekunde prüfen.
root.after(1000, check_clipboard, counter_label)
# Funktion zum Herunterladen der Audio-Datei
def download_audio():
global video_title
global filename
filename = fd.asksaveasfilename(filetypes=[("MP3 Dateien", "*.mp3")], initialfile=video_title)
url = url_entry2.get()
ydl_opts = {
'format': 'bestaudio/best',
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'mp3',
'preferredquality': '320'
}],
'outtmpl': filename,
}
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([url])
# Löschen der .webm-Datei
for file in os.listdir():
if file.endswith(".webm"):
os.remove(file)
close_button.config(text="Fertig")
if not filename.endswith(".mp3"):
filename += ".mp3"
exit_program()
# Funktion: firefox.exe beenden
def close_firefox():
while True:
firefox_procs = [proc.info['pid'] for proc in psutil.process_iter(['pid', 'name']) if proc.info['name'] == 'firefox.exe']
if not firefox_procs:
break
for pid in firefox_procs:
subprocess.run(['taskkill', '/T', '/F', '/PID', str(pid)])
time.sleep(1)
# Funktion eigenes Programm beenden
def exit_program():
global filename
if filename == "":
root.after(1000, root.quit())
else:
subprocess.Popen(r'explorer /select,"{0}"'.format(filename.replace("/", "\\")))
root.quit()
# __ ___________ ___________ ___________ ___________ ___________ ___________ ___________ ___________ __________
# GUI-Hauptfenster-Fenster erstellen
root = tk.Tk()
root.title("YouTubeDL")
# root.geometry("400x350+1300+10")
root.resizable(False, False)
# Reihe 1, Positionsnummer
label_1 = tk.Label(root, text="1.")
label_1.grid(row=1, column=0)
# Haken
yt_open_status = tk.Label(root, text="\u2713", fg="orange", font=("Arial", 16))
yt_open_status.grid(row=1, column=1)
# Button: Youtube öffnen
open_website_button = tk.Button(root, text="Youtube öffnen", command=open_website)
open_website_button.grid(row=1, column=2, pady=20)
# Beschreibung
yt_open = tk.Label(root, text="Lied suchen & Adresse kopieren")
yt_open.grid(row=1, column=3)
# Reihe 2, Positionsnummer
url_label = tk.Label(root, text="2:")
url_label.grid(row=2, column=0)
# Haken
yt_linkcheck_status = tk.Label(root, text="\u2717", font=("Arial", 16))
yt_linkcheck_status.grid(row=2, column=1)
# Eingabefeld Youtube-URL
url_entry2 = tk.Entry(root)
url_entry2.grid(row=2, column=2, columnspan=2, sticky="ew")
# Label für die Anzeige der Zwischenablage-Überwachung
counter_label = tk.Label(root, text="")
counter_label.grid(row=3, column=0, columnspan=4, sticky="ew")
counter_label.counter = 0
# Schließen-Button hinzufügen
close_button = tk.Button(root, text="Schließen", command=exit_program)
close_button.grid(row=6, column=0, columnspan=4, sticky="ew", pady=30)
# GUI ausführen
root.mainloop()
verwendete Bibliotheken
yt_dlp
Dies ist eine Bibliothek, die zum Herunterladen von Videos und Audiodateien von YouTube und anderen Video-Hosting-Websites verwendet wird. Sie bietet eine Vielzahl von Funktionen, einschliesslich der Möglichkeit, Metadaten zu extrahieren und Videos in verschiedene Formate zu konvertieren.
os
Diese Bibliothek bietet Funktionen für die Interaktion mit dem Betriebssystem. Sie wird in einer Vielzahl von Fällen verwendet, einschliesslich der Arbeit mit Dateien und Verzeichnissen.
tkinter
Dies ist eine Standardbibliothek für die Erstellung von grafischen Benutzeroberflächen (GUIs) in Python. Sie bietet eine Vielzahl von Widgets, einschliesslich Schaltflächen, Menüs und Textfelder.
tkinter.filedialog
Dies ist ein Modul innerhalb von tkinter, das Dialoge zur Dateiauswahl bereitstellt. Es ermöglicht Benutzern, Dateien und Verzeichnisse über ein GUI auszuwählen.
webbrowser
Diese Bibliothek bietet eine Schnittstelle zur Anzeige von Webdokumenten. Sie kann verwendet werden, um einen Webbrowser zu öffnen und eine bestimmte URL anzuzeigen.
pyperclip
Pyperclip ist eine plattformübergreifende Python-Bibliothek zum Kopieren und Einfügen von Text in die Zwischenablage.
re
Die re-Bibliothek in Python wird verwendet, um reguläre Ausdrücke zu verarbeiten. Mit regulären Ausdrücken können Sie Text auf komplexe Weise durchsuchen und manipulieren.
subprocess
Diese Bibliothek ermöglicht es Ihnen, neue Prozesse zu starten, mit ihren Eingabe-/Ausgabefehlern zu interagieren und ihre Rückgabecodes zu erhalten.
psutil
Diese Bibliothek wird verwendet, um Zugriff auf Systeminformationen wie CPU-Auslastung, Speicher, Festplatten, Netzwerk, etc. zu erhalten.
time
Die time-Bibliothek bietet Funktionen zur Arbeit mit Zeit, einschliesslich Funktionen zur Manipulation von Zeit und zur Umwandlung zwischen verschiedenen Zeitformaten.
sys
Diese Bibliothek bietet Zugriff auf einige Variablen, die vom Python-Interpreter verwendet werden, und auf Funktionen, die stark mit diesem interagieren. Sie wird oft für die Interaktion mit dem Python-Laufzeitsystem verwendet.
Das ganze habe ich dann per pyinstaller kompiliert und mit der ffmpeg.exe beim Kunden eingerichtet. Damit das Progrämmli nicht lange gesucht werden musste noch eine Verknüpfung auf dem Desktop und Tadaa!
so sahs aus.
Weiterentwicklung?
Leider nein. Ich denke für den Anfang habe ich hier genug rumgebastelt. Das Script funktioniert mittlerweile auch nicht mehr so wie gewünscht, ich nehme an dass es mit der yt_dlp-Bibliothek zusammenhängt. Ich mein, es hat noch nicht mal einen richtigen Namen ;)
RIP Werner Danke für deine jahrelange Freundschaft.
Erstellt das WLAN-Netzwerk und sendet das Signal direkt an die Geräte, wird meist vom Provider (Internet Service Provider wie Swisscom, Breitband, Quickline, etc.) bereitgestellt.
WLAN-Extender
Erweitert das WLAN-Signal indem ein neues generiert wird. SSID und Passwort können das selbe sein, sodass es den Anschein hat, es wäre nur ein WLAN. Das Endgerät wird sich trotzdem nur mit einem Verbinden. Gut dort, wo das bestehende WLAN gar nicht erst hinkommt und mit einem Kabel am best. Router/Switch verbunden werden kann. Ansonsten ist diese Variante nicht empfehlenswert, mag funktionieren, muss nicht.
Extender können auch AP (Access Point) oder Repeater genannt werden.
WLAN-Mesh-System
Besteht aus mehreren Komponenten die „intelligent“ miteinander kommunizieren und das Endgerät im WLAN von einer Station zur nächsten führen können.
Nachteil: man ist meist Herstellergebunden, da die es nicht gebacken kriegen Herstellerunabhängig miteinander eine intelligente Verbindung zu erstellen. In den neueren WiFi-Standards wären die Spezifikation dafür vorgegeben, nur will das keiner so implementieren. Sogar bei der freien Alternativen Firmware „OpenWRT“ ist es nicht einfach möglich einzurichten.
Beim WLAN-Mesh werden die Komponenten meist Satelliten genannt. Aber auch hier könnte man von AP oder Extender sprechen, machen ja genau das…
Spannende Frage
Aber aber… Die spannende Frage ist und bleibt unbeantwortet: Was soll ich denn nun tun/kaufen?
Wer „überall“ im Haus, Garten und in der Werkstatt gutes WLAN haben will und man sich auch des öfteren vom Büro in die Werkstatt bewegt, dabei auf dem Handy etwas streamt und partout keinen Ruckler will, dann braucht man ein gescheites Mesh-System. Ubiquiti nein, TP-Link (Deco-Reihe) ja. Andere Hersteller kenne ich noch nicht aus eigener Erfahrung. Fritz/AVM ist in meinen Augen zu teuer, daher auch nein, ausser man verwendet noch andere Funktionen der Fritze.
Bei mir ist eine Variante mit Fritz!Box am laufen. Zuerst nur das Modem, dann ein AP per Kabel, da das nicht gereicht hat ist jetzt dazwischen noch ein zusätzlicher Satellit per WLAN eingebunden, das deckt so ziemlich all meine Bedürfnisse ab. Allerdings, muss ich dazu sagen, musste ich erst das 5Ghz WLAN ausschalten, damit das Roaming gut genug funktionierte.