Archiv ‘IT’

Mittwoch, 27. März 2024

Headless Chrome verrät sich über seinen User Agent

Headless Chrome eignet sich wunderbar, wenn man Web-Seiten mittels über Cron Jobs aufgerufenen bash-Scripts automatisiert abrufen möchte.

In meinem Anwendungsfall sende ich mir an Werktagen um 9:00 Uhr jeweils das Mittagsmenu des örtlichen Metzgers per Email zu.

Dies tat ich bis vor einigen Wochen mittels wget, doch serverseitig hat irgendwas geändert, und das CMS und/oder der Serverbetreiber haben nun eine Landeseite vorgeschaltet, die überprüft, ob ein „realer“ Benutzer oder ein Bot auf die Seite zugreift.

Anstelle des gewünschten Seiteninhalts bekam ich so seither nur noch eine HTML-Seite mit viel komprimiertem JavaScript-Code zu sehen, welcher höchstwahrscheinlich für die Erkennung und Weiterleitung verantwortlich ist.

Headless Chrome half hier:

chromium --proxy-auto-detect --temp-profile --disable-gpu --headless --virtual-time-budget=5000 --dump-dom "https://www.mittagsmenu.com/" > "/tmp/mittagsmenu.html"

Die Option --virtual-time-budget=5000 ist super, denn sie gaukelt vor, dass nach dem Laden 5 Sekunden vergangen sind. Genug, um die Landeseite aufzurufen, die Checks durchlaufen zu lassen, und dann den tatsächlichen gewünschten Inhalt anzuzeigen.

Das funktionierte wunderschön bis vor einigen Tagen, als kein Menu mehr via Email eintraf. Irgendwie kam auch Headless Chrome nicht mehr über die Landeseite hinaus. Doch wieso?

Bald einmal kam ich darauf: Wird Headless Chrome wie oben aufgerufen, identifiziert sich der Browser als Headless laufender Chrome (!):

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/96.0.4664.110 Safari/537.36

Kein Wunder entdeckte und blockierte die Bot-Abwehr den Zugriff.

Zum Glück war die Lösung des Problems ganz einfach:

chromium --proxy-auto-detect --temp-profile --disable-gpu --headless --virtual-time-budget=5000 --dump-dom --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36" "https://www.mittagsmenu.com/" > "/tmp/mittagsmenu.html"

… und seither funktioniert das Script wieder wie gewünscht. Das Argument --user-agent="" war alles, was es dazu brauchte.

Selenium headless: How to bypass Cloudflare detection using Selenium half mir dabei auf die Sprünge.

Tags: , , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 17. März 2024

Wo ist der GRUB Bootloader alles installiert?

Vor einigen Wochen spukte eine SSD in einem meiner physischen Servern. Ich entschied mich, eine neue SSD zu kaufen, den kompletten Inhalt der alten SSD auf die neue SSD zu klonen, und dann die neue SSD als neue Festplatte in den Server einzubauen (die alte SSD wanderte ins Archiv).

Als ich gestern das Debian GNU/Linux auf diesem Server aktualisierte, bemerkte Debian, dass es auf einer neuen SSD lief, und fragte mich, wo ich den GRUB Bootloader überall installieren wollte (/dev/sda, das heisst auf der Festplatte selber, plus /dev/sda1, auf der ersten (Boot-)Partition).

GRUB war natürlich bereits installiert, sonst hätte der Server nach dem SSD-Wechsel nicht gebootet — aber vermutlich war in der GRUB-Konfiguration noch die Referenz auf die alte SSD enthalten und nicht auf die neue.

Überfordert entschied ich mich wie im Dialog angeregt, den Bootloader sowohl auf /dev/sda als auch /dev/sda1 zu installieren. Das sei die sicherste Methode.

Später dann fand ich nach einer mehrminütigen Internetsuche heraus, wie ich bei einem „baugleichen“ Server hätte nachschauen können, wo der Bootloader alles installiert ist:

# debconf-show grub-pc
  grub2/kfreebsd_cmdline:
  grub2/device_map_regenerated:
* grub2/linux_cmdline_default: quiet
  grub-pc/timeout: 5
* grub2/linux_cmdline:
  grub-pc/partition_description:
  grub2/kfreebsd_cmdline_default: quiet
* grub-pc/install_devices_disks_changed: /dev/disk/by-id/ata-SanDisk_SDSSDA120G_XXXXXXXXXXXX
  grub-pc/install_devices_failed_upgrade: true
  grub2/force_efi_extra_removable: false
  grub-pc/disk_description:
* grub-pc/install_devices: /dev/disk/by-id/ata-SanDisk_SDSSDA120G_XXXXXXXXXXXX
  grub-pc/kopt_extracted: false
  grub-pc/chainload_from_menu.lst: true
  grub-pc/postrm_purge_boot_grub: false
  grub2/update_nvram: true
  grub-pc/install_devices_failed: false
  grub-pc/install_devices_empty: false
  grub-pc/mixed_legacy_and_grub2: true
  grub-pc/hidden_timeout: false

Sprich: Nur auf /dev/sda.

Auf dem Server mit der ausgewechselten SSD schaut es nun halt leider so aus:

# debconf-show grub-pc
* grub-pc/install_devices: /dev/disk/by-id/ata-KINGSTON_SA400S37480G_XXXXXXXXXXXXXXXX, /dev/disk/by-id/ata-KINGSTON_SA400S37480G_XXXXXXXXXXXXXXXX-part1
  grub-pc/install_devices_empty: false
  grub2/force_efi_extra_removable: false
  grub-pc/install_devices_failed: false
  grub-pc/install_devices_failed_upgrade: true
* grub2/linux_cmdline:
  grub-pc/postrm_purge_boot_grub: false
  grub-pc/mixed_legacy_and_grub2: true
* grub-pc/install_devices_disks_changed: /dev/disk/by-id/ata-KINGSTON_SA400S37480G_XXXXXXXXXXXXXXXX, /dev/disk/by-id/ata-KINGSTON_SA400S37480G_XXXXXXXXXXXXXXXX-part1
  grub-pc/timeout: 5
  grub2/kfreebsd_cmdline:
  grub-pc/chainload_from_menu.lst: true
  grub2/update_nvram: true
  grub-pc/disk_description:
  grub-pc/hidden_timeout: false
  grub-pc/kopt_extracted: false
* grub2/linux_cmdline_default: consoleblank=60
  grub2/kfreebsd_cmdline_default: quiet
  grub-pc/partition_description:

Sprich: Man sieht, dass der Bootloader sowohl auf die Festplatte, als auch die erste Partition („part1“) installiert wird.

Tags: , , , , , , , , , , , ,
Labels: IT, Linux

Keine Kommentare | neuen Kommentar verfassen

Mittwoch, 31. Januar 2024

Firefox nervt mit Übersetzungs-Pop-Up

Man öffne about.config und wechsle browser.translations.automaticallyPopup auf false, um dem Spuk ein Ende zu bereiten.

Tags: , ,
Labels: IT, Web

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 28. Januar 2024

Lustige Sicht auf Machine Learning

Tags: , , , , ,
Labels: Funny, IT

Keine Kommentare | neuen Kommentar verfassen

Dienstag, 16. Januar 2024

Ein für allemal: rsync, und die mühseligen Slashes

Ganz wichtig, und eigentlich ganz einfach, aber ich mache es immer falsch:

SOURCE Source is the directory that is backed up. At least one source is required. A trailing slash on a source path means „copy the contents of this directory“. Without a trailing slash it means „copy the directory“.

DESTINATION Destination is the directory that source is copied to. Trailing slash on the destination directory doesn’t matter.

Quelle: ‎rsync_tutorial‎.md

Tags: , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 10. Dezember 2023

Email-Adresse lässt sich in der Grab App nicht speichern

Über Weihnachten geht es nach Asien, mit einem ersten Stop in Singapur, gefolgt von Bangkok, bevor ich schlussendlich das eigentliche Ziel Taipei erreiche.

Bei Recherchen im Internet habe ich herausgefunden, dass die Grab App für Transport und Essenslieferungen empfohlen wird.

Ich habe die App gestern installiert, mich erfolgreich mit meiner Schweizer Mobilfunknummer registriert — doch beim Speichern der nachträglich erfassten E-Mail-Adresse meldet die App:

Sorry, our server reported an error. Please try again later.

Lösen konnte ich das Problem nicht. Egal ob über WiFi (ich habe hier ein PiHole-ähnliches Setup, das manchmal für solche Probleme sorgt), oder 5G, die Fehlermeldung erschien immer und immer wieder.

Nun habe ich die E-Mail-Adresse über einen Umweg doch noch erfassen können: Unter „Account“ > „Settings“ besteht die Möglichkeit, die App mit einem PIN zu schützen. Diesen habe ich eingerichtet. Um die App entsperren zu können, wenn man den PIN vergessen hat, kann man entweder seine E-Mail-Adresse hinterlegen, oder die App mit einem Facebook- oder Google-Konto verbinden. Ich habe mich für E-Mail entschieden. Das Onboarding funktioniert hier problemlos, und nach der erfolgreichen Registration erscheint die E-Mail-Adresse im Profil.

Somit ein weiterer Stolperstein aus dem Weg geräumt.

Tags: , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 5. November 2023

Zum herumgeisternden NASA Greenscreen-Schwurbler Video

Was für ein Müll:

Wer solche Videos in aller Welt herumschickt und „glaubt“, was der Autor da behauptet, blamiert sich primär einmal selbst.

Und dass der Autor, angeblich „Kamerafachmann“, solchen Mumpiz verzapft … unentschuldbar. Ausser er ist als Fachmann auf dem Gebiet der Daguerreotypie steckengeblieben.

Was hier vorgeführt wird sind Artefakte der verlustbehafteten Kompression von Videostreams und Bildern (Stichwort: MPEG und JPEG), nicht mehr, nicht weniger:

Hier der Beginn einer Schulstunde, welche versucht, die Grundprinzipien der Datenkompression von Bildmaterial zu erläutern. Schade geht es dann nicht weiter:

Wenn man noch nie davon gehört hat, hätte man das mit 30 Minuten googlen und youtuben herausgefunden. Netter Versuch, aber ungenüged, bitte setzen.

Tags: , , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 15. Oktober 2023

Shelly: „The device is already owned by another user/account“

Da Shelly die Produktion des Shelly 2.5 vor einigen Monaten gestoppt hat, habe ich kürzlich über den Gebrauchtmarkt solche Schalter aufgetrieben. Ziel: Ich wollte die letzten drei elektrischen Rollladen in unserer Wohnung shelly-fizieren, respektive Smart Home-fähig machen.

Gestern war der Elektriker meines Vertrauens vor Ort und hat die Dinger installiert. Zuerst setzten wir die an den Strom angeschlossenen Shellys mit 10 Sekunden langem Druck auf den physischen Reset zurück (Gemäss Restaurar valores de fábrica shelly 2.5). Dann verband ich mich wie üblich mit dem iPhone auf den lokal bereitgestellten Access Point des Shelly, gab über das Web-Interface unter http://192.168.33.1/ die WLAN-Daten meines Netzwerks ein, und schloss die Konfiguration dann über den Browser meines Mac minis fort.

Als ich die Geräte in der Shelly iOS-App „adoptieren“ wollte, erschien folgende Fehlermeldung:

The device is already owned by another user/account

Zum Glück besass ich die Mobilnummer des Vorbesitzers. Ich kontaktierte ihn, und tatsächlich, innert ein, zwei Stunden führte er einen Factory Reset aus der Ferne durch. Die schlechte Nachricht: Die Shellys verlieren so natürlich die WLAN-Zugangsdaten wie auch die sonstige Konfiguration (bspw. wenn man die Inputs wegen der Verkabelung vertauschen muss, sowie die Kalibration, wie lange die Storen brauchen, um komplett hoch- oder runterzufahren). Die gute Nachricht: Nachdem ich sie erneut konfiguriert hatte, konnte ich diese meinem Shelly-Konto hinzufügen. Jetzt funktionieren sie wie gewünscht, und tadellos.

Eine Alternative könnte sein, dass der Vorbesitzer das Gerät einfach aus seiner App löscht (ungetestet): How to Remove a Dead Shelly Device from the App, was auch im offiziellen Forum so geraten wird: I cannot add Shelly device to the cloud. Error „Device owned by another user“ is registered. What should I do?

PS: Dieselbe Fehlermeldung erscheint auch bei einem anderen Problem: In älteren Geräten hat Shelly eine zu kurze eindeutige ID vergeben, und schlussendlich wurden auf Grund der grossen Nachfrage dann zwei Geräte mit derselben ID produziert. Erscheint bei Neugeräten diese Fehlermeldung, muss man die Firmware aktualisieren.

Das Vorgehen in diesem Fall ist hier dokumentiert: Shelly: The device is already owned by another user/account, sowie auch hier I cannot add Shelly device to the cloud. Error „Device owned by another user“ is registered. What should I do?.

Tags: , , , ,
Labels: IT, Smart Home

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 8. Oktober 2023

Überhitzendes iPhone 15 wegen „Frankenstein“-Apps

I question here why iOS allows any app to consume so many resources that it makes the device too hot to hold comfortably, but the bug was apparently Instagram’s. Same too with Uber. Real shocker that two apps made with a Frankensteinian mishmash of web and native UI toolkits would run amok, resource-wise.

Quelle: iPhone 15 OverheatGate Seems to Be a Nothingburger

Tags: , , , , ,
Labels: Apple, IT

Keine Kommentare | neuen Kommentar verfassen

Sonntag, 8. Oktober 2023

Jede Seite eines PDFs in eigenständige PDFs extrahieren

$ pdfseparate receipts.pdf %d.pdf

pdfseparate ist im Debian-Paket poppler-utils und im MacPorts-Paket poppler enthalten.

Tags: , , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen