# 🤖 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:

```javascript
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
```text
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
```text
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 }]]
    }
  }
}
```
