Tutorial

Φτιάξε overlay για TikTok LIVE

Φτιάξε overlay σε πραγματικό χρόνο ως browser source συμβατό με OBS, που δείχνει live chat, ειδοποιήσεις δώρων και αριθμό θεατών από οποιοδήποτε TikTok LIVE stream.

Τι θα φτιάξεις

Ένα overlay για stream μέσα στον browser, που δουλεύει με OBS, Streamlabs ή οποιοδήποτε software υποστηρίζει browser sources. Δείχνει:

  • Μηνύματα live chat σε πραγματικό χρόνο
  • Animated ειδοποιήσεις δώρων με αξία σε διαμάντια
  • Τρέχοντα αριθμό θεατών
  • Ροή chat που κυλάει, με avatars χρηστών

Προαπαιτούμενα

  • Εγκατεστημένο Node.js 18+
  • Ένα δωρεάν TikTools API key - πάρε ένα εδώ
  • OBS Studio (ή οποιοδήποτε software streaming με Browser Source)

Βήμα 1: Στήσε το project

mkdir tiktok-overlay && cd tiktok-overlay
npm init -y
npm install @tiktool/live express

Βήμα 2: Φτιάξε τον server

Δημιούργησε το server.mjs - αυτό συνδέεται στο TikTok και μεταδίδει τα events μέσω Server-Sent Events (SSE) στο overlay του browser:

import express from 'express'
import { TikTokLive } from '@tiktool/live'

const app = express()
const clients = new Set()

// Serve the overlay HTML
app.get('/', (req, res) => {
  res.sendFile('overlay.html', { root: '.' })
})

// SSE endpoint for real-time events
app.get('/events', (req, res) => {
  res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    Connection: 'keep-alive',
  })
  clients.add(res)
  req.on('close', () => clients.delete(res))
})

function broadcast(event, data) {
  for (const client of clients) {
    client.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`)
  }
}

// Connect to TikTok LIVE
const tiktok = new TikTokLive({
  uniqueId: process.env.STREAMER || 'tv_asahi_news',
  apiKey: process.env.TIKTOOL_API_KEY
})

tiktok.on('chat', (e) => broadcast('chat', {
  user: e.nickname, comment: e.comment, avatar: e.profilePictureUrl
}))

tiktok.on('gift', (e) => broadcast('gift', {
  user: e.nickname, gift: e.giftName, diamonds: e.diamondCount
}))

tiktok.on('viewer_count', (e) => broadcast('viewers', {
  count: e.viewerCount
}))

await tiktok.connect()
app.listen(3333, () => console.log('Overlay: http://localhost:3333'))

Βήμα 3: Φτιάξε το HTML του overlay

Δημιούργησε το overlay.html - αυτό θα εμφανίζει το OBS ως browser source:

<!DOCTYPE html>
<html>
<head>
  <style>
    * { margin: 0; padding: 0; box-sizing: border-box; }
    body {
      font-family: 'Inter', sans-serif;
      background: transparent;
      overflow: hidden;
    }

    .chat-feed {
      position: fixed; bottom: 20px; left: 20px;
      width: 360px; max-height: 400px;
      display: flex; flex-direction: column-reverse;
      gap: 6px; overflow: hidden;
    }

    .chat-msg {
      background: rgba(0, 0, 0, 0.6);
      border-radius: 8px; padding: 8px 12px;
      color: #fff; font-size: 14px;
      animation: slideIn 0.3s ease;
    }

    .chat-msg .user { color: #fff; font-weight: 600; }

    .gift-alert {
      position: fixed; top: 50%; left: 50%;
      transform: translate(-50%, -50%);
      background: rgba(0, 0, 0, 0.8);
      border: 2px solid var(--border-primary);
      border-radius: 16px; padding: 24px 40px;
      text-align: center; color: #fff;
      animation: popIn 0.5s ease;
      display: none;
    }

    .gift-alert.show { display: block; }
    .gift-alert .gift-name { font-size: 28px; font-weight: 800; }
    .gift-alert .gift-user { font-size: 16px; color: #94a3b8; }
    .gift-alert .gift-diamonds { font-size: 18px; color: #fff; }

    .viewer-count {
      position: fixed; top: 20px; right: 20px;
      background: rgba(0, 0, 0, 0.6);
      border-radius: 8px; padding: 8px 16px;
      color: #fff; font-size: 14px; font-weight: 600;
    }

    @keyframes slideIn {
      from { opacity: 0; transform: translateY(10px); }
      to { opacity: 1; transform: translateY(0); }
    }

    @keyframes popIn {
      0% { opacity: 0; transform: translate(-50%, -50%) scale(0.5); }
      100% { opacity: 1; transform: translate(-50%, -50%) scale(1); }
    }
  </style>
</head>
<body>
  <div class="chat-feed" id="chat"></div>
  <div class="gift-alert" id="gift">
    <div class="gift-name" id="gift-name"></div>
    <div class="gift-user" id="gift-user"></div>
    <div class="gift-diamonds" id="gift-diamonds"></div>
  </div>
  <div class="viewer-count" id="viewers">👁 0</div>

  <script>
    const chat = document.getElementById('chat')
    const gift = document.getElementById('gift')
    const src = new EventSource('/events')

    src.addEventListener('chat', (e) => {
      const d = JSON.parse(e.data)
      const el = document.createElement('div')
      el.className = 'chat-msg'
      el.innerHTML = `<span class="user">${d.user}</span> ${d.comment}`
      chat.prepend(el)
      if (chat.children.length > 50) chat.lastChild.remove()
    })

    src.addEventListener('gift', (e) => {
      const d = JSON.parse(e.data)
      document.getElementById('gift-name').textContent = `🎁 ${d.gift}`
      document.getElementById('gift-user').textContent = `from ${d.user}`
      document.getElementById('gift-diamonds').textContent = `${d.diamonds} 💎`
      gift.classList.add('show')
      setTimeout(() => gift.classList.remove('show'), 4000)
    })

    src.addEventListener('viewers', (e) => {
      const d = JSON.parse(e.data)
      document.getElementById('viewers').textContent = `👁 ${d.count.toLocaleString()}`
    })
  </script>
</body>
</html>

Βήμα 4: Τρέξ' το και πρόσθεσέ το στο OBS

TIKTOOL_API_KEY=your_key STREAMER=target_username node server.mjs

Μετά στο OBS:

  • Πρόσθεσε νέο Browser Source
  • Βάλε URL http://localhost:3333
  • Βάλε πλάτος 1920 και ύψος 1080
  • Τσέκαρε το "Shutdown source when not visible"

Ιδέες για προσαρμογή

  • Δικά σου themes - άλλαξε χρώματα, γραμματοσειρές και διάταξη ώστε να ταιριάζουν με το brand του stream σου
  • Ηχητικά εφέ - παίξε ήχους όταν φτάνουν δώρα με το Web Audio API
  • Animations με GIF - δείξε animated GIF για συγκεκριμένα δώρα
  • Μπάρες στόχων - πρόσθεσε μπάρες προόδου για στόχους δωρεών/δώρων
  • Βάθρο top gifters - δείξε τους top 3 gifters σε πραγματικό χρόνο