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
- Aracınız
http://127.0.0.1:8833adresini dinler. - Kullanıcı bunu Ayarlar → Third-Party sekmesinde (sunucu adresi ve port) bağlar ve Bağlantıyı test et ile kontrol eder.
- 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.
- 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.0yerine127.0.0.1adresini 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.
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,
execiç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.
| Alan | Türü | Mevcut |
|---|---|---|
triggerTypeId | number | her zaman — aşağıya bakın |
eventType | string | her zaman — gift, like, chat, follow, share, joined, subscribe, tikfinity veya test |
source | string | her zaman — eulerstream (TikTok), kick, tikfinity veya test |
platform | string | TikTok ve Kick olayları — tiktok veya kick |
username | string | her zaman — izleyicinin kullanıcı adı |
nickname | string | TikTok ve Kick olayları — görünen ad |
userId | string | TikTok ve Kick olayları |
profilePictureUrl | string | genellikle (TikTok avatar bağlantılarının süresi dolar) |
comment | string | sohbet mesajları; Kick'te ayrıca bir hediyeye eklenen mesaj |
giftName | string | hediyeler |
giftId | number | TikTok hediyeleri |
repeatCount | number | TikTok hediyeleri — seri içindeki hediye sayısı; Kick hediye abonelikleri — alıcı sayısı |
diamondCount | number | hediyeler — Diamonds cinsinden değer (TikTok) veya Kicks cinsinden fiyat (Kick) |
coins | number | diamondCount ile aynı |
likeCount | number | beğeniler |
subMonth | number | abonelikler |
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:
| Kimlik | Tetikleyici |
|---|---|
| 1 | Paylaşım |
| 3 | Min-Max (hediye değer aralığı) |
| 4 | Hediye |
| 6 | Katıldı |
| 7 | Beğeni |
| 9 | Takip |
| 10 | Subscribe / Süper Hayran |
| 11 | Sohbet |
| 0 | TikFinity 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,messageuyarı 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
- Aracınızı başlatın.
- 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.
- 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.
- Yeni satırda Test'e tıklayın — aracınız
eventType: "test"ile birexecalır. - 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.