ข้ามไปที่เนื้อหาหลัก
D1 Arena

D1 Arena

Loading...

D1 Arena

นักพัฒนา API

ชุมชน

นักพัฒนา API

สร้างบอท โอเวอร์เลย์ เครื่องมือสตรีม และการผสานรวมกับข้อมูล D1Arena

การรับรองความถูกต้อง

คำขอ API ทั้งหมดต้องมีคีย์ API ที่ส่งผ่านใน X-API-Key / Authorization: Bearer header

# Example request curl -H "X-API-Key: d1_your_api_key_here" \ https://d1arena.com/api/v1/streams

หากต้องการสร้างคีย์ API ให้ไปที่ การตั้งค่านักพัฒนาซอฟต์แวร์ ในแดชบอร์ดของคุณ คุณสามารถมีได้ถึง 5 ปุ่ม

คำขอ API มีการจำกัดอัตราต่อคีย์ API เมื่อคุณเกินขีดจำกัด คำขอจะส่งกลับ 429 Too Many Requests พร้อมกับส่วนหัว Retry-After

URL พื้นฐาน

https://d1arena.com/api/v1

ปลายทางทั้งหมดส่งคืน JSON จุดสิ้นสุดที่มีการแบ่งหน้าจะมี meta object ที่มี current_page, last_page และ total

สตรีม

GET /streams
รายการสตรีมสดในปัจจุบัน รองรับการแบ่งหน้าและการกรองหมวดหมู่
พารามิเตอร์ประเภทคำอธิบาย
category_idintegerกรองตามรหัสเกม/หมวดหมู่
limitintegerผลลัพธ์ต่อหน้า (ค่าเริ่มต้น: 20)
pageintegerหมายเลขหน้า
การตอบสนอง
{ "data": [ { "id": 42, "name": "ProGamer99", "user_slug": "progamer99", "profile_img": "profile/abc123.jpg", "stream_title": "Ranked Grind - Road to Champion", "stream_category_id": 5, "is_vertical_stream": false, "platform_tier": "pro" } ], "meta": { "current_page": 1, "last_page": 1, "total": 3 } }
GET /streams/{slug}
รับสถานะสดของสตรีมเมอร์รายเดียวและรายละเอียดการสตรีมด้วยชื่อผู้ใช้หรือตัวบุ้ง
การตอบสนอง
{ "data": { "user_id": 42, "name": "ProGamer99", "slug": "progamer99", "is_live": true, "stream_title": "Ranked Grind", "category_id": 5, "is_vertical": false, "platform_tier": "pro", "profile_img": "profile/abc123.jpg" } }

หมวดหมู่

GET /categories
รายชื่อหมวดหมู่เกมทั้งหมด รองรับการค้นหาและการแบ่งหน้า
พารามิเตอร์ประเภทคำอธิบาย
searchstringกรองหมวดหมู่ตามชื่อ
limitintegerผลลัพธ์ต่อหน้า (ค่าเริ่มต้น: 50)
การตอบสนอง
{ "data": [ { "id": 5, "name": "Call of Duty", "slug": "call-of-duty", "image": "categories/cod.png" } ], "meta": { "total": 24 } }

ผู้ใช้

GET /users/{slug}
รับโปรไฟล์สาธารณะของผู้เล่นและสถิติการแข่งขันด้วยชื่อผู้ใช้หรือกระสุน
การตอบสนอง
{ "data": { "user": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99", "profile_img": "profile/abc.jpg", "bio": "Competitive FPS player", "platform_tier": "pro", "is_live": "1", "stream_title": "Ranked", "gold": 3, "silver": 1, "bronze": 0 }, "stats": { "elo_rating": 1842, "total_tournaments": 27, "win_rate": 64.5, "total_earnings": 1250.00 } } }

คลิป

GET /clips
รายชื่อคลิปสาธารณะ รองรับการกรองตามลำแสงและหมวดหมู่
พารามิเตอร์ประเภทคำอธิบาย
streamer_idintegerกรองคลิปตามรหัสผู้ใช้ของสตรีมเมอร์
category_idintegerกรองตามรหัสเกม/หมวดหมู่
limitintegerผลลัพธ์ต่อหน้า (ค่าเริ่มต้น: 20)
การตอบสนอง
{ "data": [ { "id": 99, "streamer_id": 42, "stream_category_id": 5, "title": "Insane 1v4 clutch", "slug": "insane-1v4-clutch-abc", "duration": 28, "view_count": 412, "is_auto_clip": false, "created_at": "2026-03-15T18:30:00.000000Z", "streamer": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99" } } ], "meta": { "total": 156 } }
GET /clips/{slug}
รับรายละเอียดคลิปเดียวโดยกระสุน
การตอบสนอง
{ "data": { "id": 99, "title": "Insane 1v4 clutch", "slug": "insane-1v4-clutch-abc", "description": "Final round comeback", "duration": 28, "view_count": 412, "streamer": { "id": 42, "name": "ProGamer99" }, "creator": { "id": 55, "name": "ClipMaster" }, "stream_category": { "id": 5, "name": "Call of Duty" } } }

ทัวร์นาเมนต์

GET /tournaments
รายการทัวร์นาเมนต์ รองรับการกรองตามสถานะและลีก
พารามิเตอร์ประเภทคำอธิบาย
statusstringกรองตามสถานะ (เช่น open, in_progress, completed)
league_idintegerกรองตาม ID ลีก
limitintegerผลลัพธ์ต่อหน้า (ค่าเริ่มต้น: 20)
การตอบสนอง
{ "data": [ { "id": 15, "title": "Friday Night Frenzy", "tournament_type": "single_elimination", "status": "open", "registration_fee": "5.00", "no_player": 32, "team": 0, "category": { "id": 5, "name": "Call of Duty" }, "start_date": "2026-03-28T20:00:00.000000Z" } ], "meta": { "current_page": 1, "last_page": 2, "total": 24 } }
GET /tournaments/{id}
รับรายละเอียดการแข่งขันและจำนวนผู้เข้าร่วม
การตอบสนอง
{ "data": { "id": 15, "title": "Friday Night Frenzy", "tournament_type": "single_elimination", "status": "open", "registration_fee": "5.00", "no_player": 32, "team": 0 }, "meta": { "participant_count": 18 } }

อันดับ ELO

GET /elo/leaderboard
รับกระดานผู้นำอันดับ ELO เลือกกรองตามหมวดหมู่เกม
พารามิเตอร์ประเภทคำอธิบาย
category_idintegerกรองตามรหัสเกม/หมวดหมู่
limitintegerจำนวนผลลัพธ์ (ค่าเริ่มต้น: 50)
การตอบสนอง
{ "data": [ { "rank": 1, "user_id": 42, "name": "ProGamer99", "user_slug": "progamer99", "elo_rating": 2150, "wins": 45, "losses": 12, "win_rate": 78.9, "profile_img": "profile/abc123.jpg" } ], "meta": { "total": 312 } }

ลีก

GET /leagues
รายชื่อลีกพร้อมตัวกรองสถานะและหมวดหมู่เพิ่มเติม
พารามิเตอร์ประเภทคำอธิบาย
statusstringกรองตามสถานะลีก
category_idintegerกรองตามรหัสเกม/หมวดหมู่
limitintegerผลลัพธ์ต่อหน้า (ค่าเริ่มต้น: 20)
การตอบสนอง
{ "data": [ { "id": 3, "name": "Spring 2026 Pro League", "status": "active", "category": { "id": 5, "name": "Call of Duty" }, "total_participants": 48, "start_date": "2026-03-01", "end_date": "2026-05-31" } ], "meta": { "current_page": 1, "last_page": 1, "total": 6 } }
GET /leagues/{id}/standings
รับอันดับลีก (อันดับผู้เล่นตามคะแนน)
การตอบสนอง
{ "data": [ { "id": 1, "points": 2400, "wins": 12, "losses": 3, "user": { "id": 42, "name": "ProGamer99", "user_slug": "progamer99" } } ], "meta": { "total": 48 } }

การตอบสนองข้อผิดพลาด

ข้อผิดพลาดทั้งหมดส่งคืนซองจดหมาย JSON ที่สอดคล้องกัน อ็อบเจ็กต์ error ประกอบด้วย code ที่เครื่องสามารถอ่านได้ และ message ที่มนุษย์สามารถอ่านได้เสมอ

รูปแบบการตอบสนองข้อผิดพลาด
{ "success": false, "error": { "code": "not_found", "message": "The requested resource could not be found." } }
รูปแบบข้อผิดพลาดในการตรวจสอบความถูกต้อง (422)
{ "success": false, "error": { "code": "validation_error", "message": "The given data was invalid.", "errors": { "category_id": ["The category id must be an integer."], "limit": ["The limit must not be greater than 100."] } } }

รหัสสถานะ

200
ตกลง — คำขอสำเร็จแล้ว การตอบสนองมีข้อมูลที่ร้องขอ
400
คำขอไม่ถูกต้อง — คำขอมีรูปแบบไม่ถูกต้องหรือขาดพารามิเตอร์ที่จำเป็น ตรวจสอบ error.message เพื่อดูรายละเอียด
401
ไม่มีสิทธิ — Missing or invalid API key. Ensure you're passing a valid key in the X-API-Key header.
403
ต้องห้าม — รหัส API ของคุณถูกปิดใช้งานหรือขาดสิทธิ์สำหรับทรัพยากรนี้ ตรวจสอบของคุณ การตั้งค่านักพัฒนาซอฟต์แวร์.
404
ไม่พบ — ไม่มีทรัพยากรที่ร้องขอ ตรวจสอบ Slug, ID หรือเส้นทางปลายทาง
422
ข้อผิดพลาดในการตรวจสอบ — พารามิเตอร์คำขอไม่ผ่านการตรวจสอบ ชื่อฟิลด์ error.errors object mapping กับปัญหาเฉพาะของพวกเขา
429
อัตราจำกัด — คำขอมากเกินไป ส่วนหัว Retry-After ระบุจำนวนวินาทีที่ต้องรอก่อนที่จะลองอีกครั้ง
500
เซิร์ฟเวอร์เกิดข้อผิดพลาด — เกิดข้อผิดพลาดที่ไม่คาดคิดในส่วนของเรา หากสิ่งนี้ยังคงอยู่ ติดต่อฝ่ายสนับสนุน.

การอ้างอิงรหัสข้อผิดพลาด

รหัสสถานะ HTTPคำอธิบาย
invalid_api_key401คีย์ API หายไป มีรูปแบบไม่ถูกต้อง หรือไม่มีอยู่
api_key_disabled403คีย์ API ถูกเพิกถอนหรือปิดใช้งาน
not_found404ไม่พบทรัพยากรที่ร้องขอ
validation_error422พารามิเตอร์คำขออย่างน้อยหนึ่งรายการไม่ถูกต้อง
rate_limited429เกินขีดจำกัดอัตราคำขอสำหรับคีย์ API นี้
server_error500ข้อผิดพลาดเซิร์ฟเวอร์ภายใน — โปรดลองอีกครั้งหรือติดต่อฝ่ายสนับสนุน

ขีดจำกัดอัตรา

คำขอ API มีการจำกัดอัตราต่อคีย์ API เมื่อคุณเกินขีดจำกัด คำขอจะส่งกลับ 429 Too Many Requests พร้อมกับส่วนหัว Retry-After

ขีดจำกัดตามระดับ

ชั้นคำขอ / นาที (ค่าเริ่มต้น)แม็กซ์ คีย์ส
สตาร์ทเตอร์ (ฟรี)605
โปร605
สุดยอด605
พันธมิตร605

ส่วนหัวขีดจำกัดอัตรา

คำขอ API มีการจำกัดอัตราต่อคีย์ API เมื่อคุณเกินขีดจำกัด คำขอจะส่งกลับ 429 Too Many Requests พร้อมกับส่วนหัว Retry-After

ส่วนหัวคำอธิบาย
Retry-Afterวินาทีที่ต้องรอก่อนที่จะลองอีกครั้ง (แสดงเฉพาะในการตอบกลับ 429 รายการ)

แนวทางปฏิบัติที่ดีที่สุด

เคล็ดลับสำหรับการอยู่ภายในขอบเขต:
  • Cache responses locally — stream and tournament data doesn't change every second.
  • สมัครสมาชิก webhooks สำหรับกิจกรรมแบบเรียลไทม์แทนการโพลจุดสิ้นสุด
  • คำขอเป็นกลุ่มหากเป็นไปได้ — ใช้พารามิเตอร์ตัวกรองเพื่อให้ได้สิ่งที่คุณต้องการโดยการโทรน้อยลง

เว็บฮุค (EventSub)

สมัครรับการแจ้งเตือนแบบเรียลไทม์แทนการสำรวจ เมื่อมีเหตุการณ์เกิดขึ้น D1Arena จะส่ง HTTP POST ไปยัง URL การติดต่อกลับของคุณด้วยเพย์โหลด JSON ที่ลงนามด้วย HMAC-SHA256

ตั้งค่า

สร้างการสมัครสมาชิก webhook ใน การตั้งค่านักพัฒนาซอฟต์แวร์ การสมัครสมาชิกแต่ละครั้งต้องใช้:

  • URL โทรกลับ — ตำแหน่งข้อมูล HTTPS ที่เข้าถึงได้แบบสาธารณะบนเซิร์ฟเวอร์ของคุณ
  • กิจกรรม — ประเภทกิจกรรมตั้งแต่หนึ่งรายการขึ้นไปที่จะสมัครรับข้อมูล

You'll receive a whsec_ signing secret upon creation. Store it securely — it's shown only once.

รูปแบบเพย์โหลด

การนำส่งเว็บฮุคทุกครั้งจะส่งเนื้อความ JSON ด้วยโครงสร้างนี้:

{ "id": "evt_a1b2c3d4e5f6", "event": "stream.online", "created_at": "2026-03-23T14:30:00Z", "data": { // Event-specific fields (see examples below) } }

ส่วนหัว

การจัดส่งแต่ละครั้งจะมีส่วนหัวต่อไปนี้สำหรับการกำหนดเส้นทางและการตรวจสอบ:

ส่วนหัวคำอธิบาย
Content-Typeapplication/json
X-D1Arena-Eventประเภทเหตุการณ์ (เช่น stream.online)
X-D1Arena-Signatureการแยกย่อยเลขฐานสิบหก HMAC-SHA256 ของเนื้อหาคำขอดิบ
X-D1Arena-Signature-Versionรูปแบบคีย์การลงนาม: v2 สำหรับการสมัครสมาชิกปัจจุบัน หรือ v1-hashed-secret สำหรับการสมัครสมาชิกแบบเดิม
X-D1Arena-Delivery-IdUUID การจัดส่งที่ไม่ซ้ำใคร — ใช้สำหรับการขจัดข้อมูลซ้ำซ้อน
X-D1Arena-Timestampการประทับเวลา Unix ของเวลาที่ส่งกิจกรรม

การตรวจสอบลายเซ็น

ตรวจสอบส่วนหัว X-D1Arena-Signature ก่อนประมวลผล webhook ทุกครั้ง ลายเซ็นจะคำนวณเป็น HMAC-SHA256(raw_body, webhook_secret)

สำหรับการจัดส่ง v2 ให้ใช้รหัสลับ whsec_ ที่แสดงเมื่อมีการสร้างการสมัครรับข้อมูล สำหรับการจัดส่ง v1-hashed-secret ล่วงหน้า ขั้นแรกให้คำนวณ SHA256(whsec_secret) จากข้อมูลลับดั้งเดิมนั้น และใช้การแยกย่อยเลขฐานสิบหกตัวพิมพ์เล็กที่เป็นผลลัพธ์เป็นคีย์ HMAC สร้างการสมัครสมาชิกใหม่เมื่อใช้งานได้จริงเพื่อย้ายไปยัง v2

PHP
// Get the raw body and signature header $payload = file_get_contents('php://input'); $signature = $_SERVER['HTTP_X_D1ARENA_SIGNATURE'] ?? ''; // Compute expected signature $expected = hash_hmac('sha256', $payload, $webhookSecret); // Constant-time comparison to prevent timing attacks if (!hash_equals($expected, $signature)) { http_response_code(401); exit('Invalid signature'); } $event = json_decode($payload, true);
โหนด js
const crypto = require('crypto'); app.post('/webhook', (req, res) => { const payload = req.rawBody; // Ensure raw body is available const signature = req.headers['x-d1arena-signature']; const expected = crypto .createHmac('sha256', WEBHOOK_SECRET) .update(payload) .digest('hex'); if (!crypto.timingSafeEqual( Buffer.from(expected), Buffer.from(signature) )) { return res.status(401).send('Invalid signature'); } const event = JSON.parse(payload); // Process event... res.status(200).send('OK'); });
หลาม
import hmac, hashlib, json def handle_webhook(request): payload = request.body signature = request.headers.get('X-D1Arena-Signature', '') expected = hmac.new( WEBHOOK_SECRET.encode(), payload, hashlib.sha256 ).hexdigest() if not hmac.compare_digest(expected, signature): return HttpResponse(status=401) event = json.loads(payload) # Process event... return HttpResponse(status=200)

กิจกรรมที่มีอยู่

เหตุการณ์คำอธิบาย
stream.onlineStreamer ได้แพร่ภาพสด
stream.offlineสตรีมเมอร์ออฟไลน์
channel.followผู้ใช้ติดตามช่อง
channel.subscribeการสมัครรับข้อมูลผู้สนับสนุนใหม่ในช่อง
channel.tipเคล็ดลับถูกส่งไปยังสตรีมเมอร์
tournament.startedการแข่งขันแบบแมตช์เพลย์ได้เริ่มขึ้นแล้ว
tournament.endedการแข่งขันสิ้นสุดลงแล้ว
tournament.match.completedบันทึกผลการแข่งขันแล้ว
clip.createdมีการสร้างคลิปใหม่จากการสตรีมแบบสด
overdrive.startedD1 Frenzy เริ่มต้นในช่อง
overdrive.level_upD1 Frenzy ก้าวไปสู่ระดับต่อไป
overdrive.endedD1 Frenzy เสร็จสมบูรณ์หรือหมดอายุแล้ว

ตัวอย่างเพย์โหลดเหตุการณ์

stream.online

{ "id": "evt_a1b2c3d4e5f6", "event": "stream.online", "created_at": "2026-03-23T14:30:00Z", "data": { "user_id": 42, "user_slug": "progamer99", "name": "ProGamer99", "stream_title": "Ranked Grind - Road to Champion", "category_id": 5, "category_name": "Call of Duty", "protocol": "RTMP", "started_at": "2026-03-23T14:30:00Z" } }

stream.offline

{ "id": "evt_f6e5d4c3b2a1", "event": "stream.offline", "created_at": "2026-03-23T17:45:00Z", "data": { "user_id": 42, "user_slug": "progamer99", "duration_seconds": 11700, "vod_id": 281 } }

channel.follow

{ "id": "evt_c1d2e3f4a5b6", "event": "channel.follow", "created_at": "2026-03-23T15:10:00Z", "data": { "follower_id": 88, "follower_slug": "newplayer", "followed_id": 42, "followed_slug": "progamer99" } }

channel.tip

{ "id": "evt_d1e2f3a4b5c6", "event": "channel.tip", "created_at": "2026-03-23T16:20:00Z", "data": { "streamer_id": 42, "streamer_slug": "progamer99", "tipper_id": 55, "tipper_slug": "clipmaster", "amount": "5.00", "currency": "USD", "message": "Great stream!" } }

tournament.match.completed

{ "id": "evt_e1f2a3b4c5d6", "event": "tournament.match.completed", "created_at": "2026-03-23T21:15:00Z", "data": { "tournament_id": 15, "tournament_title": "Friday Night Frenzy", "match_id": 204, "round": 2, "winner": { "id": 42, "slug": "progamer99", "name": "ProGamer99" }, "loser": { "id": 77, "slug": "rival_x", "name": "Rival_X" }, "score": "3-1" } }

clip.created

{ "id": "evt_b1c2d3e4f5a6", "event": "clip.created", "created_at": "2026-03-23T15:45:00Z", "data": { "clip_id": 99, "slug": "insane-1v4-clutch-abc", "title": "Insane 1v4 clutch", "duration": 28, "streamer_id": 42, "streamer_slug": "progamer99", "creator_id": 55, "creator_slug": "clipmaster", "category_id": 5 } }

นโยบายการจัดส่งและลองใหม่

พยายามความล่าช้าหมายเหตุ
ที่ 1 (เริ่มต้น)ทันทีส่งภายในไม่กี่วินาทีของเหตุการณ์
ที่ 2 (ลองอีกครั้ง)30 วินาทีหากความพยายามครั้งแรกล้มเหลวหรือหมดเวลา
ที่ 3 (ลองอีกครั้ง)2 นาทีการถอยกลับแบบเอ็กซ์โปเนนเชียล
ที่ 4 (สุดท้าย)10 นาทีความพยายามครั้งสุดท้ายก่อนที่จะทำเครื่องหมายว่าล้มเหลว
Important: Your endpoint must respond with a 2xx status within 10 วินาที. Non-2xx responses or timeouts trigger a retry. After ความล้มเหลวติดต่อกัน 10 ครั้ง, the subscription is automatically disabled. You'll receive an email notification and can re-enable it in การตั้งค่านักพัฒนาซอฟต์แวร์.

แนวทางปฏิบัติที่ดีที่สุด

  • ตรวจสอบลายเซ็นเสมอ ก่อนประมวลผลเพย์โหลดเพื่อป้องกันเหตุการณ์ปลอมแปลง
  • ใช้ Delivery-Id สำหรับการขจัดข้อมูลซ้ำซ้อน — ลองส่ง ID เดียวกันอีกครั้ง ดังนั้นให้จัดเก็บ ID ที่ประมวลผลแล้วเพื่อหลีกเลี่ยงการประมวลผลซ้ำ
  • ตอบสนองอย่างรวดเร็ว ประมวลผลแบบอะซิงโครนัส — return 200 OK ทันทีและจัดการตรรกะทางธุรกิจในงานเบื้องหลัง
  • ใช้ปลายทาง HTTPS เท่านั้น — URL ของเว็บฮุคต้องใช้ TLS การเรียกกลับ HTTP ถูกปฏิเสธ
  • จัดการกับเหตุการณ์ที่ไม่รู้จักอย่างสง่างาม — อาจมีการเพิ่มประเภทเหตุการณ์ใหม่ Return 200 สำหรับเหตุการณ์ที่ไม่รู้จักมากกว่าข้อผิดพลาด

D1 บ้าคลั่ง

D1 Frenzy เกิดขึ้นได้จากเคล็ดลับอย่างรวดเร็วและการสมัครสมาชิกในขณะที่สตรีมเมอร์ถ่ายทอดสด มันก้าวหน้าไปถึง 5 ระดับโดยมีเป้าหมายเพิ่มขึ้น

GET /api/overdrive/{streamerId}

รับ D1 Frenzy ที่ใช้งานอยู่สำหรับสตรีมเมอร์ ส่งคืน {"active": false} หากไม่มี

{ "active": true, "level": 2, "progress": 150, "target": 250, "progress_pct": 60.0, "total_contributions": 8, "total_contributors": 5, "expires_at": "2026-03-22T15:30:00+00:00" }

เป้าหมายระดับ

ระดับคะแนน
1100
2250
3500
41,000
52,000

D1 บ้าคลั่ง — คะแนน: เคล็ดลับ $1 → 100; สมัครสมาชิก 500 × ชั้น. ระยะเวลา: 5 รายงานการประชุม; คูลดาวน์: 30 รายงานการประชุม.

ส่วนขยาย SDK

สร้างแผงแบบกำหนดเองและส่วนขยายโอเวอร์เลย์ที่สตรีมเมอร์สามารถติดตั้งบนหน้าช่องของตนได้ ส่วนขยายทำงานใน iframe แบบแซนด์บ็อกซ์และสื่อสารกับเพจโฮสต์ผ่าน postMessage

เริ่มต้นใช้งาน

  1. สร้างคีย์ API ใน การตั้งค่านักพัฒนาซอฟต์แวร์
  2. สร้างส่วนขยายของคุณเป็นหน้า HTML แบบสแตนด์อโลนที่โฮสต์บนโดเมนของคุณ (ต้องใช้ HTTPS)
  3. ส่งเพื่อตรวจสอบในส่วน ส่วนขยายของฉัน
  4. เมื่อได้รับการอนุมัติแล้ว สตรีมเมอร์จะสามารถติดตั้งได้จาก Extension Marketplace

ประเภทส่วนขยาย

ประเภทที่ตั้งพฤติกรรม
panelด้านล่างโปรแกรมเล่นสตรีมมองเห็นได้เมื่อมีการสตรีมสด การ์ดแบบเต็มความกว้าง ความสูงเริ่มต้น 300px
overlayเหนือเครื่องเล่นวิดีโอมองเห็นได้เมื่อถ่ายทอดสด ตำแหน่ง/ขนาดควบคุมโดยลำแสงผ่านเครื่องมือวางตำแหน่งโอเวอร์เลย์

โพสต์ข้อความ API

ส่วนขยายของคุณจะได้รับข้อมูลบริบทโดยอัตโนมัติเมื่อมีการโหลด ใช้เหตุการณ์เหล่านี้:

ใช้ต้นกำเนิดพาเรนต์ D1Arena ที่แน่นอนสำหรับทุกข้อความ SDK อย่างเป็นทางการได้รับและตรวจสอบแหล่งที่มานี้จากหน้าที่ฝังโดยอัตโนมัติ

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

1. ความพร้อมของสัญญาณ

var d1ParentOrigin = 'https://d1arena.com'; // Tell the host page your extension is ready for context window.parent.postMessage({ type: 'D1_EXT_READY' }, d1ParentOrigin);

2. รับบริบท

window.addEventListener('message', function(e) { if (e.source === window.parent && e.origin === d1ParentOrigin && e.data && e.data.type === 'D1_CONTEXT') { var ctx = e.data.payload; // ctx.channelId - Streamer's user ID // ctx.channelName - Streamer's display name // ctx.channelSlug - Streamer's URL slug // ctx.viewerId - Current viewer's ID (null if not logged in) // ctx.isLive - Whether the stream is currently live } });

3. ส่งการดำเนินการ (ไม่บังคับ)

// Redirect the host page (e.g. for a "Storm" button) window.parent.postMessage({ type: 'D1_EXT_ACTION', action: 'storm', target: 'username-slug' }, d1ParentOrigin);

ขอบเขตการอนุญาต

ประกาศว่าส่วนขยายของคุณต้องการข้อมูลใด ผู้ตรวจสอบตรวจสอบรหัสของคุณตรงกับสิทธิ์ที่คุณประกาศ

ขอบเขตให้สิทธิ์การเข้าถึง
read:streamสถานะการสตรีม ชื่อ หมวดหมู่
read:viewersจำนวนผู้ดูและรายชื่อ
read:chatข้อความแชท (ผ่านช่องทาง Pusher)
read:clipsคลิปช่องทาง /api/clips/{slug}
read:tournamentsข้อมูลการแข่งขันที่ใช้งานอยู่ผ่านทาง /api/active-match/{id}
read:channelโปรไฟล์ช่อง ผู้ติดตาม กำหนดการ

ข้อกำหนดด้านความปลอดภัย

ส่วนขยายทำงานใน iframe แบบแซนด์บ็อกซ์ ด้วย sandbox="allow-scripts" ส่วนขยายของคุณ ไม่สามารถ เข้าถึงคุกกี้ localStorage หรือส่งคำขอการตรวจสอบสิทธิ์ไปยัง d1arena.com
  • สาธารณะ HTTPS จำเป็น — URL iframe ของคุณต้องใช้ TLS และแก้ไขเป็นที่อยู่เครือข่ายสาธารณะเท่านั้น
  • แหล่งที่มาที่มนุษย์สามารถอ่านได้ — ไม่มี JavaScript ที่สร้างความสับสนหรือย่อขนาดเท่านั้น ผู้ตรวจสอบจะต้องสามารถอ่านโค้ดของคุณได้
  • ไม่มีการโหลดสคริปต์ภายนอก เว้นแต่จะประกาศไว้ในการส่งของคุณ ไลบรารี CDN (jQuery, Chart.js ฯลฯ) ก็ใช้ได้
  • ไม่มีการกรองข้อมูล — ส่วนขยายต้องไม่ส่งข้อมูลผู้ดูไปยังบริการวิเคราะห์หรือติดตามของบุคคลที่สาม
  • นโยบายเนื้อหา — ไม่มีโฆษณา เนื้อหา NSFW การขุด cryptocurrency หรือพฤติกรรมที่เป็นอันตราย

กระบวนการตรวจสอบ

สถานะความหมาย
pendingส่งแล้ว รอการตรวจสอบจากผู้ดูแลระบบ (โดยทั่วไปจะใช้เวลา 1-3 วันทำการ)
approvedได้รับการอนุมัติและมองเห็นได้ใน Extension Marketplace
rejectedถูกปฏิเสธอย่างมีเหตุผล แก้ไขปัญหาแล้วส่งใหม่
suspendedถูกนำออกชั่วคราวเนื่องจากละเมิดนโยบาย ติดต่อฝ่ายสนับสนุน

การอัปเดตเวอร์ชัน

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

บันทึกการเปลี่ยนแปลง

ติดตามการเปลี่ยนแปลง API และคุณสมบัติใหม่ เราติดตามการกำหนดเวอร์ชันเชิงความหมายและประกาศการเปลี่ยนแปลงที่สำคัญล่วงหน้าอย่างน้อย 30 วัน

v1.0มีนาคม 2569
  • การเปิดตัว API สาธารณะครั้งแรกพร้อมการรับรองความถูกต้องของคีย์ API
  • สตรีม: แสดงรายการสตรีมสด รับรายละเอียดสตรีมเมอร์ตาม Slug
  • หมวดหมู่: ค้นหาและแสดงรายการหมวดหมู่เกมทั้งหมด
  • ผู้ใช้: โปรไฟล์สาธารณะพร้อมสถิติการแข่งขัน คะแนน ELO และจำนวนเหรียญรางวัล
  • คลิป: เรียกดูและรับรายละเอียดคลิปด้วยข้อมูลสตรีมเมอร์/ผู้สร้าง
  • ทัวร์นาเมนต์: รายการ กรองตามสถานะ/ลีก ดูจำนวนผู้เข้าร่วม
  • กระดานผู้นำ ELO: กระดานผู้นำระดับโลกและตามหมวดหมู่
  • ลีก: รายชื่อลีกพร้อมอันดับและการแบ่งคะแนน
  • D1 Frenzy: สถานะ Frenzy แบบเรียลไทม์สำหรับสตรีมเมอร์ทุกคน
  • Webhooks (EventSub): กิจกรรม 12 ประเภท ได้แก่ สตรีม ช่อง ทัวร์นาเมนต์ คลิป และกิจกรรม Frenzy
  • ขีดจำกัดอัตรา

ต้องการความช่วยเหลือ?

คำถามเกี่ยวกับ API? ติดต่อเรา.