قم بإنشاء صور Open Graph باستدعاء واجهة برمجة التطبيقات (API) مرة واحدة، دون الحاجة إلى Next.js
استخدم botoi OG image API لإنشاء بطاقات اجتماعية بحجم 1200 × 630 PNG من أي إطار عمل. يعمل مع منصات Astro، وDjango، وRails، وLaravel، ومنصات CMS مقطوعة الرأس.
تتم مشاركة منشور مدونتك على Twitter. بدلاً من المعاينة الغنية ببطاقة عنوان، يعرض الرابط ملفًا صندوق رمادي فارغ. أو ما هو أسوأ من ذلك، أيقونة مفضلة ممتدة. كل مشاركة بدون صورة OG مناسبة هي نقرة ضائعة.
الحل الشائع هو Vercel @vercel/og مكتبة. إنه يعمل بشكل جيد، لكنه مغلق
Next.js والبنية التحتية لفيرسيل. يحتاج Satori (المحرك الذي يقف خلفه) إلى وقت تشغيل Node.js محدد
إمكانيات تحميل الخطوط. إذا كنت تقوم بالبناء باستخدام Astro أو Django أو Rails أو Laravel أو Hugo أو أي شيء آخر
الإطار، أنت وحدك.
هناك طريقة أبسط: أرسل طلب POST واحدًا إلى واجهة برمجة التطبيقات (API) واحصل على صورة PNG نهائية بحجم 1200 × 630. لا توجد تبعية Node.js. لا يوجد قفل الإطار. لا يوجد خط أنابيب لتقديم الصور للمحافظة عليه.
طلب POST واحد وصورة PNG واحدة مرة أخرى
ال botoi وواجهة برمجة تطبيقات الصور يقبل نص JSON مع العنوان والوصف وتفضيلات السمة. تقوم بإرجاع البيانات الثنائية PNG الأولية.
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
هذا كل شيء. الرد عبارة عن ملف PNG يمكنك حفظه أو عرضه أو تحميله على شبكة CDN:
HTTP/1.1 200 OK
Content-Type: image/png
Content-Length: 48271
(binary PNG data, 1200x630px)
تتعامل واجهة برمجة التطبيقات مع الطباعة والتخطيط والحجم المناسب. تقوم بتمرير النص، وتحصل على صورة.
التكامل الفلكي: إنشاء صور OG في وقت الإنشاء
إنشاء موقع Astro الثابت يجعل هذا نظيفًا بشكل خاص. أنشئ مسارًا ديناميكيًا لواجهة برمجة التطبيقات (API) لجلب
صور OG أثناء الإنشاء وتعمل كصور ثابتة .png ملفات.
// 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',
},
});
};
خلال astro build، يقوم هذا المسار بإنشاء ملف PNG لكل مشاركة. ملفات الإخراج تهبط في
الخاص بك dist/og/ الدليل كأصول ثابتة. لا يوجد إنشاء صور في وقت التشغيل، ولا يوجد خادم
وظيفة، لا يبدأ الباردة.
قم بالإشارة إلى الصور الموجودة في رأس صفحتك:
<!-- 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\`} />
تحصل كل صفحة على بطاقة اجتماعية فريدة، يتم إنشاؤها مرة واحدة أثناء الإنشاء ويتم تخزينها مؤقتًا إلى الأبد بواسطة شبكات CDN.
تكامل جانغو وريلز
يمكن للأطر المقدمة من الخادم إنشاء صور OG عند الطلب وتخزين النتيجة مؤقتًا.
جانغو
# 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'),
]
ال @cache_page يقوم مصمم الديكور بتخزين الصورة التي تم إنشاؤها لمدة 24 ساعة. بعد الأول
عند الطلب، يقدم Django ملف PNG المخزن مؤقتًا مباشرة دون الضغط على واجهة برمجة التطبيقات (API) مرة أخرى.
القضبان
# 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'
يتبع كلا المثالين نفس النمط: ابحث عن المنشور حسب السلسلة، ثم انشر العنوان والوصف إلى واجهة برمجة التطبيقات (API)، وأعد ملف PNG مع رؤوس التخزين المؤقت. يعالج الإطار التخزين المؤقت. يعالج API توليد الصورة.
تكامل CMS بدون رأس: إنشاء عند النشر
إذا كان المحتوى الخاص بك موجودًا في نظام إدارة محتوى بدون رأس مثل Strapi أو Contentful أو Sanity، فيمكنك إنشاء OG الصور عندما ينشر المحرر منشورًا أو يقوم بتحديثه. قم بتوصيل خطاف ويب يتم تشغيله على المحتوى التغييرات.
معالج webhook العام
// 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 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' },
});
},
};
يعد هذا الأسلوب مفيدًا للفرق التي ينشر فيها محررو المحتوى من خلال نظام إدارة المحتوى (CMS) ولا يقوم المطورون بذلك تريد تشغيل خط أنابيب البناء لكل تغيير في النص. يتم تجديد صورة OG تلقائيًا عند عنوان المشاركة أو تغييرات الوصف.
المكافأة: استخراج البيانات التعريفية لـ OG من أي عنوان URL
توفر واجهة برمجة تطبيقات botoi أيضًا /v1/url-metadata, which does the reverse: given a URL, it fetches
الصفحة واستخراج علامات Open Graph الخاصة بها. This is useful for building link previews, social card
أدوات التحقق من الصحة، أو أدوات تدقيق تحسين محركات البحث (SEO).
curl -X POST https://api.botoi.com/v1/url-metadata \\
-H "Content-Type: application/json" \\
-d '{"url": "https://github.com/astro-community/astro-embed"}'
إجابة:
{
"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"
}
}
}
استخدم هذا لإنشاء مكونات معاينة الرابط في تطبيقك:
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,
};
}
اجمع بين نقطتي النهاية: استخدم /v1/url-metadata للتحقق من كيفية ظهور صفحاتك على مواقع التواصل الاجتماعي
المنصات، و /v1/og/generate لإنشاء الصور التي تجعلها تبدو جيدة.
لماذا لا تدير ساتوري بنفسك؟
أنت تستطيع. ساتوري مفتوح المصدر وينتج مخرجات عالية الجودة. لكن تشغيله بنفسك يعني:
- Installing and bundling custom fonts (Satori doesn't use system fonts)
- إعداد وقت تشغيل Node.js أو وظيفة Edge لعرض الصور
- كتابة قوالب JSX إلى SVG وتحويل SVG إلى PNG باستخدام resvg
- التعامل مع حدود الذاكرة على الأنظمة الأساسية التي لا تحتوي على خادم عند عرض صور كبيرة
- الحفاظ على خط الأنابيب مع تطور واجهة برمجة تطبيقات Satori
يستبدل استدعاء API كل ذلك بطلب HTTP واحد. إذا كانت احتياجات صورة OG الخاصة بك هي مباشرة (العنوان + الوصف + العلامة التجارية)، يوفر نهج واجهة برمجة التطبيقات (API) ساعات من الإعداد الصيانة المستمرة.
FAQ
- ما حجم صور OG التي تم إنشاؤها؟
- يبلغ حجم كل صورة 1200 × 630 بكسل، وهو الحجم القياسي لصورة Open Graph الموصى به من قبل Facebook وTwitter/X وLinkedIn وSlack. الإخراج هو ملف PNG.
- هل أحتاج إلى مفتاح API؟
- لا. تسمح الطبقة المجانية بـ 5 طلبات في الدقيقة بدون مفتاح API. لإنشاء خطوط أنابيب أو مواقع ذات حركة مرور عالية والتي تولد صورًا في كل عرض للصفحة، احصل على مفتاح من صفحة مستندات botoi API لفتح حدود المعدلات الأعلى.
- هل يمكنني تخصيص الخطوط أو الألوان أو التخطيط؟
- تقبل معلمة السمة "فاتحة" أو "داكنة" للتحكم في نظام الألوان العام. تتعامل واجهة برمجة التطبيقات (API) مع الطباعة والتخطيط تلقائيًا بناءً على عنوانك وطول الوصف. للحصول على تصميمات مخصصة كاملة، قم بإنشاء صورتك الأساسية باستخدام واجهة برمجة التطبيقات (API) ثم قم بمعالجتها لاحقًا باستخدام منطق التراكب الخاص بك.
- ما مدى سرعة توليد الصورة؟
- تعمل واجهة برمجة التطبيقات (API) على Cloudflare Workers عند الحافة. تُرجع معظم الطلبات ملف PNG النهائي في أقل من 500 مللي ثانية. إذا قمت بتخزين النتيجة مؤقتًا (موصى به للمواقع الثابتة)، فسيتم الإنشاء مرة واحدة فقط لكل مجموعة فريدة من العنوان والوصف والموضوع.
- ماذا تفعل نقطة النهاية /v1/url-metadata؟
- انشر عنوان URL إلى /v1/url-metadata وستقوم واجهة برمجة التطبيقات بجلب تلك الصفحة، وتحليل HTML الخاص بها، وإرجاع البيانات الوصفية المنظمة للرسم البياني المفتوح: og:title، og:description، og:image، og:type، وعلامات Twitter Card. استخدمه لمعاينة كيفية ظهور أي عنوان URL عند مشاركته على وسائل التواصل الاجتماعي، أو لسحب البيانات التعريفية إلى معاينات الارتباط الخاصة بك.
ابدأ البناء مع botoi
أكثر من 150 نقطة نهاية API للبحث ومعالجة النصوص وتوليد الصور وأدوات المطورين. باقة مجانية، بدون بطاقة ائتمان.