İçeriğe geç

Proje 2: Otomatik Blog Yayın Hattı (API + Webhook)

Bir Notion sayfasından otomatik blog yazısı + meta + sosyal post + yayın akışı.

Şükrü Yusuf KAYA
10 dakikalık okuma
İleri
Proje 2: Otomatik Blog Yayın Hattı (API + Webhook)

Mimari#

Tetik: Notion sayfası "Status" sütunu "Ready" olunca webhook tetikler. Pipeline: 5 adım, ~30 saniye. Çıktı: blog yayında + sosyal medya kuyruğunda + Slack'te bildirim.
typescript
// app/api/publish-blog/route.ts (Vercel)
import { NextRequest, NextResponse } from "next/server";
import { OpenAI } from "openai";
import { z } from "zod";
import { zodResponseFormat } from "openai/helpers/zod";
 
const openai = new OpenAI();
 
const SEOPackage = z.object({
title: z.string().max(60),
description: z.string().max(155),
slug: z.string(),
keywords: z.array(z.string()).max(10),
});
 
const SocialPosts = z.object({
linkedin: z.string().max(2000),
twitter: z.string().max(280),
instagram: z.string().max(500),
});
 
export async function POST(req: NextRequest) {
const { notion_page_id, content } = await req.json();
 
// 1. SEO paketi üret
const seo = await openai.beta.chat.completions.parse({
model: "gpt-5",
messages: [
{ role: "system", content: "SEO uzmanısın. JSON döndür." },
{ role: "user", content: `Bu yazı için SEO paketi: ${content.slice(0, 3000)}` },
],
response_format: zodResponseFormat(SEOPackage, "seo"),
});
 
// 2. Sosyal post'ları üret
const social = await openai.beta.chat.completions.parse({
model: "gpt-5",
messages: [
{ role: "system", content: "Sosyal medya copywriter'ısın." },
{ role: "user", content: `Bu blog yazısı için 3 platform için post: ${content.slice(0, 2000)}` },
],
response_format: zodResponseFormat(SocialPosts, "social"),
});
 
// 3. CMS'e yayınla
await fetch(process.env.CMS_API_URL!, {
method: "POST",
headers: { "Authorization": `Bearer ${process.env.CMS_TOKEN}` },
body: JSON.stringify({
content,
...seo.choices[0].message.parsed,
}),
});
 
// 4. Buffer'a sosyal kuyruk
await fetch("https://api.buffer.com/1/updates/create.json", {
method: "POST",
body: JSON.stringify(social.choices[0].message.parsed),
});
 
// 5. Slack bildirim
await fetch(process.env.SLACK_WEBHOOK!, {
method: "POST",
body: JSON.stringify({
text: `✅ Yeni blog yayında: ${seo.choices[0].message.parsed.title}`,
}),
});
 
return NextResponse.json({ success: true });
}
Vercel function — 5 adımlı blog pipeline.

Özet#

✓ Notion → webhook → API → CMS + Sosyal + Slack ✓ ~30 sn'de tam yayın ✓ SEO + 3 platform + bildirim otomatik
Sıradaki proje: Müşteri destek botu.

Yorumlar & Soru-Cevap

(0)
Yorum yazmak için giriş yap.
Yorumlar yükleniyor...

İlgili İçerikler