Entwickler, der außergewöhnliche CRM- und Laravel-Lösungen liefert

Als erfahrener Entwickler spezialisiere ich mich auf Laravel- und Vue.js-Entwicklung, die Implementierung von Vtiger CRM sowie auf vielfältige WordPress-Projekte. Meine Arbeit zeichnet sich durch kreative, dynamische und benutzerzentrierte Weblösungen aus, die individuell an die Bedürfnisse meiner Kunden angepasst werden.

Für Linux-Nutzer, die ihren Desktop mit nützlichen Informationen personalisieren möchten, ist Conky ein unverzichtbares Tool. In diesem Artikel zeige ich, wie Sie mit Go Skripte erstellen, die aktuelle Währungskurse und Zitate abrufen – perfekt für Ihre Conky-Konfiguration!

Conky-Widgets mit Go: Währungsdaten und Zitate dynamisch anzeigen

Für Linux-Nutzer, die ihren Desktop mit nützlichen Informationen personalisieren möchten, ist Conky ein unverzichtbares Tool. In diesem Artikel zeige ich, wie Sie mit Go Skripte erstellen, die aktuelle Währungskurse und Zitate abrufen – perfekt für Ihre Conky-Konfiguration!

Voraussetzungen


Projekt 1: Währungskurse abrufen

GitHub-Repo: currency-rates

package main

import (
    "encoding/json"
    "fmt"
    "net/http"
)

type CurrencyResponse struct {
    USD float64 `json:"USD"`
    EUR float64 `json:"EUR"`
}

func main() {
    apiKey := "IHR_API_KEY"
    url := fmt.Sprintf("https://free.currconv.com/api/v7/convert?q=USD_RUB,EUR_RUB&compact=ultra&apiKey=%s", apiKey)

    resp, err := http.Get(url)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    var result map[string]float64
    json.NewDecoder(resp.Body).Decode(&result)

    fmt.Printf("USD: %.2f RUB | EUR: %.2f RUB\n", result["USD_RUB"], result["EUR_RUB"])
}

Conky-Integration:

${execpi 3600 /pfad/zum/currency-rates}

Projekt 2: Zitate und Anekdoten

GitHub-Repo: fortune-receiver

Code-Struktur

  1. types.go – Schnittstellen für Testbarkeit:
package main

type GetWebRequest interface {
    FetchBytes(typeFort int) ([]byte, error)
}

type FortuneResult struct {
    Content string `json:"content"`
}
  1. fortune.go – Hauptlogik:
package main

import (
    "bytes"
    "encoding/json"
    "golang.org/x/text/encoding/charmap"
    "golang.org/x/text/transform"
    "io"
    "net/http"
    "strconv"
)

type LiveGetWebRequest struct{}

func (g LiveGetWebRequest) FetchBytes(typeFort int) ([]byte, error) {
    url := "http://rzhunemogu.ru/RandJSON.aspx?CType=" + strconv.Itoa(typeFort)
    resp, err := http.Get(url)
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()
    return io.ReadAll(resp.Body)
}

func decodeWindows1251(data []byte) (string, error) {
    dec := charmap.Windows1251.NewDecoder()
    utf8Bytes, _, err := transform.Bytes(dec, data)
    return string(utf8Bytes), err
}

func getFortune(client GetWebRequest, typeFort int) (string, error) {
    body, err := client.FetchBytes(typeFort)
    if err != nil {
        return "", err
    }

    cleanData := bytes.ReplaceAll(body, []byte("\r"), []byte(""))
    utf8Str, err := decodeWindows1251(cleanData)
    if err != nil {
        return "", err
    }

    var fortune FortuneResult
    if err := json.Unmarshal([]byte(utf8Str), &fortune); err != nil {
        return "", err
    }

    return fortune.Content, nil
}
  1. main.go – CLI-Integration:
package main

import (
    "flag"
    "fmt"
    "log"
)

func main() {
    var fortType int
    flag.IntVar(&fortType, "type", 4, "Art des Inhalts (1=Anekdoten, 4=Zitate)")
    flag.Parse()

    content, err := getFortune(LiveGetWebRequest{}, fortType)
    if err != nil {
        log.Fatal("Fehler:", err)
    }
    fmt.Println(content)
}

Tests

fortune_test.go:

package main

import (
    "testing"
)

type MockClient struct{}

func (m MockClient) FetchBytes(_ int) ([]byte, error) {
    return []byte(`{"content":"Test-Zitat"}`), nil
}

func TestGetFortune(t *testing.T) {
    expected := "Test-Zitat"
    result, err := getFortune(MockClient{}, 1)
    if err != nil {
        t.Fatalf("Unerwarteter Fehler: %v", err)
    }
    if result != expected {
        t.Errorf("Erwartet '%s', erhalten '%s'", expected, result)
    }
}

Tests ausführen:

go test -v

Conky-Integration

  1. Skript kompilieren:
go build -o fortune-receiver
  1. Cron-Job für automatische Aktualisierung:
*/15 * * * * /pfad/fortune-receiver -type=4 > ~/.conky_zitat.log
  1. Conky-Konfiguration:
${font Ubuntu:bold:size=10}Zitat des Tages:${font}
${execi 900 cat ~/.conky_zitat.log}

Tipps & Fehlerbehebung

  • Zeichensatzprobleme: Stellen Sie sicher, dass die golang.org/x/text-Bibliothek installiert ist:
  go get golang.org/x/text
  • API-Limits: currencyconverterapi.com erlaubt 100 kostenlose Anfragen/Tag.
  • Aliase für die Konsole: Fügen Sie dies zu ~/.bashrc hinzu:
  alias zitat='/pfad/fortune-receiver -type=4'
  alias anekdote='/pfad/fortune-receiver -type=1'

Erweiterungsmöglichkeiten

  • Mehr Währungen: Fügen Sie GBP, JPY etc. zur API-URL hinzu.
  • Caching: Speichern Sie Ergebnisse lokal, um API-Requests zu reduzieren.
  • GUI-Optionen: Nutzen Sie GTK3 für ein interaktives Widget.

Fazit: Mit Go und Conky können Sie Ihren Desktop in ein informatives Dashboard verwandeln – effizient, stabil und ohne JavaScript!

👉 Weitere Inspiration:

Bei Fragen posten Sie sie gerne in den Kommentaren! 🚀


„Ein gut konfigurierter Desktop ist wie ein aufgeräumter Schreibtisch – er macht produktiv und inspiriert.“