Webhooks nutzen

Beispiel für die Nutzung von Webhooks in Microsoft Teams.

Microsoft Teams lässt sich hervorragend für den EDV Support nutzen. Wie wäre es wenn der Kunde von der Website aus, direkt in den Techniker Kanal im Teams posten kann? Oder der Kundenserver im Fall einer Warnung, diese direkt publiziert?

Ein Webhook läßt sich jedem Kanal in jedem Team hinzufügen – Wir haben im Workshop ausgiebig geübt. Bisher haben wir Webhooks genutzt, um via Microsoft Visual Code, ganze Listings oder einzelne Zeilen im Micosoft Teams zu publizieren und zu diskutieren. Kopieren wir uns die URL des Webhooks.

Einstellung / Verwaltung der Connectoren in einem Kanal

Wie überträgt man nun eine Nachricht über den Webhook an den Microsoft Teams Kanal? Kurz: curl -H „Content-Type: application/json“ -d JSON URL. Diese Zeile in einem Bashscript würde ausreichen um eine Nachricht, als JSON Datensatz formatiert, der Webhook URL zu übergeben. Als Beispiel ein Bash Script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh
 
# Thomas Schilling Oktober 2019
# Testscript Webhook in Microsft Teams
 
WEBHOOK_URL="https://outlook.office.com/webhook/...."
TITLE=$1
shift
COLOR="#FF0000"
TEXT=$1
 
MESSAGE=$( echo ${TEXT} | sed 's/"/\"/g' | sed "s/'/\'/g" )
JSON="{\"title\": \"${TITLE}\", \"themeColor\": \"${COLOR}\", \"text\": \"${MESSAGE}\" }"
 
curl -H "Content-Type: application/json" -d "${JSON}" "${WEBHOOK_URL}"

Mit Aufruf des Bash Scripts übergeben wir eine Überschrift und einen Text. Das ist beliebig. Zum Beispiel möchte ich aktuelle Warnmeldungen der bund.de im Kanal veröffentlichen. In einem vorherigen Workshop haben wir mit den Wetterdaten bereits gespielt. Das PHP Script nutzen wir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$url = file_get_contents('https://warnung.bund.de/bbk.mowas/gefahrendurchsagen.json');
 
$json = json_decode($url);
$z = 0;
foreach ($json as $idx => $inhalt){
$m1 = $inhalt->info[0]->headline;
$m2 = $inhalt->info[0]->description;
        foreach ($inhalt->info[0]->area as $id2 => $in2){
                if ($in2->geocode[0]->value=='053780000000'){
                    $z++;
                    print('{"data": { "head": "'.$m1.'"}}');                
                    shell_exec('/teams.sh "'.$m1.'" "'.$m2.'"');
                } 
       }
}
if ($z==0){
print('{"data": { "head": "keine Gefahrenmeldung"}}');
}
?>

In den Zeilen 7 und 8 werden Überschrift und Gefahrenmeldung aus dem SOAP Array gelesen. In Zeile 13 rufen wir das obige Bash Script auf – In Zeile 8 des Bash Scripts teilen wir die übergebenen Texte. Die Farbe, der Meldung in Teams, ist im Bash Script in Zeile 13 im JSON Datensatz.

Meldung im Kanal
Gefahrenmeldung mit auffälliger Farbe im Kanal

Mit dem Bash Script lässt sich jeder Text publizieren. Zum Beispiel Fehlermeldungen oder Warnungen eines Kundenservers.

Dashboard

Eines von vielen Dashboards näher betrachtet. Nebenbei kann man hier einiges über Datenbeschaffung und Verarbeitung zeigen. Hier die Zusammenfassung unseres Workshops.

Freeboard hat einige Vorteile. Es ist schlicht, komplett offen programmierbar und leicht mit HTML oder JavaScript einstellbar. Um den Workshop nachvollziehen zu können, hier ein paar Eckpunkte.
Nach der Installation von Freeboard auf unserem Debian 9 System mit Apache2, muss noch eine Weile gesucht werden um sinnvolle Erweiterungen zu finden – je nachdem welche Darstellungen man zeigen möchte.

Im Bild oben ist unsere Finale index.html in der verschiedene JavaScript Widgets eingebunden sind. Das altgauge.js haben wir verändert.

zu grün ändernde Anzeige

In Zeile 29 ändern wir die Farbreihenfolge von rot über gelb nach grün. Besonderst interessant sind das HighChart, das einzelne Werte auf einer Zeitachse darstellt und die FLOT Widgets, die saubere Linien und Balkendiagramme ermöglicht. Grundsätzlich „versteht“ Freeboard JSON Datenquellen und ist per JavaScript einstellbar. JSON Datensätze sehen grundsätzlich gleich aus, unterscheiden sich aber je nach eingesetztem Chart. Mal werden einzelne Werte erwartet, mal x,y Werte.Einzelne Werte für Tachoanzeigen und/oder Text/HTML. Geschachtelte Werte für Linien- oder Balkengrafik.

Natürlich versteht Freeboard auch mehrdimensionale JSON Array’s. In der Praxis haben wir die Daten aus https://warnung.bund.de/bbk.dwd/unwetter.json genutzt. Dort werden Warnmeldungen nach Art und Ort ausgegeben. Es empfiehlt sich die Daten vor Darstellung lokal aufzuarbeiten, da die Darstellung aller Daten in einer nicht vorhersehbaren Reihenfolge nicht empfehlenswert ist. Wie sieht das im einzelnen aus:

Im PHP Code durchsuchen wir das Array in der ersten und zweiten Dimension – die Menge können wir nicht beeinflussen. Wir nehmen Unwetterwarnungen nur für unsere Geolokation die so übergeben wird: value“094780000000″. Welcher Ort welchem Wert entspricht kann unter (Link) gesucht werden. In unserem Fall rufen wir nur Unwettermeldungen für den Rheinisch-Bergischen-Kreis heraus.

Das Dashboard (Link) bleibt auf dem Server und wer Einzelheiten aus dem Code wissen möchte oder noch Fragen zur Datenaufbereitung hat, mag mich einfach fragen. Sendet doch Beispiele eurer Dashboards – wir können sie hier veröffentlichen.

Neue Workshops für KMU

Noch in diesem Jahr soll ein Workshop wiederholt werden: Ersteinrichtung Lexware Buchhalter und Faktura mit eigenem Rechnungsformular und belegloser Rechnungsversand.

Der Club sucht momentan nach einer festen Örtlichkeit. Auf Facebook ist in diversen Foren ein Aufruf gestartet worden.

Bis dahin werden wir Schulungen und den anstehenden Workshops wieder bei den interessierten Firmen selbst durchführen. Eine gute Kaffeemaschine voraus gesetzt! Die regelmäßigen Basteltage fallen erstmal kleiner aus.

Ich würde mich freuen, noch mehr (zukünftige) Kollegen mit einbinden zu können. Neueinsteiger und Greenhorns, die ihre Zukunft in der IT sehen, können hier Erfahrungen von hohem Wert sammeln.

Einfach mal rein schauen –> https://www.facebook.com/computerclubgl/

IBM Watson Chat Bot

IBM Cloud – Watson Lite Chat Bot.

Diesen Sonntag haben wir uns mit der IBM Cloud, genauer, mit dem Watson Chat Bot beschäftigt. Wir haben gesehen, das wir einen Gesprächsverlauf abhängig von Worten und Sätzen, die unterschiedlich bewertet werden können, an unterschiedlichen Stellen im Gesprächsverlauf, mit grundsätzlich unterschiedliche Reaktionen, programmieren können.

IBM Watson Online IDE

In der Lite Version des Watson Chat Bot’s können (müssen) wir Synonyme oder Redewendungen selbst definieren, wenn wir darauf reagieren wollen. In der Online IDE findet sich praktischer Weise, ein Test-Bot „Try it out“ mit dem eine recht schnelle Entwicklung möglich wird.

Ein riesen Spass und ein tolles Angebot von IBM. Ich lasse es auf meiner Page laufen und ich bin sicher, wir arbeiten im CCGL noch ein weilchen damit.

Check it out —> Link

Datenschleuse

Ich arbeite gerne mit Datenschleusen. Zugriff von unsicheren Anwendern, von Extern oder von Windows Client verhindern. Interesse nach dieser Art und Weise der Konfiguration kam nach den jüngsten Erpressungsfällen durch den Verschlüßlungs-Trojaner auf. Diese Konfiguration verhindert das.

Diese Technik findet jetzt in den Pauschalsystemen der HALSYSTEM Anwendung.

Lasst uns in einem Workshop die unterschiedlichen Config-Sets (GPO, Scripte und Virenscanner) untersuchen und eine Doku zu Papier bringen.

Automatisierung Belegablage

Belege zu scannen und zu archivieren ist Standard. Wie weit lässt sich das automatisieren?

Belege scannen und archivieren ist Dauerthema in der Systementwicklung. In den Workshops taucht schon einmal die Frage nach den Diensten für automatisierte Belegverarbeitung auf. Also: Belege scannen, verbuchen und archivieren. Natürlich habe ich mich damit vor längerem beschäftigt – nehmen wir das als neuen Workshop im CCGL auf.

Ich persönlich halte nicht viel davon, da es doch sehr fehleranfällig ist. Die Systeme müssen ständig trainiert und kontrolliert werden. Auch in Top-Systemen beschäftigt sich der Buchhalter mit Korrekturbuchungen wenn die Belege tatsächlich als Papier mit der Snail-Mail im Unternehmen ankommen. Ich zeige auch warum; meine Gedanken möchten Initalfunke für den Workshop sein. In der Realität arbeiten wir immer öfter mit der eRechnung.

Zwei Wege zur automatischen Verarbeitung sehe ich. Die bekannten Dienste lesen Kreditor, Belegnummer, Belegdatum und Summe aus dem Beleg. Wie findet man die Angaben?

Die einfach Art lehnt sich an eine schon früher besprochene Vorgehensweise an (Link). Der Scan liegt da als Fließtext vor. Mit entsprechenden awk und perl Scripten können Schlüßelwörter gefiltert werden.

Die anspruchsvollere Lösung habe ich vor 15 Jahren programmiert und wurde produktiv genutzt. Es basiert auf der Vermutung, das die wesentlichen Angaben einer Rechnung oft an der selben Stelle zu finden sind. Es existiert eine Norm (Link).

Beispielrechnung mit markiertem Feld Belegart und Nummer

Schauen wir uns den Beispielbeleg an. Der Beleg hat eine Breite und eine Länge in Pixeln. Anstatt den gesamten Text zu durchsuchen, kann ich auch nur einen definierten Ausschnitt betrachten. Wird nur der Ausschnitt gelesen, haben wir Belegart und Belegnummer. Hier verwende ich Python – sehr flexibel und eigentlich selbsterklärend:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from pdf2image import convert_from_path
image = convert_from_path("test.pdf")[0]
 
 
import pytesseract
import re
snummer = re.compile("[^0-9]")
sbart = re.compile("[^a-zA-Z]")
 
beleg = image.crop((52,500,800,600))
 
text = pytesseract.image_to_string(beleg)
 
def sauberenummer(text):
	text = re.sub(snummer,"",text)
	return text
 
def sauberebeleg(text):
	text = re.sub(sbart,"",text)
	return text	
 
print(sauberebeleg(text))
print(sauberenummer(text))

Schauen wir in Zeile 10: direkte Position des Ausschnitts in Pixel! Also Beginn x,y und Ende x,y in absoluten Pixeln. Zum Beispiel GIMP zeigt die Cursorposition in der Statusleiste in Pixeln an. Produktiv würde ich mit dem Verhältnis zur Gesamtgröße arbeiten. pytesseract ist nicht so flexibel wie das Paket tesseract selbst, dennoch sehr schnell und sicher.

Python und tesseract lesen Belegart und Nummer

Ich wende hier zum lesen zwei verschiedene Filter an. Zeile 7 definiert einen Filter der nur Zahlen zwischen 0 und 9 zurück gibt – Zeile 8 nur Buchstaben ohne Umlaute. Die Funktionen in den Zeilen 14 und 18 wenden den Filter an und ersetzen jedes andere Zeichen durch „“ (Nichts).

Hier sehen wir die Problematik. „BarverkaufNr“ ist keine Belegart. Es müssen einige Routinen geschrieben werden um hier eine Rechnung verarbeiten zu können. Die Belegnummer kann so weiter verarbeitet werden.

Ich bin sehr gespannt auf Eure Vorschläge!

RHEL8 – Optimale Entwicklungshilfe

Großartiges Geschenk der Firma RedHat für Entwickler.

Das neue RedHat Enterprise Linux 8 ist für Entwickler kostenfrei nutzbar. Die Entwicklungen haben wir bisher nur mit Debian und SuSe Distributionen durchgeführt.

Ohne Registrierung und in weniger als 5 Minuten einsatzbereit:
docker run –rm -it registry.access.redhat.com/ubi8/ubi

RHEL8 im Docker Container

Bis Ende 2019 haben wir noch reichlich Entwicklungsarbeit für HALSYSTEM vor uns und berichten dann über die Erfahrungen mit RHEL8 und SLES12.

keine Cam nach Windows 10 Update

Ärgerlich: die Kamera am Laptop lief Jahre lang, dann kommt ein Update und nichts geht mehr. Nur die Ruhe!

Öffnen wir regedit und navigieren zu den Einträgen

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows Media Foundation\Platform

und

Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Media Foundation\Platform

An beiden Orten fehlt der Eintrag

Neues DWORD 32 Bit mit dem Wert 0 (Null) –> EnableFrameServerMode

Dann läuft die Cam ohne Neustart.

Produktivität in 32 Bit

Das wohl beste Produktivpaket. Ich habe es versprochen, hier ist es.

Das wohl beste Officepaket –> Lotus SmartSuite

Im letzten Workshop „EXCEL Pivot“ sprachen wir über Datenbankanbindungen und Wizards die uns die Erstellung von brauchbaren Reports erleichtern. Im Rahmen dessen habe ich Lotus vorgestellt. In Verbindung mit der Datenbankanwendung Approach sind Dinge möglich, für die man mit EXCEL oder LibreOffice schon einige Klimmzüge veranstalten muss.

Wer das nachvollziehen möchte, kann das Lotus Paket hier (Link) herunter laden. Das Passwort für den Download ist „Lotus123“. Viel Spass!

Active Directory Export in LDAP

Möglichkeit und Notwenidgkeit von Stringmanipulation und Beachtung von erhöhter Sicherheit und Schnelligkeit.

Ein Export von Daten aus dem Microsoft Active Directory im ldif Format ist in der realen Welt eigentlich unbrauchbar. Die Bezeichnung vieler Organizational Units (OU) sind nicht Standardkonform. Für den Import der Daten in ein LDAP Verzeichnis fehlen auch Angaben.

Für die Textmanipulation eignet sich ein Bash Script hervorragend. Was aber, wenn man dem User keinen Einblick gewähren möchte und die zu importierende Datei mehrere zehntausend Datensätze enthält?

Das Standard C – ANSI C – bietet eine Fülle an Werkzeugen zur Text- und Dateimanipulation. In dem Listing (Link) sind mehrere verschiedene Möglichkeiten verwendet.

Aufgabe war, eine Datei aus dem AD im ldif Format einzulesen, das Schema zu verändern und die OU sAMAAccountName, organizaltionalPerson und weitere zu ersetzen, eine gidnumber, member sowie ein userpassword einzusetzen. Das Passwort muss LDAP konform als salted SHA, mehr oder weniger, zufällig generiert werden.

Spielen wir in den nächsten Clubtreffen ein bisschen an den Befehlen die Zeichenweise (fgetc) oder Wortweise (fgets) Strings verarbeiten. Auch habe ich verschiedene Varianten des Filehandlings programmiert.