Vfinity2.0 α
นักพัฒนา

Local API

รันคำสั่ง เรียกใช้อีเวนต์ และติดตามสตรีมของคุณจากสคริปต์ของคุณเอง ผ่าน HTTP หรือ WebSocket

สคริปต์ของคุณ

POST /api/trigger
Host: 127.0.0.1:21424
Authorization: Bearer YOUR_TOKEN
Content-Type: application/json

{
  "name": "hype",
  "data": {
    "name": "mochi"
  }
}
กำลังส่ง…

อีเวนต์

ทริกเกอร์ API

hype

ฮอตคีย์ VTS · ตาประกายดาว

POST /api/trigger เรียกทุกการจับคู่ที่มีทริกเกอร์ API ชื่อตรงกัน

สั่งการ Vfinity จากสคริปต์ ปลั๊กอิน Stream Deck หรือแอปของคุณเองบนคอมพิวเตอร์เครื่องเดียวกัน ส่งข้อความ JSON เพื่อรันคำสั่งแอปหรือเรียกใช้อีเวนต์ของคุณ และรับฟังข้อมูลของขวัญ แชต และผลลัพธ์ผ่าน WebSocket ได้แบบเรียลไทม์

Local API ใช้งานเซิร์ฟเวอร์ร่วมกับโอเวอร์เลย์ OBS บนพอร์ตของโอเวอร์เลย์ โดยจะตอบรับเฉพาะโปรแกรมที่ทำงานอยู่บนคอมพิวเตอร์เครื่องนี้เท่านั้น และต้องแนบโทเค็นการเข้าถึงของคุณมาด้วยเสมอ

21424
พอร์ตที่โอเวอร์เลย์และ API ใช้ร่วมกัน
Bearer
โทเค็นในทุกคำขอ
127.0.0.1
เฉพาะคอมพิวเตอร์เครื่องนี้เท่านั้น

เวอร์ชัน Alpha

Vfinity 2.0 เป็นเวอร์ชัน Alpha ซึ่งฟังก์ชันการทำงานอาจมีการเปลี่ยนแปลงระหว่างบิลด์ โปรดทดสอบการเชื่อมต่อของคุณใหม่อีกครั้งหลังจากมีการอัปเดตก่อนเริ่มไลฟ์จริง

เปิดใช้งาน Local API

เปิดการ์ดเซิร์ฟเวอร์ภายในเครื่อง

ไปที่ การตั้งค่าการเชื่อมต่อ เลื่อนลงไปที่ส่วน ขั้นสูง แล้วเปิดการ์ด เซิร์ฟเวอร์ภายในเครื่อง แถวสถานะจะแสดง กำลังฟังอยู่ที่ http://127.0.0.1:21424 เมื่อเซิร์ฟเวอร์พร้อมทำงาน

เปิดสวิตช์ใช้งาน

เปิดสวิตช์ เปิดใช้งาน Local API Vfinity จะสร้าง โทเค็นการเข้าถึง API ให้คุณโดยอัตโนมัติในครั้งแรก

คัดลอกโทเค็นและที่อยู่

คลิก คัดลอก ใต้โทเค็นแล้วนำไปวางในสคริปต์ของคุณ การ์ดยังแสดงที่อยู่สองรายการที่ต้องใช้งาน คือ URL สถานะ และ URL ของ WebSocket คลิกที่รายการใดก็ได้เพื่อคัดลอก

ปุ่ม สร้างโทเค็นใหม่ จะสร้างโทเค็นชุดใหม่ขึ้นมาแทนที่ สคริปต์เดิมทั้งหมดที่ใช้โทเค็นเก่าจะถูกตัดการเชื่อมต่อทันที ส่วนโอเวอร์เลย์และการเชื่อมต่อไลฟ์จะยังคงทำงานต่อไป คุณยังสามารถพิมพ์โทเค็นที่ต้องการได้เอง โดยต้องมีความยาว 32 ถึง 256 ตัวอักษร ประกอบด้วยตัวอักษร ตัวเลข ขีดกลาง หรือขีดล่าง

พอร์ตจะอยู่ในการ์ดเดียวกันในช่อง พอร์ตเซิร์ฟเวอร์ที่ใช้ร่วมกัน พอร์ตใหม่จะมีผลหลังจากรีสตาร์ท Vfinity หากพอร์ตถูกใช้งานอยู่ตอนเริ่มแอป Vfinity จะเลือกพอร์ตอื่นและแสดงที่อยู่ที่ใช้งานจริงบนการ์ด

เครื่องนี้

VfinityVTube Studio8001

Vfinity เชื่อมต่อ API ของ VTube Studio ที่พอร์ต 8001 เพื่อกดฮอตคีย์และขยับโมเดล

VfinityOBS · เซิร์ฟเวอร์ WebSocket4455

Vfinity เชื่อมต่อเซิร์ฟเวอร์ WebSocket ใน OBS ที่พอร์ต 4455 เพื่อสลับซีนและแสดงแหล่งข้อมูล

OBS · แหล่งเบราว์เซอร์Vfinity · โอเวอร์เลย์ + Local API21424

แหล่งเบราว์เซอร์ OBS เปิดเซิร์ฟเวอร์ของ Vfinity ที่พอร์ต 21424 เพื่อวาดไอเทมที่ขว้าง การแจ้งเตือน และวิดเจ็ต

สคริปต์ของคุณVfinity · โอเวอร์เลย์ + Local API21424

สคริปต์ของคุณเข้าถึง Local API บนพอร์ตเดียวกันคือ 21424 โดยใช้โทเค็น

VfinityTikTok LIVE · Twitch · Kick · YouTubeอินเทอร์เน็ต

TikTok LIVE, Twitch, Kick และ YouTube เชื่อมต่อผ่านอินเทอร์เน็ต โดย Vfinity เป็นฝ่ายเปิดการเชื่อมต่อแต่ละรายการ

ลูกศร: ใครเริ่มเชื่อมต่อ
พอร์ต: ใครรอรับการเชื่อมต่อ

Local API และโอเวอร์เลย์ใช้งานเซิร์ฟเวอร์เดียวกันบนพอร์ต 21424 โดยรับฟังเฉพาะบนคอมพิวเตอร์เครื่องนี้เท่านั้น

การตรวจสอบคำขอ

ทุกคำขอ HTTP และทุกการเชื่อมต่อ WebSocket ต้องแนบส่วนหัว (Header) นี้:

Authorization: Bearer YOUR_TOKEN

คำขอจะถูกปฏิเสธเมื่อส่งมาจากคอมพิวเตอร์เครื่องอื่น เมื่อโทเค็นไม่ถูกต้องหรือสูญหาย หรือเมื่อมีส่วนหัว Origin ของเบราว์เซอร์แนบมาด้วย กฎข้อสุดท้ายนี้หมายความว่าหน้าเว็บบนเบราว์เซอร์จะไม่สามารถเรียก API ได้ แม้จะเป็นเว็บที่เปิดบนคอมพิวเตอร์เครื่องนี้ก็ตาม จึงต้องใช้สคริปต์เดสก์ท็อปหรือเครื่องมือที่สามารถกำหนดส่วนหัวได้

การเปิดให้ OBS บนคอมพิวเตอร์เครื่องอื่นเข้าถึงโอเวอร์เลย์ได้ ไม่ได้เป็นการเปิด API สู่เครือข่าย และคีย์การเข้าถึงโอเวอร์เลย์ไม่ใช่โทเค็น API

Vfinity ต้องเปิดทำงานอยู่จึงจะตอบรับ API ได้ (แม้จะย่ออยู่ในถาดระบบก็นับว่าทำงานอยู่) หากปิดแอป จะไม่มีสิ่งใดรับฟังคำขอ

ส่งคำขอผ่าน HTTP

คำขอเนื้อหา (Body)การตอบกลับ
GET /api/stateไม่มีรายการคำสั่งที่รันได้ อีเวนต์ของคุณ สถิติสตรีม และสถานะการเชื่อมต่อ TikTok
POST /api/trigger{"name":"…","data":{…}}{"ok":true} เมื่อทริกเกอร์ได้รับการยอมรับ
POST /api/command{"name":"…","args":…}{"ok":true,"result":…} หรือ {"ok":false,"error":"…"}

แนบ Content-Type: application/json มากับทุกคำขอ POST โดยเนื้อหามีขนาดได้สูงสุดไม่เกิน 64 KiB

# ตรวจสอบว่าสามารถรันคำสั่งอะไรได้บ้าง
curl -H "Authorization: Bearer YOUR_TOKEN" http://127.0.0.1:21424/api/state

# เพิ่มเวลา 30 วินาทีในตัวจับเวลาซับบาธอน
curl -X POST http://127.0.0.1:21424/api/command \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"timer.add","args":30}'
$headers = @{ Authorization = "Bearer YOUR_TOKEN" }

# ตรวจสอบว่าสามารถรันคำสั่งอะไรได้บ้าง
Invoke-RestMethod -Uri http://127.0.0.1:21424/api/state -Headers $headers

# เพิ่มเวลา 30 วินาทีในตัวจับเวลาซับบาธอน
Invoke-RestMethod -Method Post -Uri http://127.0.0.1:21424/api/command `
  -Headers $headers -ContentType "application/json" `
  -Body '{"name":"timer.add","args":30}'

เรียกใช้อีเวนต์ของคุณ

กำหนดให้อีเวนต์ใช้ทริกเกอร์ ทริกเกอร์ API และตั้ง ชื่อทริกเกอร์ จากนั้นส่งคำขอ POST ด้วยชื่อนั้นไปยัง /api/trigger โดยชื่อจะไม่คำนึงถึงตัวพิมพ์เล็ก-พิมพ์ใหญ่

curl -X POST http://127.0.0.1:21424/api/trigger \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"raid_alarm","data":{"message":"Raid incoming","level":3}}'

แต่ละฟิลด์ใน data จะกลายเป็นตัวแปรเทมเพลตที่ขั้นตอนของอีเวนต์นำไปใช้ได้ เช่น ขั้นตอนเสียงพูดที่มี {message} จะอ่านว่า "Raid incoming" รองรับข้อความ ตัวเลข และค่าจริง/เท็จ (บูลีน) โดยไม่รองรับออบเจกต์ซ้อนหรืออาร์เรย์ ชื่อฟิลด์ต้องขึ้นต้นด้วยตัวอักษร และนับสูงสุด 50 ฟิลด์แรก

การตอบกลับ {"ok":true} หมายถึง Vfinity ยอมรับทริกเกอร์เข้าสู่ระบบแล้ว แต่อีเวนต์ที่ปิดใช้งาน อยู่ในสถานะหยุดพัก หรือติดคูลดาวน์ จะยังคงไม่ทำงาน ดังนั้นโปรดรับฟัง actionResult บน WebSocket หากต้องการทราบว่าขั้นตอนใดทำงานเสร็จสิ้นจริง

สั่งรันคำสั่ง

คำสั่งคือแอคชันเดียวกับที่ปุ่มลัด ปุ่มควิกเด็ค และขั้นตอนคำสั่งเรียกใช้ GET /api/state จะแสดงรายการคำสั่งที่บิลด์นี้รองรับในขณะนั้น เนื่องจากบางคำสั่งจะมีให้ใช้เฉพาะเมื่อส่วนของแอปนั้นกำลังทำงานอยู่

{ "name": "control.panic" }
{ "name": "deck.press", "args": "Applause" }
{ "name": "giveaway.draw" }
{ "name": "sceneCard.showBrb" }
{ "name": "mapping.trigger", "args": "YOUR_EVENT_ID" }

mapping.trigger จะรันอีเวนต์ของคุณเสมือนว่าทริกเกอร์ทำงานจริง และตอบกลับด้วยจำนวนรอบที่เริ่มทำงาน โดยรับค่าเป็น ID อีเวนต์ หรือชื่อของทริกเกอร์ API หากต้องการดู ID ให้คลิกขวาที่อีเวนต์ในแท็บ อีเวนต์ แล้วเลือก คัดลอก ID อีเวนต์

ลองเลย
อีเวนต์ คลิกขวาที่แถว
กุหลาบ
สิงโต
คำสั่งแชต
ทุก 30 นาที
ติดตาม

คลิกขวาที่อีเวนต์แล้วเลือกคัดลอก ID อีเวนต์เพื่อนำไปใช้กับ mapping.trigger ลองคลิกขวาที่แถวดู

ดูรายการคำสั่งทั้งหมดพร้อมอาร์กิวเมนต์ได้ใน คำสั่ง

เชื่อมต่อ TikTok LIVE จากสคริปต์

คำสั่งอาร์กิวเมนต์การทำงาน
tiktok.connectตัวเลือก {"username","autoRejoin","waitForLive"}เชื่อมต่อตามการตั้งค่าที่บันทึกไว้ โดยแทนที่เฉพาะในเซสชันนี้
tiktok.disconnectไม่มีออกจากไลฟ์และหยุดการเชื่อมต่อใหม่
tiktok.cancelRejoinไม่มีหยุดการรอหรือการเชื่อมต่อใหม่ แต่ยังคงเชื่อมต่อไลฟ์ที่เข้าร่วมแล้วไว้
{
  "name": "tiktok.connect",
  "args": { "username": "yourname", "autoRejoin": true, "waitForLive": true }
}

คำตอบ {"ok":true,"result":{"accepted":true}} หมายถึงคำขอเข้าสู่คิวแล้ว ไม่ได้หมายความว่าเข้าร่วมไลฟ์สำเร็จแล้ว ให้เฝ้าดูส่วน tiktok ของ /api/state หรือ tiktokStatus บน WebSocket: ค่า room.state จะกลายเป็น "connected" เมื่อ Vfinity เข้าร่วมห้องไลฟ์สำเร็จ

รับฟังข้อมูลผ่าน WebSocket

เชื่อมต่อไปยัง ws://127.0.0.1:21424/api/ws พร้อมแนบส่วนหัว Authorization เดียวกัน คุณสามารถส่งคำขอแบบเดียวกับ HTTP ได้ โดยแนบ requestId ที่คุณกำหนดเอง และ Vfinity จะสตรีมข้อมูลเหตุการณ์ที่เกิดขึ้นบนสตรีมส่งกลับมาให้คุณ

// npm install ws
const WebSocket = require('ws');

const socket = new WebSocket('ws://127.0.0.1:21424/api/ws', {
  headers: { Authorization: 'Bearer YOUR_TOKEN' },
});

socket.on('open', () => {
  socket.send(JSON.stringify({ type: 'command', name: 'timer.add', args: 30, requestId: '1' }));
});

socket.on('message', (raw) => {
  const message = JSON.parse(raw);
  if (message.type === 'event' && message.event === 'gift') {
    console.log(`${message.data.nickname} sent ${message.data.giftName}`);
  }
  if (message.type === 'response') console.log(message.requestId, message.data);
});

สิ่งที่คุณส่งไป

{ "type": "state", "requestId": "1" }
{ "type": "command", "name": "timer.add", "args": 30, "requestId": "2" }
{ "type": "trigger", "name": "raid_alarm", "data": {}, "requestId": "3" }

แต่ละคำขอจะได้รับการตอบกลับหนึ่งครั้ง: {"type":"response","requestId":"2","data":{"ok":true}}

สิ่งที่ Vfinity ส่งกลับมา

พร็อพ

ชนิด

ของขวัญที่เป็นคอมโบ (giftType 1) จะส่งข้อมูลอัปเดตระหว่างที่คอมโบดำเนินอยู่ ควรตอบสนองต่อของขวัญเมื่อ repeatEnd ไม่ใช่ false เช่นเดียวกับที่ Vfinity ทำ การประทับเวลาเป็น Unix milliseconds

การสตรีมข้อมูลเป็นแบบสดเท่านั้น: ไม่มีการเล่นย้อนหลัง และไคลเอนต์ที่อ่านข้อมูลช้าเกินไปอาจพลาดข้อความได้

ขีดจำกัดและข้อผิดพลาด

รหัสข้อผิดพลาดสาเหตุ
HTTP 401โทเค็นไม่ถูกต้องหรือสูญหาย หรือคำขอมีส่วนหัว Origin แนบมา
HTTP 403คำขอส่งมาจากคอมพิวเตอร์เครื่องอื่น
HTTP 503ตัวเลือก เปิดใช้งาน Local API ปิดอยู่
HTTP 413ขนาดเนื้อหาคำขอเกิน 64 KiB
HTTP 429มีไคลเอนต์ WebSocket เชื่อมต่อครบ 16 รายการแล้ว
"busy"มี 32 คำขอกำลังรอการตอบกลับอยู่ในคิว
"timeout"ไม่ได้รับการตอบกลับภายใน 10 วินาที แต่คำสั่งที่เริ่มไปแล้วจะยังคงทำงานต่อไป
"unknownCommand"ไม่มีคำสั่งชื่อนั้นให้ใช้งานในขณะนี้
"failed"คำสั่งทำงานแต่ล้มเหลว โดย message จะระบุสาเหตุ
"invalidName"ช่อง name สูญหาย ว่างเปล่า หรือยาวเกิน 200 ตัวอักษร

การสำรองข้อมูลทั่วไปจะไม่รวมโทเค็น และการกู้คืนจะปิดใช้งาน API ไว้ ให้ทำเครื่องหมายที่ รวมรหัสผ่านและโทเค็น เมื่อสำรองข้อมูลหากต้องการเก็บไว้

ให้ Vfinity เชื่อมต่อไปหาคุณแทน

การ์ด Trigger API ซึ่งอยู่ในส่วน ขั้นสูง เช่นกัน จะสลับทิศทางการเชื่อมต่อ: Vfinity จะเชื่อมต่อไปในฐานะไคลเอนต์สู่เซิร์ฟเวอร์ WebSocket ที่คุณเปิดไว้ เหมาะสำหรับเซิร์ฟเวอร์ที่มีอยู่แล้ว เช่น เกมหรือบอท

Local API

สคริปต์ของคุณเชื่อมต่อมายัง Vfinity บนพอร์ต 21424 พร้อมแนบโทเค็น สามารถสั่งรันคำสั่ง เรียกใช้อีเวนต์ อ่านสถานะ และรับข้อมูลอีเวนต์สดทั้งหมดได้

Trigger API

Vfinity เชื่อมต่อไปยังเซิร์ฟเวอร์ของคุณ (ค่าเริ่มต้นคือ localhost บนพอร์ต 8080) โดยไม่ต้องใช้โทเค็น เซิร์ฟเวอร์ของคุณส่งทริกเกอร์และคำสั่ง และสามารถขอรายการอีเวนต์ API ได้

เปิดสวิตช์ Trigger API, กรอก โฮสต์ WebSocket และ พอร์ต WebSocket จากนั้นคลิก เชื่อมต่อ API จากนั้นเซิร์ฟเวอร์ของคุณสามารถส่ง:

{ "type": "trigger", "name": "raid_alarm", "data": { "message": "Raid incoming" } }
{ "type": "command", "name": "timer.add", "args": 30, "requestId": "abc-1" }
{ "type": "request", "requestType": "event_list", "requestId": "abc-2" }

คำสั่งที่มี requestId จะได้รับการตอบกลับ เช่น {"type":"response","requestType":"command","requestId":"abc-1","data":{"name":"timer.add","ok":true}} ส่วน event_list จะตอบกลับด้วยอีเวนต์ทั้งหมดที่มีทริกเกอร์ API พร้อมขั้นตอนและสถานะเปิดใช้งาน และ stats จะตอบกลับด้วยสถานะการเชื่อมต่อและจำนวนอีเวนต์

สิ่งใดก็ตามที่เข้าถึงเซิร์ฟเวอร์ของคุณได้จะสามารถรันคำสั่งเหล่านี้ได้ จึงควรเปิดเซิร์ฟเวอร์ไว้บนคอมพิวเตอร์เครื่องนี้ หรือติดตั้งระบบยืนยันตัวตนไว้ข้างหน้าเซิร์ฟเวอร์ของคุณ

อ่านเพิ่มเติม