ทำให้เงินโดเนทจาก Ko-fi โผล่ใน Alert Box, นับรวมใน Goal Widget และเข้า Donation log ของ Streamlabs — ผ่านตัวกลางฟรีของ Cloudflare
เพราะ Ko-fi กับ Streamlabs "พูดคนละภาษา" กัน Ko-fi ยิงข้อมูลออกมาแบบหนึ่ง แต่ Streamlabs รับโดเนทอีกแบบหนึ่ง — Cloudflare Worker คือโปรแกรมเล็ก ๆ ที่คอยรับจาก Ko-fi แล้วแปลงให้ Streamlabs เข้าใจ แล้วส่งต่อให้ ทั้งหมดนี้ทำงานบนคลาวด์ฟรีของ Cloudflare ไม่ต้องเปิดคอมทิ้งไว้
https://streamlabs.com/dashboard#/settings/api-settings หรือ dev.streamlabs.com แล้วล็อกอินdonations.create
Redirect URIhttp://localhost
Whitelistใส่ชื่อ Twitch ของตัวเอง (ระหว่างทดสอบ)
เอา Client ID ของคุณไปแทนที่ YOUR_CLIENT_ID ในลิงก์ข้างล่าง แล้วเปิดในเบราว์เซอร์ (ที่ล็อกอิน Streamlabs อยู่):
https://streamlabs.com/api/v2.0/authorize?client_id=YOUR_CLIENT_ID&redirect_uri=http://localhost&response_type=code&scope=donations.createhttp://localhost/?code=..... แล้วขึ้นว่า "เชื่อมต่อไม่ได้" — ถือว่าปกติ!code= มาเก็บไว้localhost/?code=def50200ab12... — นั่นแหละคือ "รหัส" ที่เราต้องการเปิด PowerShell (กดปุ่ม Start พิมพ์ว่า PowerShell) แล้วแก้ YOUR_CLIENT_ID เป็นของคุณ จากนั้นวางทั้งก้อนนี้แล้วกด Enter — มันจะถามให้พิมพ์ Client Secret และ รหัสจากขั้นที่ 2 ทีละบรรทัด (วิธีนี้กันพิมพ์ผิด/ลืมแก้ค่า):
$code = Read-Host "วางรหัสจากขั้นที่ 2 (code=...)"
$secret = Read-Host "วาง Client Secret"
$body = @{
grant_type = "authorization_code"
client_id = "YOUR_CLIENT_ID"
client_secret = $secret
redirect_uri = "http://localhost"
code = $code
}
$resp = Invoke-RestMethod -Method Post -Uri "https://streamlabs.com/api/v2.0/token" -Body $body
Write-Host "`n===== ACCESS TOKEN (คัดลอกบรรทัดล่างไปเก็บ) =====" -ForegroundColor Green
$resp.access_tokeneyJ0eXAiOiJKV1Qi... — นั่นคือ Access Token ของคุณ เก็บไว้ใช้ในขั้นที่ 5YOUR_CLIENT_ID — ให้กลับไปขั้นที่ 2 ขอรหัสใหม่แล้วรันอีกครั้งทันทีdash.cloudflare.com (สมัครฟรีถ้ายังไม่มี) → เมนูซ้าย Workers & Pageskofi-streamlabs → Deploy// Ko-fi -> Streamlabs donation relay (Cloudflare Worker)
// รับ Webhook จาก Ko-fi แล้วส่งต่อเป็นโดเนทจริงเข้า Streamlabs
//
// ต้องตั้งค่า Secrets 2 ตัว (Settings > Variables and Secrets):
// STREAMLABS_ACCESS_TOKEN - access_token ที่ได้จากขั้นที่ 3
// KOFI_VERIFICATION_TOKEN - Verification Token จากหน้า Ko-fi Webhooks
const SUPPORTED_CURRENCIES = [
"AUD", "BRL", "CAD", "CZK", "DKK", "EUR", "HKD", "ILS", "MYR", "MXN", "NOK",
"NZD", "PHP", "PLN", "GBP", "RUB", "SGD", "SEK", "CHF", "THB", "TRY", "USD"
];
export default {
async fetch(request, env) {
// เปิดด้วยเบราว์เซอร์ = เช็คว่ายังมีชีวิตอยู่
if (request.method !== "POST") {
return new Response("Ko-fi -> Streamlabs relay is alive.", { status: 200 });
}
// Ko-fi ส่งมาเป็น form ที่มีฟิลด์เดียวชื่อ data (เป็น JSON string)
let kofi;
try {
const form = await request.formData();
kofi = JSON.parse(form.get("data"));
} catch (err) {
return new Response("Bad payload", { status: 400 });
}
// ปฏิเสธถ้าไม่ได้มาจากบัญชี Ko-fi ของเรา
if (kofi.verification_token !== env.KOFI_VERIFICATION_TOKEN) {
return new Response("Invalid verification token", { status: 401 });
}
let currency = (kofi.currency || "USD").toUpperCase();
if (!SUPPORTED_CURRENCIES.includes(currency)) currency = "USD";
const params = new URLSearchParams({
name: (kofi.from_name || "Anonymous").slice(0, 25),
identifier: kofi.email || kofi.kofi_transaction_id || ("kofi-" + Date.now()),
message: (kofi.message || "").slice(0, 255),
amount: kofi.amount || "0",
currency: currency
});
const res = await fetch("https://streamlabs.com/api/v2.0/donations", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"Accept": "application/json",
"Authorization": "Bearer " + env.STREAMLABS_ACCESS_TOKEN
},
body: params
});
// ตอบ 200 เสมอ เพื่อไม่ให้ Ko-fi ยิงซ้ำ; ถ้า Streamlabs error ให้ดูใน Worker logs
if (!res.ok) {
console.log("Streamlabs error", res.status, await res.text());
}
return new Response("OK", { status: 200 });
}
};ในหน้า Worker ของคุณ → Settings → Variables and Secrets → กด Add เลือกชนิดเป็น Secret แล้วเพิ่มทีละตัว:
STREAMLABS_ACCESS_TOKENวาง Access Token (eyJ0...) จากขั้นที่ 3
KOFI_VERIFICATION_TOKENเว้นไว้ก่อน — จะได้ค่าในขั้นที่ 6 แล้วค่อยกลับมาใส่
https://kofi-streamlabs.ชื่อคุณ.workers.devhttps://ko-fi.com/manage/webhooks (เมนู More → API/Webhooks)KOFI_VERIFICATION_TOKEN แล้ว Deploy ซ้ำ401 และโดเนทจะไม่เข้า| อาการ | สาเหตุ & วิธีแก้ |
|---|---|
| กด Send Test แล้ว Streamlabs เงียบ ไม่มีอะไรเข้า | เช็คว่า Webhook URL ใน Ko-fi คือ URL ของ Worker จริง ๆ และใส่ Secrets ครบ 2 ตัวแล้ว Deploy ใหม่; ลองเปิด URL Worker ในเบราว์เซอร์ดูว่าขึ้น "relay is alive" |
| โดเนทไม่เข้า / เปิด log เจอหน้า HTML login | เป็นปัญหาคลาสสิกเวลาส่ง token ผิดที่ — ต้องส่งใน Authorization: Bearer (header) ไม่ใช่ใน body โค้ดในขั้นที่ 4 แก้จุดนี้ให้แล้ว อย่าเผลอย้าย token ลง body |
| ตอนขอ Token ขึ้น error 500 | รหัส (code) หมดอายุ (มีอายุไม่กี่นาที) หรือยังไม่ได้แก้ YOUR_CLIENT_ID → ขอรหัสใหม่ในขั้นที่ 2 แล้วรันทันที |
| Worker ตอบ 401 Invalid verification token | ค่า KOFI_VERIFICATION_TOKEN ใน Cloudflare ไม่ตรงกับใน Ko-fi → คัดลอกใหม่ให้ตรงเป๊ะ แล้ว Deploy |
| ยอดเงิน/สกุลเงินเพี้ยน | ถ้าสกุลเงินไม่อยู่ในรายการที่ Streamlabs รองรับ โค้ดจะตกเป็น USD ให้อัตโนมัติ (THB รองรับอยู่แล้ว) |