Third-Party Arayüzü

BakoshApp'in yönetebileceği bir araç geliştirin: yerel bir portta dört HTTP uç noktası sunun, programınız TikTok ve Kick hediyelerine, beğenilerine, takiplerine ve sohbetine tepki versin.

BakoshApp, kendi programınızın içinde işlemler çalıştırabilir. Aracınız, yerel bir portta küçük bir HTTP API sunar; BakoshApp işlemlerinizin listesini okur ve bir TikTok veya Kick olayı kullanıcının tetikleyicisiyle eşleştiğinde birini çağırır. Koddan kontrol edebileceğiniz her şey — akıllı ışıklar, bir mikrodenetleyici, bir ses paneli, başka bir oyun, kendi botunuz — bir BakoshApp modu olmadan canlı yayına tepki verebilir.

Nasıl çalışır

  1. Aracınız http://127.0.0.1:8833 adresini dinler.
  2. Kullanıcı bunu Ayarlar → Third-Party sekmesinde (sunucu adresi ve port) bağlar ve Bağlantıyı test et ile kontrol eder.
  3. Bir modun İşlemler sekmesinde kullanıcı Yeni ekle'ye tıklar, bir tetikleyici seçer ve Tüm Eylemler → Harici içinde bir Third-Party Action yapılandırır: BakoshApp iki listeyi kategorilerinizle ve işlemlerinizle doldurur.
  4. Eşleşen her olayda BakoshApp aracınızı çağırır ve işi kodunuz yapar.

Bağlantı tek yönlüdür: BakoshApp sizi çağırır, asla tersi olmaz.

Port ve adres

  • Varsayılan 8833'tür. Kullanıcı bunu Ayarlar → Third-Party sekmesinde değiştirebilir; başka bir port kullanıyorsanız kullanıcılarınıza hangi portu gireceklerini söyleyin.
  • 8832 kullanılamaz: BakoshApp orayı kendisi dinler (TikFinity, BakoshApp'i bu şekilde bulur) ve ayar bu portu reddeder.
  • Kimlik doğrulama yoktur. API'nin ağdan erişilebilir olmaması için 0.0.0.0 yerine 127.0.0.1 adresini dinleyin.
  • BakoshApp her zaman düz HTTP kullanır.

Uç noktalar

Aracınız dördünü de sunmalıdır. Her yanıt, bir data üyesi içeren JSON'dur.

1. Uygulama bilgisi

Aracınızı tanımlar. BakoshApp bunu Ayarlar'da ve işlem yapılandırıcısında "Connected with Mock Tool 1.0 by Bakosh" olarak gösterir.

GET /api/app/info
{ "data": { "name": "Mock Tool", "version": "1.0", "author": "Bakosh" } }

2. Kategoriler

Yapılandırıcıdaki ilk liste.

GET /api/features/categories
{
  "data": [
    { "categoryId": "smart_device_control", "categoryName": "Control Smart Devices" },
    { "categoryId": "serial_port_control",  "categoryName": "Control Serial Port" }
  ]
}

3. İşlemler

İkinci liste: bir kategorinin işlemleri. categoryId URL kodludur.

GET /api/features/actions?categoryId=smart_device_control
{
  "data": [
    { "actionId": "turn_lights_on",  "actionName": "Turn Lights On" },
    { "actionId": "turn_lights_off", "actionName": "Turn Lights Off" }
  ]
}

Listeler, öğelerinizi döndürdüğünüz sırayla gösterir. Kullanıcının daha önce kaydettiği ama sizin artık döndürmediğiniz bir işlem, listenin en üstünde kalır; böylece sessizce değişmez.

Uyarı

categoryId ve actionId, BakoshApp'in yapılandırılmış bir işlem için sakladığı tek şeydir. Bunları sabit tutun: bir kimliği yeniden adlandırmak mevcut kurulumları bozar. Adlar yalnızca görüntüleme içindir ve istediğiniz zaman değişebilir.

4. Çalıştırma

Eşleşen bir olay işlemi her çalıştırdığında çağrılır.

POST /api/features/actions/exec
{
  "categoryId": "smart_device_control",
  "actionId": "turn_lights_on",
  "context": {
    "triggerTypeId": 4,
    "eventType": "gift",
    "source": "eulerstream",
    "platform": "tiktok",
    "userId": "123456789",
    "username": "testuser",
    "nickname": "Test User",
    "giftName": "Rose",
    "giftId": 5655,
    "repeatCount": 3,
    "diamondCount": 1,
    "coins": 1,
    "profilePictureUrl": "https://…"
  }
}

İsteği kabul ettikten sonra boş bir data dizisiyle yanıt verin:

{ "data": [] }

Zamanlama

  • BakoshApp, üç GET uç noktası için en fazla 5 saniye, exec için ise 10 saniye bekler. Başarısız olan veya zaman aşımına uğrayan bir istek tekrarlanmaz.
  • İşlemin Adet değeri 1'den büyükse, BakoshApp exec'i o kadar kez art arda çağırır: önce yanıtınızı bekler, sonra satırın Aralık süresini bekler, ardından tekrar çağırır.
  • Aynı satır için çağrılar tek tek gelir; farklı satırlar sizi paralel olarak çağırabilir.

Bu yüzden hızlı yanıt verin ve yavaş işleri arka planda yapın — izleyiciler, bir seri portun hareket edebildiğinden daha hızlı hediye gönderebilir.

context nesnesi

context, işlemi çalıştıran olayı açıklar. Yalnızca o olay için var olan alanlar bulunur — okumadan önce kontrol edin.

AlanTürüMevcut
triggerTypeIdnumberher zaman — aşağıya bakın
eventTypestringher zaman — gift, like, chat, follow, share, joined, subscribe, tikfinity veya test
sourcestringher zaman — eulerstream (TikTok), kick, tikfinity veya test
platformstringTikTok ve Kick olayları — tiktok veya kick
usernamestringher zaman — izleyicinin kullanıcı adı
nicknamestringTikTok ve Kick olayları — görünen ad
userIdstringTikTok ve Kick olayları
profilePictureUrlstringgenellikle (TikTok avatar bağlantılarının süresi dolar)
commentstringsohbet mesajları; Kick'te ayrıca bir hediyeye eklenen mesaj
giftNamestringhediyeler
giftIdnumberTikTok hediyeleri
repeatCountnumberTikTok hediyeleri — seri içindeki hediye sayısı; Kick hediye abonelikleri — alıcı sayısı
diamondCountnumberhediyeler — Diamonds cinsinden değer (TikTok) veya Kicks cinsinden fiyat (Kick)
coinsnumberdiamondCount ile aynı
likeCountnumberbeğeniler
subMonthnumberabonelikler

TikFinity'den aktarılan olaylar yalnızca triggerTypeId (her zaman 0), source, eventType ve username taşır.

Tetikleyici türleri

triggerTypeId, kullanıcının yapılandırdığı tetikleyicinin türüdür; böylece ada göre seçilen bir hediye ile değere göre eşleşen bir hediye birbirinden ayırt edilir:

KimlikTetikleyici
1Paylaşım
3Min-Max (hediye değer aralığı)
4Hediye
6Katıldı
7Beğeni
9Takip
10Subscribe / Süper Hayran
11Sohbet
0TikFinity veya başka herhangi bir şey

Bilinmeyen kimlikleri 0 olarak değerlendirin; yenileri eklenebilir.

Test düğmesi

İşlem satırındaki Test (ve onun kısayol tuşu) örnek verilerle exec'i çağırır: source ve eventType test'tir, triggerTypeId satırın tetikleyicisinden gelir, izleyici bakosh_app'tır ve hediye bir Rose'dur (giftId 5655). platform yoktur.

Sorunları bildirme

Neyin yanlış gittiğini açıklamak için bir message döndürün:

{ "message": "Serial port COM3 is not available" }
  • GET uç noktalarında, herhangi bir message, HTTP 200 olsa bile BakoshApp'in yanıtı hata olarak değerlendirmesine neden olur.
  • exec'te, message uyarı olarak BakoshApp konsoluna ve günlük dosyasına yazılır. Kullanıcıya açılır pencere gösterilmez.

HTTP hata durumları da dikkate alınır; bir message olmadan günlükte yalnızca durum kodu gösterilir.

TikFinity ile birlikte çalışma

Bu arayüz, TikFinity'nin third-party arayüzüyle eşleşir — aynı dört yol ve alan adı — bu yüzden tek bir araç ikisine de hizmet verebilir. Portlar farklıdır: TikFinity, araçları 8832'de arar; bu portu BakoshApp çalışırken kendisi kullanır, bu yüzden BakoshApp'e başka bir port verin.

TikFinity bir web uygulamasıdır ve CORS başlıklarına (Access-Control-Allow-Origin: * ve benzerleri) ve OPTIONS preflight isteklerine yanıt verilmesine ihtiyaç duyar. BakoshApp'in bunlara ihtiyacı yoktur, ancak gönderilmeleri zarar vermez. BakoshApp, TikFinity'den daha fazla context alanı gönderir — kullanmadıklarınızı yok sayın.

Eksiksiz, çalışan bir araç

Bağımlılık yok — tool.mjs olarak kaydedin ve node tool.mjs komutunu çalıştırın:

import http from 'node:http';
 
const PORT = 8833;
 
const APP_INFO = { name: 'Mock Tool', version: '1.0', author: 'Bakosh' };
 
const CATALOG = [
  {
    categoryId: 'smart_device_control',
    categoryName: 'Control Smart Devices',
    actions: [
      { actionId: 'turn_lights_on', actionName: 'Turn Lights On' },
      { actionId: 'turn_lights_off', actionName: 'Turn Lights Off' },
    ],
  },
];
 
// Wildcard CORS keeps the same tool usable from TikFinity as well.
const CORS = {
  'Access-Control-Allow-Origin': '*',
  'Access-Control-Allow-Headers': '*',
  'Access-Control-Allow-Methods': '*',
};
 
const send = (res, status, body) => {
  res.writeHead(status, { 'Content-Type': 'application/json', ...CORS });
  res.end(JSON.stringify(body));
};
 
const readBody = (req) =>
  new Promise((resolve) => {
    let raw = '';
    req.on('data', (c) => { raw += c; });
    req.on('end', () => { try { resolve(JSON.parse(raw || '{}')); } catch { resolve({}); } });
  });
 
// Your actual work goes here. Return a string to report a problem.
function runAction(categoryId, actionId, context) {
  console.log(`${categoryId}/${actionId} fired by ${context.username ?? 'someone'} on ${context.platform ?? context.source}`);
  // turnLightsOn() …
  return null;
}
 
http.createServer(async (req, res) => {
  const url = new URL(req.url, `http://127.0.0.1:${PORT}`);
 
  if (req.method === 'OPTIONS') {           // preflight (TikFinity only)
    res.writeHead(204, CORS);
    return res.end();
  }
 
  if (req.method === 'GET' && url.pathname === '/api/app/info') {
    return send(res, 200, { data: APP_INFO });
  }
 
  if (req.method === 'GET' && url.pathname === '/api/features/categories') {
    return send(res, 200, {
      data: CATALOG.map(({ categoryId, categoryName }) => ({ categoryId, categoryName })),
    });
  }
 
  if (req.method === 'GET' && url.pathname === '/api/features/actions') {
    const cat = CATALOG.find((c) => c.categoryId === url.searchParams.get('categoryId'));
    return send(res, 200, { data: cat ? cat.actions : [] });
  }
 
  if (req.method === 'POST' && url.pathname === '/api/features/actions/exec') {
    const body = await readBody(req);
    const problem = runAction(body.categoryId ?? '', body.actionId ?? '', body.context ?? {});
    return problem ? send(res, 200, { message: problem }) : send(res, 200, { data: [] });
  }
 
  send(res, 404, { message: `No such endpoint: ${url.pathname}` });
}).listen(PORT, '127.0.0.1', () => console.log(`Listening on http://127.0.0.1:${PORT}`));

Aracınızı test etme

  1. Aracınızı başlatın.
  2. BakoshApp'te Ayarlar → Third-Party'i açın, sunucu adresini ve portu kontrol edin ve Bağlantıyı test et'e tıklayın. Aracınızın adını, sürümünü ve yazarını görmelisiniz.
  3. Bir modun İşlemler sekmesinde Yeni ekle'ye tıklayın, bir tetikleyici seçin ve İleri'ye tıklayın. Tüm Eylemler → Harici içinde, Third-Party Action'ın yanındaki Configure'a tıklayın, kategorinizi ve işleminizi seçin ve kaydedin.
  4. Yeni satırda Test'e tıklayın — aracınız eventType: "test" ile bir exec alır.
  5. Yayına geçin ve gerçek olayların ulaştığını kontrol edin.

Yapılandırıcı "Bağlanılamadı! Entegrasyonunu kontrol et." derse, aracın 127.0.0.1'i dinlediğini, portun Ayarlar ile eşleştiğini ve GET /api/app/info'nun yanıtını data içinde döndürdüğünü kontrol edin.