Zum Inhalt springen
Tutorial

Generieren Sie Open Graph-Bilder mit einem API-Aufruf, kein Next.js erforderlich

| 6 min read

Verwenden Sie die botoi OG-Bild-API, um 1200 x 630 PNG-Social-Cards aus jedem Framework zu generieren. Funktioniert mit Astro-, Django-, Rails-, Laravel- und Headless-CMS-Plattformen.

Social media preview cards on various platforms
Photo by dole777 on Unsplash

Ihr Blogbeitrag wird auf Twitter geteilt. Anstelle einer umfangreichen Vorschau mit einer Titelkarte zeigt der Link eine leeres graues Feld. Oder schlimmer noch, ein gestrecktes Favicon. Jede Freigabe ohne ein richtiges OG-Bild ist ein verpasster Klick.

Die beliebte Lösung ist die von Vercel @vercel/og Bibliothek. Es funktioniert gut, ist aber gesperrt Next.js und die Infrastruktur von Vercel. Satori (die Engine dahinter) benötigt eine Node.js-Laufzeit mit spezifischen Funktionen zum Laden von Schriftarten. Wenn Sie mit Astro, Django, Rails, Laravel, Hugo oder einem anderen bauen Rahmen, du bist auf dich allein gestellt.

Es gibt einen einfacheren Ansatz: Senden Sie eine POST-Anfrage an eine API und erhalten Sie ein fertiges PNG im Format 1200 x 630 zurück. Keine Node.js-Abhängigkeit. Kein Framework-Lock-in. Es muss keine Bild-Rendering-Pipeline gewartet werden.

Eine POST-Anfrage, ein PNG zurück

Der Botoi UND Bild-API akzeptiert einen JSON-Text mit Ihrem Titel, Ihrer Beschreibung und Ihrer Designpräferenz. Es gibt rohe PNG-Binärdaten zurück.

curl -X POST https://api.botoi.com/v1/og/generate \\
  -H "Content-Type: application/json" \\
  -d '{
    "title": "How to build a REST API in Go",
    "description": "A step-by-step guide with net/http and no frameworks",
    "theme": "dark"
  }' \\
  --output og-image.png

Das ist es. Die Antwort ist eine PNG-Datei, die Sie speichern, bereitstellen oder in ein CDN hochladen können:

HTTP/1.1 200 OK
Content-Type: image/png
Content-Length: 48271

(binary PNG data, 1200x630px)

Die API kümmert sich um Typografie, Layout und die richtige Größe. Sie geben Text ein und erhalten ein Bild.

Astro-Integration: Generieren Sie OG-Bilder zur Erstellungszeit

Die statische Site-Generierung von Astro macht dies besonders sauber. Erstellen Sie eine dynamische API-Route, die abruft OG-Images während des Builds und stellt sie statisch bereit .png Dateien.

// src/pages/og/[slug].png.ts
import type { APIRoute, GetStaticPaths } from 'astro';

// Your posts data source (markdown, CMS, database, etc.)
import { getAllPosts } from '@/lib/posts';

export const getStaticPaths: GetStaticPaths = async () => {
  const posts = await getAllPosts();
  return posts.map((post) => ({
    params: { slug: post.slug },
    props: { title: post.title, description: post.description },
  }));
};

export const GET: APIRoute = async ({ props }) => {
  const res = await fetch('https://api.botoi.com/v1/og/generate', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      title: props.title,
      description: props.description,
      theme: 'dark',
    }),
  });

  const imageBuffer = await res.arrayBuffer();

  return new Response(imageBuffer, {
    headers: {
      'Content-Type': 'image/png',
      'Cache-Control': 'public, max-age=31536000, immutable',
    },
  });
};

Während astro build, diese Route generiert für jeden Beitrag ein PNG. Die Ausgabedateien landen in dein dist/og/ Verzeichnis als statische Assets. Keine Laufzeit-Image-Generierung, kein Serverless Funktion, kein Kaltstart.

Verweisen Sie auf die Bilder in Ihrem Seitenkopf:

<!-- In your BaseLayout.astro or page head -->
<meta property="og:image" content={\`https://yoursite.com/og/\${slug}.png\`} />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:image" content={\`https://yoursite.com/og/\${slug}.png\`} />

Jede Seite erhält eine einzigartige Social Card, die einmal während der Erstellung generiert und von CDNs für immer zwischengespeichert wird.

Django- und Rails-Integration

Vom Server gerenderte Frameworks können OG-Bilder bei Bedarf generieren und das Ergebnis zwischenspeichern.

Django

# views.py
import requests
from django.http import HttpResponse
from django.views.decorators.cache import cache_page


@cache_page(60 * 60 * 24)  # Cache for 24 hours
def og_image(request, slug):
    post = get_object_or_404(Post, slug=slug)

    response = requests.post(
        'https://api.botoi.com/v1/og/generate',
        json={
            'title': post.title,
            'description': post.description,
            'theme': 'dark',
        },
        timeout=5,
    )

    return HttpResponse(
        response.content,
        content_type='image/png',
    )
# urls.py
urlpatterns = [
    path('og/<slug:slug>.png', views.og_image, name='og_image'),
]

Der @cache_page Decorator speichert das generierte Bild 24 Stunden lang. Nach dem ersten Auf Anfrage stellt Django das zwischengespeicherte PNG direkt bereit, ohne erneut auf die API zuzugreifen.

Schienen

# app/controllers/og_images_controller.rb
class OgImagesController < ApplicationController
  def show
    post = Post.find_by!(slug: params[:slug])

    response = HTTP.post(
      'https://api.botoi.com/v1/og/generate',
      json: {
        title: post.title,
        description: post.description,
        theme: 'dark'
      }
    )

    expires_in 24.hours, public: true
    send_data response.body.to_s, type: 'image/png', disposition: 'inline'
  end
end
# config/routes.rb
get 'og/:slug.png', to: 'og_images#show'

Beide Beispiele folgen dem gleichen Muster: Suchen Sie den Beitrag nach Slug, POSTEN Sie den Titel und die Beschreibung an die API senden und das PNG mit Caching-Headern zurückgeben. Das Framework übernimmt das Caching; Die API-Handles Bilderzeugung.

Headless CMS-Integration: Bei Veröffentlichung generieren

Wenn Ihre Inhalte in einem Headless-CMS wie Strapi, Contentful oder Sanity gespeichert sind, können Sie OG generieren Bilder, wenn ein Redakteur einen Beitrag veröffentlicht oder aktualisiert. Verknüpfen Sie einen Webhook, der Inhalte auslöst Änderungen.

Allgemeiner Webhook-Handler

// Webhook handler (any Node.js server or serverless function)
import { writeFileSync } from 'fs';

export async function handleCmsPublish(payload) {
  const { title, description, slug } = payload.entry;

  const res = await fetch('https://api.botoi.com/v1/og/generate', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ title, description, theme: 'light' }),
  });

  const buffer = Buffer.from(await res.arrayBuffer());

  // Save to your public/static directory or upload to S3/R2
  writeFileSync(\`./public/og/\${slug}.png\`, buffer);

  console.log(\`Generated OG image for: \${slug}\`);
}

Strapi-Lebenszyklushaken

// Strapi lifecycle hook: src/api/post/content-types/post/lifecycles.js
module.exports = {
  async afterUpdate(event) {
    const { result } = event;

    const res = await fetch('https://api.botoi.com/v1/og/generate', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        title: result.title,
        description: result.description,
        theme: 'dark',
      }),
    });

    // Upload to your CDN or save locally
    const buffer = Buffer.from(await res.arrayBuffer());
    await strapi.plugins.upload.services.upload.upload({
      data: { path: \`og/\${result.slug}.png\` },
      files: { buffer, name: \`\${result.slug}.png\`, type: 'image/png' },
    });
  },
};

Dieser Ansatz ist nützlich für Teams, in denen Inhaltsredakteure über ein CMS veröffentlichen, Entwickler jedoch nicht Ich möchte für jede Textänderung eine Build-Pipeline ausführen. Das OG-Bild wird automatisch neu generiert, wenn das Änderungen des Beitragstitels oder der Beschreibung.

Bonus: Extrahieren Sie OG-Metadaten aus einer beliebigen URL

Die Botoi-API bietet auch /v1/url-metadata, was das Gegenteil bewirkt: Bei gegebener URL wird abgerufen die Seite und extrahiert ihre Open Graph-Tags. Dies ist nützlich zum Erstellen von Linkvorschauen und sozialen Karten Validatoren oder SEO-Audit-Tools.

curl -X POST https://api.botoi.com/v1/url-metadata \\
  -H "Content-Type: application/json" \\
  -d '{"url": "https://github.com/astro-community/astro-embed"}'

Antwort:

{
  "success": true,
  "data": {
    "url": "https://github.com/astro-community/astro-embed",
    "status": 200,
    "title": "GitHub - astro-community/astro-embed",
    "description": "Components to embed third-party media in Astro projects",
    "og": {
      "title": "astro-embed",
      "description": "Components to embed third-party media in Astro projects",
      "image": "https://opengraph.githubassets.com/...",
      "type": "object",
      "url": "https://github.com/astro-community/astro-embed",
      "site_name": "GitHub"
    }
  }
}

Verwenden Sie dies, um Linkvorschau-Komponenten in Ihrer App zu erstellen:

async function getLinkPreview(url: string) {
  const res = await fetch('https://api.botoi.com/v1/url-metadata', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ url }),
  });

  const { data } = await res.json();

  return {
    title: data.og?.title ?? data.title,
    description: data.og?.description ?? data.description,
    image: data.og?.image,
    siteName: data.og?.site_name,
  };
}

Kombinieren Sie beide Endpunkte: verwenden /v1/url-metadata um zu überprüfen, wie Ihre Seiten in sozialen Netzwerken angezeigt werden Plattformen und /v1/og/generate um die Bilder zu erstellen, die sie gut aussehen lassen.

Warum nicht selbst Satori leiten?

Du kannst. Satori ist Open Source und produziert qualitativ hochwertige Ergebnisse. Aber es selbst zu betreiben bedeutet:

  • Benutzerdefinierte Schriftarten installieren und bündeln (Satori verwendet keine Systemschriftarten)
  • Einrichten einer Node.js-Laufzeit oder Edge-Funktion für die Bildwiedergabe
  • Schreiben von JSX-zu-SVG-Vorlagen und Konvertieren von SVG in PNG mit resvg
  • Umgang mit Speicherbeschränkungen auf serverlosen Plattformen beim Rendern großer Bilder
  • Pflege der Pipeline, während sich Satoris API weiterentwickelt

Ein API-Aufruf ersetzt all das durch eine einzige HTTP-Anfrage. Wenn Ihr OG-Bild benötigt wird Der API-Ansatz ist unkompliziert (Titel + Beschreibung + Branding), erspart stundenlange Einrichtung und laufende Wartung.

FAQ

Welche Größe haben die generierten OG-Bilder?
Jedes Bild ist 1200 x 630 Pixel groß, die von Facebook, Twitter/X, LinkedIn und Slack empfohlene Standard-Open-Graph-Bildgröße. Die Ausgabe ist eine PNG-Datei.
Benötige ich einen API-Schlüssel?
Nein. Das kostenlose Kontingent erlaubt 5 Anfragen pro Minute ohne API-Schlüssel. Für Build-Pipelines oder stark frequentierte Websites, die bei jedem Seitenaufruf Bilder generieren, holen Sie sich einen Schlüssel von der Botoi-API-Dokumentenseite, um höhere Ratenlimits freizuschalten.
Kann ich Schriftarten, Farben oder Layout anpassen?
Der Theme-Parameter akzeptiert „hell“ oder „dunkel“, um das gesamte Farbschema zu steuern. Die API verarbeitet Typografie und Layout automatisch basierend auf der Länge Ihres Titels und Ihrer Beschreibung. Für vollständig benutzerdefinierte Designs generieren Sie Ihr Basisbild mit der API und bearbeiten Sie es mit Ihrer eigenen Overlay-Logik nach.
Wie schnell ist die Bilderzeugung?
Die API läuft auf Cloudflare Workers am Edge. Die meisten Anfragen geben ein fertiges PNG in weniger als 500 ms zurück. Wenn Sie das Ergebnis zwischenspeichern (empfohlen für statische Websites), erfolgt die Generierung nur einmal pro eindeutiger Kombination aus Titel, Beschreibung und Thema.
Was macht der Endpunkt /v1/url-metadata?
POSTEN Sie eine URL an /v1/url-metadata und die API ruft diese Seite ab, analysiert ihren HTML-Code und gibt strukturierte Open Graph-Metadaten zurück: og:title, og:description, og:image, og:type und Twitter Card-Tags. Verwenden Sie es, um in der Vorschau anzuzeigen, wie eine URL aussieht, wenn sie in sozialen Medien geteilt wird, oder um Metadaten in Ihre eigenen Linkvorschauen einzubinden.

Starte mit botoi zu entwickeln

150+ API-Endpunkte für Abfragen, Textverarbeitung, Bildgenerierung und Entwickler-Tools. Kostenloser Tarif, keine Kreditkarte nötig.