Zum Inhalt springen

Schnellstart

Website-Screenshots in Go

Erstellen Sie mit net/http einen Screenshot über eine einzige HTTPS-Anfrage, ohne eine Browser-Infrastruktur betreiben zu müssen.

Ironfang Render bietet eine gewöhnliche HTTPS-API, daher kann Go sie mit net/http aufrufen, ganz ohne SDK. Eine erfolgreiche Anfrage liefert die Bildbytes direkt zurück, bereit zum Schreiben in eine Datei.

Einen Schlüssel erstellen

Erstellen Sie im Portal einen API-Schlüssel. Das Geheimnis wird einmal angezeigt und als Hash gespeichert. Legen Sie es in einer Umgebungsvariablen namens IRONFANG_API_KEY ab statt in der Quelldatei; das Beispiel unten liest es von dort.

export IRONFANG_API_KEY="if_live_..."

Einen Screenshot erstellen

package main

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"log"
	"net/http"
	"os"
	"time"
)

func main() {
	key := os.Getenv("IRONFANG_API_KEY")
	if key == "" {
		log.Fatal("Set IRONFANG_API_KEY to your Ironfang API key.")
	}

	body, err := json.Marshal(map[string]any{
		"url":   "https://example.com",
		"width": 1280,
	})
	if err != nil {
		log.Fatal(err)
	}

	req, err := http.NewRequest(http.MethodPost,
		"https://api.ironfang.uk/render/v1/screenshot",
		bytes.NewReader(body))
	if err != nil {
		log.Fatal(err)
	}
	req.Header.Set("Authorization", "Bearer "+key)
	req.Header.Set("Content-Type", "application/json")

	client := &http.Client{Timeout: 60 * time.Second}
	resp, err := client.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer resp.Body.Close()

	if resp.StatusCode != http.StatusOK {
		var e struct {
			Error struct{ Code, Message string } `json:"error"`
		}
		if err := json.NewDecoder(resp.Body).Decode(&e); err != nil {
			log.Fatalf("%d: unreadable error body: %v", resp.StatusCode, err)
		}
		log.Fatalf("%d %s: %s", resp.StatusCode, e.Error.Code, e.Error.Message)
	}

	out, err := os.Create("shot.png")
	if err != nil {
		log.Fatal(err)
	}
	if _, err := io.Copy(out, resp.Body); err != nil {
		log.Fatal(err)
	}
	if err := out.Close(); err != nil {
		log.Fatal(err)
	}
	fmt.Println("saved shot.png")
}

Führen Sie es aus, und der Screenshot wird als shot.png im aktuellen Verzeichnis gespeichert:

go run main.go

Fehlerbehandlung

Erfolgreiche Render-Antworten sind binär. Fehler kommen als JSON in der Form {"error": {"code", "message"}}. Ein fehlender oder unbekannter Schlüssel ergibt 401 invalid_api_key. Ein Schlüssel ohne die Berechtigung render:render ergibt 403 insufficient_scope.

// io.Copy streams the response to disk without buffering the
// complete image in memory. Close is checked because a failed
// close can mean the file was not fully written.

PDFs und Vorlagen

Derselbe Aufruf funktioniert für PDFs unter /render/v1/pdf und für Bilder aus Vorlagen unter /render/v1/image/{id}. Nur der Pfad und der Body ändern sich.

Weiterlesen