AutoHotkey
Unter Windows wird mit AutoHotkey jede Tastenkombination zum Timer-Knopf. Das Skript braucht nur AutoHotkey v2 und die Windows-eigene HTTP-Schnittstelle, keine weiteren Bibliotheken; nach jedem Druck zeigt eine Benachrichtigung den Stand.
- Lege unter Einstellungen, API und Geräte ein Gerät der Art „Anderes Gerät“ an und kopiere den Token.
- Installiere AutoHotkey v2.
- Speichere das Skript unten als
horaka.ahk(UTF-8) und starte es mit einem Doppelklick. Für mehrere Projekte kopierst du die Zeile mit^!F9und gibst ihr eine eigene Taste und einen eigenen Kurznamen. - Damit das Skript beim Anmelden startet, lege eine Verknüpfung im Autostart-Ordner ab (Windows+R,
shell:startup).
#Requires AutoHotkey v2.0
#SingleInstance Force
Basis := "https://api.horaka.com/v1"
Token := "DEIN_TOKEN"
; Strg+Alt+F9: Projekt umschalten, Strg+Alt+F10: stoppen, Strg+Alt+F11: Stand zeigen
^!F9::Melden("/track/toggle", '{"project": "PROJEKT"}')
^!F10::Melden("/track/stop")
^!F11::Melden()
Horaka(Methode, Pfad, Body := "") {
Anfrage := ComObject("WinHttp.WinHttpRequest.5.1")
Anfrage.Open(Methode, Basis Pfad, false)
Anfrage.SetRequestHeader("Authorization", "Bearer " Token)
Anfrage.SetRequestHeader("Content-Type", "application/json; charset=utf-8")
Anfrage.Send(Body)
if (Anfrage.Status != 200)
throw Error("HTTP " Anfrage.Status)
return Anfrage.ResponseText
}
Melden(Pfad := "", Body := "{}") {
try {
if (Pfad != "")
Horaka("POST", Pfad, Body)
TrayTip(Horaka("GET", "/track/status?format=text"), "Horaka")
} catch as Fehler {
TrayTip(Fehler.Message, "Horaka", "Iconx")
}
}
Statt /track/toggle gehen auch /track/start und /track/switch mit demselben Body; mit "activity" neben "project" buchst du eine bestimmte Tätigkeit. Die Benachrichtigung zeigt nach jedem Druck die Stunden von heute und den laufenden Timer. „HTTP 401“ heißt falscher Token, „HTTP 403“ heißt, das Gerät darf dieses Projekt nicht buchen oder die Gerätegrenze deines Tarifs ist erreicht.
Strg+Alt mit Buchstaben ist auf deutschen Tastaturen dasselbe wie AltGr (AltGr+Q ist @), deshalb nimmt das Beispiel die Funktionstasten. Alle Endpunkte stehen in der API-Doku.