Coronavirus – immer mehr Malware – Update-Ticker lieber selber basteln #MonthOfMaking

4 Kommentare Autor: Jürgen (jdo)

Es vergeht eigentlich kein Tag, an dem ich nicht irgendeinen Newsletter bekomme, der vor mehr Malware im Zusammenhang mit dem Coronavirus SARS-CoV-2. Er verursacht die Lungenkrankheit COVID-19, aber das dürften wirklich schon alle mitbekommen haben. Cyberkriminelle nutzen Zeiten wie diese aus, auch das ist bekannt. Vor allen Dingen mit Coronavirus-Tickern wird Schindluder getrieben. Die Apps zeigen teilweise sogar wichtige Infektionszahlen an, sammeln aber im Hintergrund Daten. Es sind auch diverse Erpresser-Apps im Umlauf, die Dein Gerät sperren und dann ein Lösegeld fordern. Keine der Maschen ist wirklich neu, nur dass sich das Thema eben zu Coronavirus geändert hat.

Natürlich wollen viele Leute auf dem neuesten Stand bleiben und sich informieren. Ich will in erster Linie wissen, ob die Zahlen steigen oder rückläufig sind. Einen Coronavirus-Ticker habe ich bereits für meinen Sense Hat gebastelt und Dir auch gezeigt, wie Du Dir mittels Apprise und Pushover Nachrichten von Deinem Raspberry Pi auf Dein Smartphone schicken lassen kannst. Natürlich funktionieren auch alle anderen Linux-Distributionen oder Systeme, auf denen Python läuft.

Das Ganze war mir aber nun ein bisschen zu auseinandergerissen. Deswegen hier ein spezieller Beitrag, wie Du Dir sehr einfach einen eigenen Ticker mit Raspberry Pi, Python, Apprise, Pushover, E-Mail oder Slack basteln kannst. Das Script fragt die weltweiten Daten ab und dann ein paar Länder. Du kannst recht simpel mehr oder weniger Länder hinzufügen.

Gegen den Lagerkoller

Hast Du einen Raspberry Pi oder eine andere Linux-Instanz, kannst Du Dir sehr einfach einen eigenen Coronavirus-Ticker basteln. Vielleicht hilft es auch gegen den Lagerkoller. Ein beschäftigtes Gehirn ist besser als ein gelangweiltes.

Hinweis: Der Artikel ist über ein paar Tage entstanden. Da die Zahlen so rasant ansteigen, scheinen die Screenshots nicht mehr aktuell zu sein. Aber auch das zeigt, wie ernst die Lage ist. Schütze Dich und andere! Halte Abstand – bleib daheim (und geh jeden 2. Tag joggen, ist ja noch erlaubt)!

Vorbereitungen

Ich gehe von einem Raspberry Pi aus, auf dem Raspbian Buster installiert und auf dem neuesten Stand ist. Wie Du die Nachricht an Dein Smartphone schickst, bleibt Dir überlassen. Ich nehme Apprise und Pushover. Ersteres ist kostenlos, zweiteres kostet einmalig circa 5 € pro Plattform und damit kannst Du pro Monat 7500 Nachrichten verschicken. Willst Du das nicht machen, kannst Du mit Apprise aber auch ein E-Mail verschicken oder viele andere Services nutzen. Ich zeige Dir hier die Methoden mit Pushover und E-Mail, sowie am Schluss die Möglichkeit mit Slack ohne Apprise.

Installierst Du Pushover via Google Play Store, gibt es die ersten 7 Tage kostenlos. Dann kannst Du testen, ob Dir das gefällt oder nicht. Du musst also die Katze nicht im Sack kaufen. Nach einer Registrierung öffnest Du die Website und findest Deinen Anwender-Schlüssel (Your User Key).

Pushover Schlüssel

Pushover Schlüssel

Im Anschluss erstellst Du unten auf der Seite noch eine Anwendung (Create an Application / API Token) und erhältst damit ein Token. Das brauchst Du später im Script.

Application erstellen – zum Beispiel Coronavirus Update

Application erstellen – zum Beispiel Coronavirus Update

Legst Du eine Application an, darfst Du auch ein Bild hochladen. Du wirst das später auf meinen Screenshots sehen. Nutzt Du Pushover auch für andere Projekte, wie einen Bitcoin-Ticker, ist eine visuelle Referenz sicherlich ganz nett.

Cfscrape verhindert, dass mit der Cloudflare-Bot dazwischenfunkt und eine Bestätigung will, dass ich ein Mensch bin. Ich weiß nicht, ob ich das bei den URLs hier bräuchte, aber ich benutze es in der Zwischenzeit immer. Das Verhalten von Websites und APIs kann sich immer ändern, vor allen Dingen, wenn viele Anfragen kommen. Mir scheint die Methode sicherer.

Apprise und cfscrape werden via pip installiert. Letzteres müssen wir zunächst unter Raspbian installieren. Diese drei Befehle erledigen die notwendige Software-Installation:

sudo apt install python3-pip
pip3 install apprise
pip3 install cfscrape

Damit ist das System vorbereitet und wir können uns schon mit dem Script beschäftigen.

Python Script für die Coronavirus-Updates

Das Script sieht wie folgt aus, ich erkläre im Anschluss, was es macht. Ich habe mein Script coronavirus-ticker.py getauft.

#!/usr/bin/python3

import json
import cfscrape
import apprise

scraper = cfscrape.create_scraper()

apobj = apprise.Apprise()
# Hier den Schlüssel und das Token für Pushover einsetzen, das @ ist wichtig!
apobj.add('pover://Apprise-Schlüssel@ApplicationToken')

# Eine weitere Instanz für die Benachrichtigung hinzufügen, hier GMAIL
apobj.add('mailto://ADRESSE:PASSWORT@gmail.com')

# Die Nachricht auch an Gmail schicken

# Daten für weltweite Zahlen
urltotal = 'https://covid19.mathdro.id/api'

# Daten für die einzelnen Länder / Regionen
urlcountry = 'https://covid19.mathdro.id/api/confirmed'

def check_data(url, country):
    cfurl = scraper.get(url).content
    data = json.loads(cfurl)
    global message
    if country == 'world':
        infected = data['confirmed']['value']
        recovered = data['recovered']['value']
        deaths = data['recovered']['value']
        message = 'Weltweit || Infiziert: ' + str(infected) + ' | Genesen: ' + str(recovered) + ' | Todesfälle: ' + str(deaths);
    else:
        for val in data:
            if val['countryRegion'] == country:

                infected = val['confirmed']
                recovered = val['recovered']
                deaths = val['deaths']
                # Die Nachrichten für die einzelnen Länder werden einfach aneinander gereiht
                message = message + '\n' + country + ' || Infiziert: ' + str(infected) + ' | Genesen: ' + str(recovered) + ' | Todesfälle: ' + str(deaths);

check_data(urltotal, country='world')
check_data(urlcountry, country='Germany')
check_data(urlcountry, country='Spain')


apobj.notify(
   body=message,
   title='Coronavirus-Update!',
)

Das Script benutzt die beiden URLs https://covid19.mathdro.id/api und https://covid19.mathdro.id/api/confirmed. Die erste Adresse gibt mir die weltweiten Daten. Die zweite URL enthält Daten zu den einzelnen Ländern und / oder Regionen. Willst Du viele Länder abfragen, ist es sicherlich effizienter, eine Liste zu übermitteln und nicht die Funktion für jedes Land separat aufzurufen. Bei meinen zwei Ländern ist mir das aber zu viel Aufwand.

Update: Im Kommentar wurde erwähnt, dass die Zeile cfurl = scraper.get(url).content.decode("utf-8")statt meiner notwendig war, da es sonst kein String zum Parsen gibt. Bei mir muss ich das nicht machen, komisch. Ich wollte es aber erwähnt haben, sollte es zu Problemen kommen.

Für die Nachrichten lasse ich die Resultate einfach aneinander anhängen, füge aber einen Zeilenumbruch ein. Dafür ist das \n zuständig.

Die Namen für die Länder bekomme ich aus der zweiten URL.

countryRegion ist für das Land zuständig

countryRegion ist für das Land zuständig

Ich könnte auch die Werte iso2 oder iso3 nehmen. Vielleicht wäre der Ländercode schicker, aber das kannst Du selbst entscheiden und entsprechend anpassen. Hier musst Du aber aufpassen, dass iso2 und iso3 nicht bei allen Ländern gesetzt sind. Einfach vorher nachsehen, welche Daten Du haben willst.

Bei Apprise legst Du einfach so viele Instanzen wie Du willst an, an die eine Benachrichtigung geschickt werden soll. In meinem Script ist noch eine Gmail-Adresse als Beispiel hinterlegt. Apprise unterstützt sehr viele verschiedene Services. Die lange Liste findest Du hier. Nun kannst Du selbst entscheiden, wie Du Dich benachrichtigen lassen willst. Verwendest Du bei Google einen mehrstufigen Verifizierungsprozess, dann musst Du zunächst ein App-Passwort anlegen.

Updates zum Coronavirus via E-Mail

Updates zum Coronavirus via E-Mail

Ein kosmetisches Problem habe ich allerdings. Verwende ich \n zeigt mir das E-Mail keine neuen Zeilen an. Verwende ich stattdessen <br> funktionieren neuen Zeilen im E-Mail, aber nicht mehr in der Android App. Mit reicht das Coronavirus-Update auf dem Smartphone und deswegen lasse ich E-Mail einfach weg. Weniger ist bekanntlich mehr und in diesem Fall eine gute Lösung. 🙂

Script ausführbar machen und Cronjob anlegen

Ich könnte das Script mit einem vorangestellten python3 aufrufen. Allerdings habe ich in der ersten Zeile der Datei hinterlegt, wer für den Aufruf zuständig ist. Daher kann ich die Datei einfach ausführbar machen und vom Terminal aus aufrufen.

chmod +x ./coronavirus-ticker.py

Damit die Nachrichten automatisch eintrudeln, lege ich mir einen Cronjob an.

crontab -e

Öffnet die Crontab und mir reichen ehrlich gesagt zwei Updates am Tag. Die nachfolgende Zeile führt das Script um 8 und 18 Uhr aus.

0 8,18 * * * /home/pi/coronavirus-ticker.py >> /dev/null 2>&1

Willst Du alle 3 Stunden ein Update bekommen, sieht das wie folgt aus:

0 */3 * * * /home/pi/coronavirus-ticker.py >> /dev/null 2>&1

Damit die Screenshots etwas befüllter aussehen, habe ich ein paar zusätzliche manuelle Aufrufe getätigt.

So sieht das Coronavirus-Update unter Android aus

Wird das Script ausgeführt, bekomme ich das Update zu den Coronavirus-Zahlen direkt auf den gesperrte Bildschirm geliefert. Das sieht wie folgt aus:

Update zu Coronavirus auf den gesperrten Bildschirm

Update zu Coronavirus auf den gesperrten Bildschirm

In der Pushover App selbst werden viele Nachrichten aufgehoben. Du kannst selbst einstellen, wann die Nachrichten gelöscht werden sollen.

Als ich nur in den Nachrichten verfolgt habe, sind mir die Zahlen gar nicht so bewusst geworden. Habe ich die Zahlen im Verlauf vor mir liegen, wird mir tatsächlich ein bisschen mulmig. Das sind nun auch nur die bekannten Fälle. Da will ich gar nicht an die Dunkelziffer denken.

Coronavirus verbreitet sich schnell

Coronavirus verbreitet sich schnell

Wer sich fragt, ob die Daten auch verlässlich sind. Sie stammen von der John Hopkins University, also ja. Es kommt natürlich immer auch auf die Länder selbst an, wie genau die Angaben deren Gesundheitsministerien sind.

Es geht auch mit Slack und ohne Apprise und Pushover

In einem Kommentar eines anderen Beitrags sagte Matthias, dass er langjährige Erfahrung mit Pushover hat und die Nachrichten mitunter sehr lange brauchen. Er benutzt nun Slack und das ist sogar kostenlos. Bisher habe ich keine Probleme mit Pushover gehabt und die Nachrichten kamen sehr akkurat.

Bei Slack habe ich die Erfahrungen gemacht, teilweise gar keine Mitteilung bekommen zu haben. Ich musste aber nicht sehr lange damit arbeiten. Deswegen habe ich mir auch die Methode mit Slack angesehen und dafür ist weder Apprise noch Pushover notwendig.

Es gibt mehrere Methoden, wie Du Nachrichten an Slack schicken kannst. Ich habe dafür einen Webhook verwendet, den Du aber zunächst erstellen musst. Du darfst Dir auch einen Channel aussuchen, in den gepostet werden soll. Wichtig ist die Webhook-URL, an die Du JSON-Payloads schicken kannst.

Webhook-URL für Slack

Webhook-URL für Slack

Die entsprechenden Parameter kannst Du nun in Deinem Python-Script benutzen. Die Änderungen sehen so aus:

import requests

…

# Am Ende des Scripts einfügen
headers = {'Content-type': 'application/json', 'Accept-Charset': 'UTF-8'}
dataslack = '{"channel": "#coronavirus-ticker", "text": "' + message + '"}'
response = requests.post('https://hooks.slack.com/services/DEIN-WEBHOOK', headers=headers, data=dataslack)

Danach passt Du das Script wie folgt an. Du musst requests am Anfang des Scripts importieren.

Die Zeilen, die mit apobj beginnen, kannst Du weglassen. Das gilt auch für die vier letzten Zeilen, die eine Nachricht via Apprise verschicken. Dafür fügst Du wie im Code-Block oben zu sehen ist, die drei Zeilen mit headers, dataslack und response am Ende des Scripts ein.

Mit meinem Script würde folgende Nachricht an den Channel #coronavirus-ticker geschickt.

Coronavirus-Update an Slack geschickt

Coronavirus-Update an Slack geschickt

Mit der Smartphone-App sieht das zum Beispiel so aus.

Slack App auf dem Smartphone funktioniert auch als Coronavirus-Ticker

Slack App auf dem Smartphone funktioniert auch als Coronavirus-Ticker

Ich will auf jeden Fall informiert bleiben, muss mir dafür aber keine spezielle App für die aktuellen Zahlen in Sachen Coronavirus installieren. Damit vermeide ich auch Malware auf meinem Smartphone und meinen anderen Geräten.

Weiter verbessern

Vielleicht kannst Du das Script für Dich weiter anpassen und verbessern. Möglich ist, dass die Zahlen aus dem letzten Aufruf gespeichert werden und Du Dir eine Differenz anzeigen lässt.

Vielleicht willst Du der Funktion auch eine Liste übermitteln, weil Du mehr Länder sehen willst. Möchtest Du alle Zahlen aus den USA haben, müsstest Du addieren, da die USA in ihre Staaten aufgeteilt sind.

Nehmt die Sache mit dem Coronavirus bitte ernst

Es tauchen immer mehr Meldungen auf, dass es auch bei jungen, fitten Leute schwere Krankheitsverläufe gibt. Jeder, der sich nicht ansteckt, belegt potenziell kein Bett auf der Intensivstation. Harald Lesch rechnet ganz wissenschaftlich vor, wann nicht mehr genug Betten in den Krankenhäusern zur Verfügung stehen.

Nette Pi-Konstellation

Suchst Du ein VPN für den Raspberry Pi? NordVPN* bietet einen Client, der mit Raspberry Pi OS (32-Bit / 64-Bit) und Ubuntu für Raspberry Pi (64-Bit) funktioniert.




 Alle Kommentare als Feed abonnieren

4 Kommentare zu “Coronavirus – immer mehr Malware – Update-Ticker lieber selber basteln #MonthOfMaking”

  1. Burkhard says:

    Moin,

    vielen Dank für diese Seite. Da ich sowieso einen Raspberry PI bei mir als Pi-Hole ständig laufen habe, habe ich Dein Skript auch noch dort installiert. Allerdings musste ich in der Zeile
    cfurl = scraper.get(url).content.decode("utf-8")
    das decode anhängen, weil ich sonst keinen String zum Parsen hatte.

    Viele Grüße und bleibt gesund
    Burkhard

  2. Dirk Kunte says:

    Ich verstehe den Aufruf des Scripts nicht. Wie muss der Aufruf laufen wenn ich nur Sachsen haben möchte?

    • jdo says:

      In dem Fall könntest Du das Script anpassen und statt countryRegion auf die Variable provinceState prüfen. In der Zwischenzeit ist auch Deutschland in verschiedene Bundesländer eingeteilt und Sachsen würde unter provinceState auftauchen.

      Oder Du lässt Dir bei der Ausgabe einfach die Bundesländer mit anzeigen:

      county = val['provinceState']
      infected = val['confirmed']
      recovered = val['recovered']
      deaths = val['deaths']
      message = message + '\n' + country + ' – ' + county + ' || Infiziert: ' + str(infected) + ' | Genesen: ' + str(recovered) + ' | Todesfälle: ' + str(deaths)