Files
mstfyldz/TELEGRAM_N8N_AUTOMATION.md

9.9 KiB
Raw Permalink Blame History

🤖 Telegram & n8n ile Otomatik Not Ekleme Rehberi

Bu rehber, Telegram üzerinden tek bir mesaj atarak mstfyldz journal defterinize doğrudan yeni notlar, fikirler, kod parçaları veya polaroid görseller eklemenizi sağlayan n8n otomasyon mimarisini açıklar.


🎯 Mimari Genel Bakış

[ Telegram Mesajı ] 
       │
       ▼ (BotFather Webhook)
[ n8n Telegram Trigger ] 
       │
       ▼ (Güvenlik Kontrolü: Yalnızca Sizin Chat ID'niz)
[ n8n Code / AI Node ] ────► (Format, Mood ve Etiketleri Otomatik Algılar)
       │
       ▼ (HTTP Request Node)
[ POST https://mstfyldz.com/api/posts ] ───► [ PostgreSQL DB ]
       │
       ▼ (Onay Mesajı)
[ Telegram Bot Cevabı ] ────► "✅ Not Deftere Karalandı!"

📋 Ön Gereksinimler

  1. Telegram Bot Token: @BotFather üzerinden oluşturulmuş bot token'ı.
  2. n8n Sunucusu: Çalışan bir n8n instance'ı.
  3. Journal API: Sitenizin https://mstfyldz.com/api/posts adresi (veya doğrudan PostgreSQL bağlantısı).

🛠️ Adım Adım Kurulum Rehberi

Adım 1: Telegram Bot Oluşturma

  1. Telegram'da @BotFather kullanıcısını aratın ve başlatın.
  2. /newbot komutunu gönderin.
  3. Botunuza bir isim verin (Örn: mstfyldz_journal_bot).
  4. BotFather'ın verdiği HTTP API Token'ı kopyalayın.
  5. BotFather'a /mybots yazıp botunuzu seçin ve Chat ID'nizi öğrenmek için botunuza ilk mesajı atın.

Adım 2: n8n Workflow Düğümleri (Nodes)

1. Telegram Trigger Node

  • Resource: Message
  • Event: Message Received
  • Credentials: BotFather'dan aldığınız API Token.

2. Security Switch / If Node (Sadece Sizin Mesajlarınızı Kabul Eder)

  • Condition: {{ $json.message.from.id }} EQUALS [SİZİN_TELEGRAM_CHAT_ID]
  • Amacı: Yabancı kişilerin botunuza mesaj atarak veritabanınıza not eklemesini engeller.

3. Code Node (Format & Payload Dönüştürücü)

Gelen mesaj metnini mstfyldz journal API formatına dönüştürür:

const msg = $input.item.json.message;
const text = msg.text || msg.caption || "";

// Tarih ve Saat Formatı (Örn: 16 AĞU 2026 • 17:30)
const now = new Date();
const dateStr = now.toLocaleDateString("tr-TR", { day: "2-digit", month: "short", year: "numeric" }).toUpperCase();
const timeStr = now.toLocaleTimeString("tr-TR", { hour: "2-digit", minute: "2-digit" });

// Etiketleri algıla (Örn: #felsefe #kod -> ["felsefe", "kod"])
const tagMatches = text.match(/#[\wĞÜŞİÖÇğüşiöç]+/g) || [];
const tags = tagMatches.map(t => t.replace("#", ""));
if (tags.length === 0) tags.push("telegram");

// Etiketleri içerikten temizle
const cleanContent = text.replace(/#[\wĞÜŞİÖÇğüşiöç]+/g, "").trim();

// Format Tespiti (Kod bloğu, fotoğraf veya standart metin)
let type = "sticky";
let title = undefined;
let codeSnippet = undefined;

if (text.includes("```")) {
  type = "code";
  const codeMatch = text.match(/```(?:\w+)?\n([\s\S]*?)```/);
  codeSnippet = codeMatch ? codeMatch[1] : text;
  title = "Telegram Kod Kırıntısı";
} else if (msg.photo) {
  type = "polaroid";
} else if (cleanContent.length > 200) {
  type = "notebook";
  title = cleanContent.split("\n")[0].substring(0, 50);
}

// Mood Tespiti (Rastgele veya içerik bazlı)
const moods = ["spark", "focus", "night", "calm", "visual"];
const moodMap = {
  spark: "Fikir Patlaması",
  focus: "Aşırı Odak & Kaos",
  night: "Gece Melankolisi",
  calm: "Sakin & Karalama",
  visual: "Polaroid & Kırıntılar"
};
const selectedMood = msg.photo ? "visual" : (type === "code" ? "night" : "spark");

return {
  json: {
    id: `post-tg-${Date.now()}`,
    type,
    date: dateStr,
    timestamp: timeStr,
    mood: selectedMood,
    moodLabel: moodMap[selectedMood],
    title,
    content: cleanContent || "Telegram'dan gönderilen görsel",
    marginNotes: ["← Telegram ile atıldı 📱"],
    tags,
    likes: 1,
    stampedText: "TELEGRAM",
    codeSnippet
  }
};

4. HTTP Request Node (Veritabanına Kayıt)

  • Method: POST
  • URL: https://mstfyldz.com/api/posts (veya http://65.109.236.58:3000/api/posts)
  • Headers: Content-Type: application/json
  • Body Parameters: JSON.stringify($json)

5. Telegram Response Node (Onay Bildirimi)

  • Resource: Message
  • Operation: Send Message
  • Text: ✅ *Not Deftere Karalandı!*\n\n📌 *Format:* {{ $json.type }}\n💡 *Mood:* {{ $json.moodLabel }}\n🏷️ *Etiketler:* #{{ $json.tags.join(' #') }}

Telegram Kullanım Örnekleri

1. Hızlı Fikir / Post-it Notu

Bugün sade mimarilerin karmaşık mimarilere göre 10 kat daha hızlı bakım sağladığını bir kez daha gördüm. #felsefe #yazılım

2. Kod Kırıntısı Gönderme

n8n webhook ile gelen veriyi parse eden JS fonksiyonu #js #automation
```javascript
const clean = text.trim();

### 3. Polaroid Fotoğraf Gönderme
Telegram'dan bir fotoğraf yükleyip altına açıklama yazdığınızda otomatik olarak `polaroid` formatına dönüştürülür.

### 4. Sesli Mesaj (Voice Note) Gönderme
Telegram'dan sesli mesaj attığınızda n8n akışındaki **OpenAI Whisper Node** sesi deşifre eder ve otomatik olarak `audio` formatında kaset çalar görünümüyle deftere ekler.

---

## 🎙️ Sesli Mesaj (Voice Note) Mimarisi

Telegram'dan bir sesli mesaj gönderdiğinizde izlenen adımlar:

1. **Telegram Get File Node:** Gelen `msg.voice.file_id` ses dosyasını Telegram sunucusundan indirir.
2. **OpenAI Whisper Node (STT):** Ses dosyasını metne dönüştürür (*Speech-to-Text*).
3. **Audio Format Özellikleri:**
   - `type`: `"audio"`
   - `content`: Whisper tarafından deşifre edilen konuşma metni.
   - `audioTitle`: `"Telegram_Ses_Kaydi.m4a"`
   - `audioDuration`: Telegram'dan alınan süre bilgisi (Örn: `01:45`).
   - `marginNotes`: `["* Whisper AI ile otomatik deşifre edildi 🎙️"]`

---

## 🧠 AI (Yapay Zeka) ile Akıllı Mood, Kenar Notu ve Etiket Tespiti

### **Kesinlikle AI Eklemenizi Öneririm! Neden mi?**

İnsan ruh hali ve yazılan düşünceler karmaşıktır. Statik kod kuralları (`if text.includes(...)`) yerine n8n içerisine **OpenAI (GPT-4o-mini)** veya **Claude 3.5 Haiku** düğümü eklediğinizde AI sizin **Kişisel Editörünüz & Mood Küratörünüz** gibi davranır.

### AI Eklemenin Kazandırdığı 4 Harika Özellik:

1. **Akıllı Mood Tespiti:** Yazdığınız samimi cümlenin ruh halini doğrudan 5 ana kategoriden birine eşler (`spark`, `focus`, `night`, `calm`, `visual`).
2. **Esprili Kenar Notları (Marginalia):** AI, yazdığınız mesaja uygun samimi el yazısı kenar notları uydurur (Örn: *"← tam olarak bu!"*, *"çayı tazelemeyi unutma ☕"*, *"derleyici yine haklı çıktı"*).
3. **Damga Seçimi:** AI mesaja en çok uyan damgayı belirler (`ONAYLANDI`, `COMPILED`, `SUÇLU`, `DOĞRU TESPİT`).
4. **Bağlamsal Etiketler:** Metnin özünden en doğru etiketleri üretir (Örn: `["yazılım", "felsefe", "kadıköy"]`).

### AI Node Prompt Örneği (n8n OpenAI / LLM Node):

> **Sistem Rolü:** Sen Mustafa Yıldız'ın (mstfyldz) kişisel dijital günlüğünün yapay zeka yayın editörüsün. Görevin, Telegram'dan gelen döküntü metinleri veya ses transkriptlerini inceleyerek JSON formatında mood ve meta veri çıkarmaktır.
>
> **Taramak İstediğimiz Mood Türleri:**
> 1. `spark`: Fikir Patlaması (Ani aydınlanmalar, harika fikirler, heyecanlı projeler)
> 2. `focus`: Aşırı Odak & Kaos (Kod yazma, teknik problemler, 15 katmanlı soyutlamalar)
> 3. `night`: Gece Melankolisi (Saat 03:00 varoluşsal düşünceleri, derin felsefe)
> 4. `calm`: Sakin & Karalama (Çay/kahve anları, yürüyüş gözlemleri, dinginlik)
> 5. `visual`: Polaroid & Kırıntılar (Fotoğraf açıklamaları, doğa)
>
> **Beklenen Çıktı (Sadece JSON):**
> ```json
> {
>   "mood": "spark",
>   "moodLabel": "Fikir Patlaması",
>   "stampedText": "ONAYLANDI",
>   "tags": ["felsefe", "yazılım"],
>   "marginNotes": ["← tam olarak bu!", "çayı tazelemeyi unutma ☕"],
>   "title": "İsteğe bağlı kısa başlık"
> }
> ```

### AI Entegrasyonu Sonrası Tam Akış Şeması:

[ Telegram Sesli/Metin Mesajı ] │ ▼ [ OpenAI Whisper (Sesli Mesajsa Metne Çevir) ] │ ▼ [ OpenAI GPT-4o-mini (Mood, Kenar Notu, Etiket & Damga Belirle) ] │ ▼ [ POST https://mstfyldz.com/api/posts ] ───► [ PostgreSQL DB ]


---

## 📦 n8n Hazır Workflow JSON (Import Edilebilir)

Aşağıdaki JSON verisini n8n'de **Import from JSON** alanına yapıştırarak tüm workflow'u saniyeler içinde oluşturabilirsiniz:

```json
{
  "name": "mstfyldz Journal - Telegram Automation",
  "nodes": [
    {
      "parameters": {
        "updates": ["message"]
      },
      "name": "Telegram Trigger",
      "type": "n8n-nodes-base.telegramTrigger",
      "typeVersion": 1.1,
      "position": [250, 300]
    },
    {
      "parameters": {
        "conditions": {
          "number": [
            {
              "value1": "={{ $json.message.from.id }}",
              "operation": "equal",
              "value2": 123456789
            }
          ]
        }
      },
      "name": "Auth Check (Chat ID)",
      "type": "n8n-nodes-base.if",
      "typeVersion": 1,
      "position": [450, 300]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://mstfyldz.com/api/posts",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify($json) }}"
      },
      "name": "HTTP POST to Journal API",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.1,
      "position": [850, 300]
    }
  ],
  "connections": {
    "Telegram Trigger": {
      "main": [[{ "node": "Auth Check (Chat ID)", "type": "main", "index": 0 }]]
    }
  }
}