เลือกหัวข้อที่ต้องการอ่าน
ทำอะไรได้บ้าง
- คุยแบบ 1:1 และในกลุ่ม — รับข้อความ ตอบกลับด้วยข้อความ Markdown ปุ่มตอบกลับ สติกเกอร์ รูป และไฟล์ (สูงสุด 100 MB)
- รับเหตุการณ์ทันที — webhook พร้อมลายเซ็น HMAC หรือ long-poll ที่รอได้ 25 วินาทีต่อครั้ง
- เมนูคำสั่ง / — ตั้งรายการคำสั่งให้ผู้ใช้กดเลือกได้ในแชท
- ต่อ AI agent ได้เลย — มีปลั๊กอินสำเร็จรูปสำหรับ OpenClaw และ Hermes
- ปลอดภัยตั้งแต่ต้น — บอทใหม่คุยได้เฉพาะเจ้าของจนกว่าจะเปิดให้ทุกคน และทักคนแปลกหน้าเองไม่ได้
เริ่มใน 5 นาที
- เปิดแอป CUPI → ปุ่ม ➕ → สร้างบอท → CUPI Bot ตั้งชื่อบอท (ระบบตั้ง @ชื่อผู้ใช้บอทให้อัตโนมัติ)
- คัดลอก โทเคน (
cupibot_…) — แสดงครั้งเดียว เก็บไว้ให้ดี ถ้าหลุดให้กด "ออกโทเคนใหม่" ในหน้าบอท - ค้นหา @ชื่อผู้ใช้บอท ในแอป แล้วเพิ่มเป็นเพื่อน ทักบอทหนึ่งครั้ง
- ลองเรียก API ด้านล่าง เห็นข้อความของคุณใน
updatesแล้วตอบกลับได้เลย
curl https://api.hellocupi.app/api/bot/me -H "Authorization: Bearer cupibot_xxxxxxxx"
curl "https://api.hellocupi.app/api/bot/updates?timeout=25" -H "Authorization: Bearer cupibot_xxxxxxxx"
curl -X POST https://api.hellocupi.app/api/bot/send -H "Authorization: Bearer cupibot_xxxxxxxx" -H "Content-Type: application/json" -d '{"to": "<รหัสผู้ใช้>", "text": "สวัสดีจากบอทของฉัน 👋"}'ทุกคำขอใช้ https://api.hellocupi.app และหัว Authorization: Bearer <โทเคน> · ตอบกลับเป็น JSON · ข้อผิดพลาดมี {"error": "…"} พร้อมรหัส HTTP
ใครคุยกับบอทได้
ในหน้าบอทเลือกได้ 2 แบบ: เฉพาะฉัน (ค่าเริ่มต้นของบอทใหม่ — คนอื่นเพิ่มเพื่อนบอทไม่ได้ และข้อความของคนอื่นไม่ถูกส่งถึงบอท) หรือ ทุกคน (ใครเพิ่มเพื่อนก็คุยได้ทันที เหมือนกด Start) · บอทส่งข้อความได้เฉพาะคนที่เป็นเพื่อนกับบอทแล้ว หรือกลุ่ม/ชุมชนที่บอทอยู่ ทักคนแปลกหน้าเองไม่ได้
รับข้อความ แบบที่ 1: ดึงเอง (long-poll)
เรียก GET /api/bot/updates วนไปเรื่อย ๆ ใส่ offset = update_id ล่าสุดที่ได้ + 1 เพื่อยืนยันว่าได้รับแล้ว · timeout รอได้สูงสุด 25 วินาที · คิวเก็บได้ 500 รายการ เหมาะกับสคริปต์บนเครื่องที่บ้าน หรือเครื่องที่รับ webhook ไม่ได้
import requests
API, H = "https://api.hellocupi.app", {"Authorization": "Bearer cupibot_xxxxxxxx"}
offset = 0
while True:
r = requests.get(API + "/api/bot/updates", params={"offset": offset, "timeout": 25}, headers=H, timeout=35).json()
for u in r["updates"]:
offset = u["update_id"] + 1
if u["type"] == "message" and u["message"]["kind"] == "text":
m = u["message"]
to = m["chat"]["id"] if m["chat"]["type"] != "friend" else m["from"]["id"]
requests.post(API + "/api/bot/send", headers=H, json={"to": to, "text": "ได้รับแล้ว: " + m["payload"]["text"]})รับข้อความ แบบที่ 2: Webhook
ในหน้าบอท → แท็บ Webhook ใส่ URL (https) กด สร้าง secret แล้วกด ทดสอบส่ง · หรือตั้งจากโค้ดด้วย POST /api/bot/webhook {"url": "…", "secret": "…"} (ลบด้วย DELETE) · CUPI จะ POST อัปเดตทีละรายการ ภายใน 8 วินาทีต้องตอบ 2xx ไม่งั้นจะลองใหม่แบบเว้นระยะ และอัปเดตยังดึงแบบที่ 1 ได้เสมอ
POST https://your-server.example/cupi
Content-Type: application/json
X-CUPI-Bot-Id: <รหัสผู้ใช้ของบอท>
X-CUPI-Update-Id: 42
X-CUPI-Signature: sha256=<HMAC-SHA256 ของ body ด้วย secret · hex>
{"bot": {"id": "…", "username": "mybot"}, "update": {"update_id": 42, "type": "message", …}}ตรวจลายเซ็น (Node.js)
const crypto = require("crypto");
function verify(rawBody, header, secret) {
const want = "sha256=" + crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
return header && header.length === want.length && crypto.timingSafeEqual(Buffer.from(header), Buffer.from(want));
}ตรวจลายเซ็น (Python)
import hmac, hashlib
def verify(raw_body: bytes, header: str, secret: str) -> bool:
want = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest(want, header or "")ตรวจกับ body ดิบที่ได้รับ (ก่อนแปลง JSON) · webhook ต้องเป็น https และไม่ใช่ที่อยู่ภายในเครือข่าย
ชนิดของอัปเดต
message — มีข้อความถึงบอท: message.id, message.chat ({type: "friend"|"group"|"community", id}), message.from ({id, name}), message.kind (text, image, video, file, voice, sticker …), message.payload (เช่น {text}), message.ts
follow — มีคนเพิ่มบอทเป็นเพื่อน: user
join — บอทถูกเพิ่มเข้ากลุ่ม: group ({id: "g:…", name, members})
button — มีคนกดปุ่มตอบกลับใต้ข้อความของบอท: button ({id, label, data}), message, user
menu — ลูกค้ากดโซนริชเมนูของบัญชีร้าน (CUPI Biz): action, user
ping — จากปุ่ม "ทดสอบส่ง" ในแอป ตอบ 2xx ได้เลย
ส่งข้อความ
POST /api/bot/send · to = รหัสผู้ใช้ (แชท 1:1), g:<กลุ่ม> หรือ c:<ชุมชน> · ส่งได้ 30 ข้อความต่อ 10 วินาที
{"to": "<รหัสผู้ใช้>",
"text": "**ออเดอร์ #1024** พร้อมส่งแล้ว",
"format": "md",
"replyTo": 345,
"buttons": [
{"id": "ok", "label": "รับทราบ", "data": "ack:1024"},
{"label": "ติดตามพัสดุ", "url": "https://example.com/track/1024"}
]}- format: "md" — ตัวหนา ตัวเอียง โค้ด ลิงก์กดได้ ตาราง
- buttons — สูงสุด 4 ปุ่ม · ปุ่มที่มี
dataส่งอัปเดตbuttonกลับมา · ปุ่มที่มีurlเปิดลิงก์ - kind: "sticker" พร้อม
packId/stickerIdหรือemoji - topic — แยกหัวข้อย่อยในแชทบอท (ดู
GET/POST /api/bot/topics)
รูปและไฟล์
# ไฟล์เล็ก: base64 หรือ URL https
POST /api/bot/send-file
{"to": "<รหัสผู้ใช้>", "url": "https://example.com/chart.png", "name": "chart.png", "caption": "กราฟวันนี้"}
# ไฟล์ใหญ่ (สูงสุด 100 MB): ส่งไบต์ไฟล์ตรง ๆ
curl -X POST "https://api.hellocupi.app/api/bot/upload?to=<รหัสผู้ใช้>&name=report.pdf&caption=รายงาน" -H "Authorization: Bearer cupibot_xxxxxxxx" -H "Content-Type: application/pdf" --data-binary @report.pdf
# ดาวน์โหลดไฟล์ที่ผู้ใช้ส่งมา (payload.fileId)
GET /api/bot/file/<fileId>ริชเมนู (เมนูรูปภาพใต้ช่องพิมพ์)
ตั้งเมนูรูปภาพให้แชท 1:1 กับบอทของคุณได้ (บอททุกประเภท) — รูป PNG/JPEG/WebP ไม่เกิน 1.5 MB ส่งเป็น data URL · พื้นที่กดได้ไม่เกิน 20 ช่อง พิกัดเป็นสัดส่วน 0–1 ของรูป · คำสั่ง message (ผู้ใช้ส่งข้อความนั้นในแชท) · url (เปิดลิงก์ HTTPS) · data (บอทได้อัปเดต type: "menu" พร้อม action.data) · ผู้ใช้เห็นเมนูในแอป CUPI รุ่น Android 2.0.17 / iOS build 286 ขึ้นไป
POST /api/bot/menu
{"photo": "data:image/png;base64,…", "label": "เมนู", "ratio": 1.5,
"areas": [
{"x": 0, "y": 0, "w": 0.333, "h": 0.5, "action": {"type": "message", "text": "สถานะ EA", "label": "สถานะ EA"}},
{"x": 0.333, "y": 0, "w": 0.334, "h": 0.5, "action": {"type": "data", "data": "open_orders", "label": "ไม้ที่เปิด"}}
]}
GET /api/bot/menu # ดูเมนูปัจจุบัน (มี revision)
DELETE /api/bot/menu # ลบเมนู
# ริชเมนูของกลุ่ม: บอทต้องอยู่ในกลุ่ม และเป็นของเจ้าของกลุ่ม · สมาชิกกดช่อง data → บอทในกลุ่มได้อัปเดต type "group_menu"
GET|POST|DELETE /api/bot/groups/<groupId>/menuส่ง expectedRevision เพื่อกันเขียนทับเมนูที่เพิ่งถูกแก้ · ไม่ส่ง photo = ใช้รูปเดิม · ratio = กว้าง÷สูง ของรูป
จัดการข้อความและแชท
POST /api/bot/edit {to, messageId, text, format?, buttons?} — แก้ข้อความของบอทเอง (เช่น อัปเดตสถานะงาน)
POST /api/bot/delete {to, messageId} — ลบข้อความของบอทออกจากแชท
POST /api/bot/react {to, messageId, emoji} — รีแอคชันข้อความ (emoji: null = เอาออก)
POST /api/bot/typing {to} — แสดง "กำลังพิมพ์…" (แชท 1:1 และกลุ่ม)
POST /api/bot/commands {commands: [{command, description}]} — ตั้งเมนูคำสั่ง / (สูงสุด 100 · ส่ง [] = ล้าง)
GET /api/bot/me · GET /api/bot/chats (เพื่อน กลุ่ม ชุมชน) · GET /api/bot/messages?with=<id>&limit=50 (ข้อความย้อนหลังของแชทที่บอทเข้าถึงได้)
POST/DELETE /api/bot/communities/<id>/join — ให้บอทเข้า/ออกชุมชน
ต่อกับ AI agent
OpenClaw
curl -fsSLO https://hellocupi.app/agent-plugins/openclaw-cupi.tgz && tar xzf openclaw-cupi.tgz
openclaw plugins install ./openclaw-cupi --force --accept-capabilitiesเพิ่มใน ~/.openclaw/openclaw.json แล้วสั่ง openclaw gateway restart
{"channels": {"cupi": {
"enabled": true,
"token": "cupibot_xxxxxxxx",
"apiBase": "https://api.hellocupi.app",
"dmPolicy": "allowlist",
"allowFrom": ["<รหัสผู้ใช้ของคุณ>"],
"groupPolicy": "disabled"
}}}Hermes
mkdir -p ~/.hermes/plugins
curl -fsSL https://hellocupi.app/agent-plugins/hermes-cupi.tgz | tar xz -C ~/.hermes/plugins
hermes plugins enable cupiใส่ใน ~/.hermes/.env (chmod 600) แล้วรีสตาร์ต Hermes
CUPI_BOT_TOKEN=cupibot_xxxxxxxx
CUPI_API_BASE=https://api.hellocupi.app
CUPI_ALLOWED_USERS=<รหัสผู้ใช้ของคุณ>หน้าบอทในแอปมีคำสั่งเหล่านี้พร้อมโทเคนและรหัสผู้ใช้ของคุณใส่ไว้แล้ว กดคัดลอกได้เลย · ไฟล์ตรวจสอบ: SHA256SUMS
ขีดจำกัดและความปลอดภัย
- สร้างบอทได้ 10 ตัวต่อบัญชี
- โทเคนเก็บแบบแฮชบนเซิร์ฟเวอร์ — CUPI ดูโทเคนของคุณย้อนหลังไม่ได้ · ออกใหม่แล้วของเดิมใช้ไม่ได้ทันที
- ส่งข้อความ 30 ข้อความ/10 วินาที · ข้อความยาวสูงสุด 4,000 ตัวอักษร · ไฟล์สูงสุด 100 MB
- บอทต้องปฏิบัติตาม ข้อกำหนดการใช้บริการ — ห้ามสแปม หลอกลวง หรือเก็บข้อมูลผู้ใช้เกินจำเป็น ผู้ใช้รายงานบอทได้ทุกเมื่อ
ต่างจาก CUPI Bell อย่างไร?
CUPI Bell คือลิงก์เดียวสำหรับส่งแจ้งเตือนเข้าห้อง ไม่ต้องเขียนโค้ด ส่วน CUPI Bot คุยสองทาง รับข้อความ ตอบกลับ และทำงานในกลุ่มได้
บัญชีร้านใช้ API นี้ได้ไหม?
ได้ บัญชีร้าน CUPI Biz มีโทเคนของตัวเองและใช้ API ชุดเดียวกัน พร้อมอัปเดต menu จากริชเมนู
อัปเดตหาย หรือ webhook ไม่ทำงาน?
เปิดหน้าบอทในแอป ดูสถานะและข้อผิดพลาดล่าสุด (สีแดง) แล้วกด "ทดสอบส่ง" · อัปเดตที่ส่ง webhook ไม่สำเร็จยังรออยู่ในคิว ดึงด้วย /api/bot/updates ได้