Regional platforms
บอต QQ
QQ Bot เชื่อมต่อกับ OpenClaw ผ่าน QQ Bot API อย่างเป็นทางการ (WebSocket gateway)
แชตส่วนตัวแบบ C2C และการกล่าวถึง @ ในกลุ่มเป็นประเภทแชตหลัก พร้อมรองรับสื่อ
หลากหลาย (รูปภาพ เสียง วิดีโอ ไฟล์) ข้อความในช่องกิลด์รองรับเฉพาะ
ข้อความและรูปภาพจาก URL ระยะไกลเท่านั้น ส่วนเสียง วิดีโอ การอัปโหลดไฟล์ และรูปภาพ
ภายในเครื่อง/Base64 ไม่พร้อมใช้งานในช่องกิลด์ ไม่รองรับรีแอ็กชันและเธรด
ในทุกบริบท
สถานะ: Plugin อย่างเป็นทางการที่ดาวน์โหลดได้
ติดตั้ง
openclaw plugins install @openclaw/qqbotตั้งค่า
- ไปที่ QQ Open Platform และสแกนคิวอาร์โค้ดด้วย QQ บนโทรศัพท์เพื่อลงทะเบียน / เข้าสู่ระบบ
- คลิก Create Bot เพื่อสร้าง QQ bot ใหม่
- ค้นหา AppID และ AppSecret ในหน้าการตั้งค่าของบอต แล้วคัดลอกค่าเหล่านั้น
- เพิ่มช่อง:
openclaw channels add --channel qqbot --token "AppID:AppSecret"- รีสตาร์ท Gateway
ความทนทานของข้อมูลขาเข้า
สำหรับเหตุการณ์รอบการสนทนาจาก QQ gateway นั้น OpenClaw จะบันทึกเหตุการณ์ดิบไว้อย่างถาวรก่อนเลื่อนลำดับการดำเนินการต่อของ gateway ที่บันทึกไว้ รอบที่รอดำเนินการหรือลองใหม่ได้จะยังคงอยู่หลังจากรีสตาร์ท Gateway ยังคงประมวลผลตามลำดับแยกในแต่ละการสนทนา และใช้รหัสเหตุการณ์ของผู้ให้บริการเพื่อระงับรายการคิวที่ซ้ำกัน ตราบใดที่ยังมีระเบียนการดำเนินการเสร็จสิ้นที่ใช้งานอยู่หรือเก็บรักษาไว้
หากการรับเข้าแบบคงทนล้มเหลว OpenClaw จะยุติซ็อกเก็ต gateway ปัจจุบันโดยไม่เลื่อนลำดับ จากนั้นเส้นทางเชื่อมต่อใหม่/ดำเนินการต่อจะสามารถขอเหตุการณ์ที่ยังไม่ได้คอมมิตอีกครั้ง การส่งมอบข้ามขอบเขตจากคิวไปยังเอเจนต์ยังคงเป็นแบบอย่างน้อยหนึ่งครั้ง ดังนั้นการหยุดทำงานระหว่างส่งต่ออาจทำให้รอบการสนทนาถูกเล่นซ้ำ
การตั้งค่าแบบโต้ตอบ:
openclaw channels addวิซาร์ดยังมีการผูกด้วยคิวอาร์โค้ดเป็นทางเลือกแทนการพิมพ์ AppID/AppSecret ด้วยตนเอง: สแกนโค้ดด้วยแอปบนโทรศัพท์ที่เชื่อมกับ QQ Bot เป้าหมายเพื่อดำเนินการ ผูกให้เสร็จสมบูรณ์ OpenClaw จะบันทึกข้อมูลประจำตัวที่ส่งกลับมาไว้ภายใต้ขอบเขต การกำหนดค่าของบัญชี
กำหนดค่า
การกำหนดค่าขั้นต่ำ:
{ channels: { qqbot: { enabled: true, appId: "YOUR_APP_ID", clientSecret: "YOUR_APP_SECRET", }, },}ตัวแปรสภาพแวดล้อมของบัญชีเริ่มต้น (เฉพาะบัญชีระดับบนสุด):
QQBOT_APP_IDQQBOT_CLIENT_SECRET
AppSecret ที่อ้างอิงจากไฟล์:
{ channels: { qqbot: { enabled: true, appId: "YOUR_APP_ID", clientSecretFile: "/path/to/qqbot-secret.txt", }, },}AppSecret แบบ SecretRef จากตัวแปรสภาพแวดล้อม:
{ channels: { qqbot: { enabled: true, appId: "YOUR_APP_ID", clientSecret: { source: "env", provider: "default", id: "QQBOT_CLIENT_SECRET" }, }, },}หมายเหตุ:
openclaw channels add --channel qqbot --token-file ...กำหนดเฉพาะ AppSecret เท่านั้น โดยต้องกำหนดappIdในการกำหนดค่าหรือQQBOT_APP_IDไว้แล้วclientSecretยอมรับสตริงข้อความธรรมดา พาธไฟล์ (clientSecretFile) หรือออบเจ็กต์ SecretRef แบบมีโครงสร้าง- ระบบปฏิเสธสตริงเครื่องหมาย
secretref:.../secretref-env:...แบบเดิมสำหรับclientSecret; ให้ใช้ออบเจ็กต์ SecretRef แบบมีโครงสร้างแทน
การสตรีม
{ channels: { qqbot: { streaming: { mode: "partial", // การสตรีมแบบบล็อก: "partial" (ค่าเริ่มต้น) หรือ "off" nativeTransport: true, // ใช้ C2C stream_messages API อย่างเป็นทางการของ QQ สำหรับ DM }, }, },}streaming.mode: "off"ปิดใช้การสตรีมแบบบล็อกสำหรับบัญชีstreaming.nativeTransport: trueสตรีมการตอบกลับ C2C (DM) ผ่านstream_messagesAPI อย่างเป็นทางการของ QQ โดยไม่กระทบเป้าหมายแบบกลุ่ม/ช่อง- ค่าสเกลาร์
streaming: true|falseแบบเดิมและคีย์streaming.c2cStreamApiจะย้ายไปยังโครงสร้างนี้ผ่านopenclaw doctor --fix /bot-streaming on|offสลับการกำหนดค่าเดียวกันจาก DM
นโยบายการเข้าถึง
allowFrom/groupAllowFromควบคุมว่าใครสามารถแชตกับบอตในบริบท C2C / กลุ่มได้dmPolicy/groupPolicy(open|allowlist|disabled) ควบคุมโหมดการบังคับใช้dmPolicyมีค่าเริ่มต้นเป็นallowlistเมื่อallowFromมีรายการที่ระบุชัดเจน (ไม่ใช่ไวลด์การ์ด) มิฉะนั้นจะเป็นopengroupPolicyมีค่าเริ่มต้นเป็นallowlistเมื่อgroupAllowFromหรือallowFromมีรายการที่ระบุชัดเจน มิฉะนั้นจะเป็นopen- คำสั่งแบบสแลช "Auth: allowlist" ต้องมีรายการที่ระบุชัดเจนและไม่ใช่ไวลด์การ์ดใน
allowFrom(หรือgroupAllowFromสำหรับการเรียกใช้ในกลุ่ม) โดยไม่ขึ้นกับdmPolicy/groupPolicy— ดูคำสั่งแบบสแลช
การตั้งค่าหลายบัญชี
เรียกใช้ QQ bot หลายตัวภายใต้อินสแตนซ์ OpenClaw เดียว:
{ channels: { qqbot: { enabled: true, appId: "111111111", clientSecret: "secret-of-bot-1", accounts: { bot2: { enabled: true, appId: "222222222", clientSecret: "secret-of-bot-2", }, }, }, },}แต่ละบัญชีเป็นเจ้าของการเชื่อมต่อ WebSocket, ไคลเอนต์ API และแคชโทเค็น
ที่แยกจากกัน โดยใช้ appId เป็นคีย์ บรรทัดบันทึกจะติดแท็กรหัสบัญชีเจ้าของ เพื่อให้
ข้อมูลการวินิจฉัยยังคงแยกจากกันได้เมื่อเรียกใช้บอตหลายตัวภายใต้ Gateway เดียว
เพิ่มบอตตัวที่สองผ่าน CLI:
openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-of-bot-2"แชตกลุ่ม
การรองรับกลุ่มใช้ OpenID ของกลุ่ม QQ ไม่ใช่ชื่อที่แสดง เพิ่มบอตลงใน กลุ่ม จากนั้นกล่าวถึงบอตหรือกำหนดค่าให้กลุ่มทำงานโดยไม่ต้องกล่าวถึง
{ channels: { qqbot: { groupPolicy: "allowlist", groupAllowFrom: ["member_openid"], groups: { "*": { requireMention: true, commandLevel: "all", historyLimit: 50, tools: { deny: ["exec", "read", "write"] }, }, GROUP_OPENID: { name: "Release room", requireMention: false, ignoreOtherMentions: true, commandLevel: "safety", historyLimit: 20, prompt: "Keep replies short and operational.", }, }, }, },}groups["*"] กำหนดค่าเริ่มต้นสำหรับทุกกลุ่ม ส่วนรายการ groups.GROUP_OPENID
ที่ระบุชัดเจนจะแทนที่ค่าเริ่มต้นเหล่านั้นสำหรับหนึ่งกลุ่ม การตั้งค่ากลุ่ม:
| ฟิลด์ | ค่าเริ่มต้น | คำอธิบาย |
|---|---|---|
requireMention |
true |
กำหนดให้ต้องกล่าวถึง @ ก่อนที่บอตจะตอบ |
commandLevel |
all |
คำสั่งแบบสแลชในตัวรายการใดที่เรียกใช้ในกลุ่มได้ (ดูด้านล่าง) |
ignoreOtherMentions |
false |
ทิ้งข้อความที่กล่าวถึงบุคคลอื่นแต่ไม่ได้กล่าวถึงบอต |
historyLimit |
50 |
เก็บข้อความล่าสุดที่ไม่ได้กล่าวถึงไว้เป็นบริบทสำหรับรอบถัดไปที่กล่าวถึง 0 ปิดใช้ประวัติ |
tools |
— | อนุญาต/ปฏิเสธเครื่องมือสำหรับทั้งกลุ่ม |
toolsBySender |
— | การแทนที่เครื่องมือต่อผู้ส่ง โปรดดูกลุ่ม |
name |
คำนำหน้า openid | ป้ายกำกับที่อ่านง่ายซึ่งใช้ในบันทึกและบริบทกลุ่ม |
prompt |
ค่าเริ่มต้นในตัว | พรอมต์พฤติกรรมต่อกลุ่มที่ต่อท้ายบริบทของเอเจนต์ |
commandLevel ยอมรับ:
| ระดับ | ลักษณะการทำงาน |
|---|---|
all |
คำสั่งในตัวที่มีอยู่ยังคงพร้อมใช้งาน บางคำสั่งยังคงซ่อนจากเมนู แต่ผู้ใช้ที่ได้รับอนุญาตยังสามารถเรียกใช้ในกลุ่มได้ |
safety |
/help, /btw, /stop ยังคงแสดงในกลุ่ม ส่วนคำสั่งที่ละเอียดอ่อน (/config, /tools, /bash เป็นต้น) ต้องเรียกใช้ในแชตส่วนตัว |
strict |
อนุญาตเฉพาะการควบคุมเซสชันกลุ่มที่จำเป็นสำหรับการทำงานแบบเข้มงวดเท่านั้น /stop ยังคงใช้งานได้ เพื่อให้ผู้ส่งที่ได้รับอนุญาตสามารถขัดจังหวะการทำงานที่กำลังดำเนินอยู่ |
รายการ QQBot toolPolicy แบบเก่าเลิกใช้งานแล้ว เรียกใช้ openclaw doctor --fix เพื่อย้ายรายการเหล่านั้นไปยัง tools
โหมดการเปิดใช้งานคือ mention และ always โดย requireMention: true แมปไปยัง
mention; requireMention: false แมปไปยัง always หากมีการแทนที่การเปิดใช้งาน
ระดับเซสชัน ค่านั้นจะมีลำดับความสำคัญเหนือการกำหนดค่า
คิวขาเข้าแยกตามเพียร์ เพียร์กลุ่มมีขีดจำกัดคิวที่มากกว่า (50 เทียบกับ 20 สำหรับเพียร์โดยตรง) เมื่อคิวเต็มจะนำข้อความที่บอตเขียนออกก่อนข้อความของมนุษย์ และรวมชุดข้อความกลุ่มปกติที่ส่งเข้ามาติดกันเป็นรอบเดียวพร้อมระบุผู้ส่ง คำสั่งแบบสแลช ทำงานทีละคำสั่งโดยไม่ขึ้นกับชุดการรวมใดๆ
เสียง (STT / TTS)
STT และ TTS รองรับการกำหนดค่าสองระดับพร้อมการย้อนกลับตามลำดับความสำคัญ:
| การตั้งค่า | เฉพาะ Plugin | ค่าทดแทนของเฟรมเวิร์ก |
|---|---|---|
| STT | channels.qqbot.stt |
tools.media.audio.models[0] |
| TTS | channels.qqbot.tts, channels.qqbot.accounts.<id>.tts |
messages.tts |
{ channels: { qqbot: { stt: { provider: "your-provider", model: "your-stt-model", }, tts: { provider: "your-provider", model: "your-tts-model", voice: "your-voice", }, accounts: { "qq-main": { tts: { providers: { openai: { voice: "shimmer" }, }, }, }, }, }, },}กำหนด enabled: false ที่รายการใดรายการหนึ่งเพื่อปิดใช้ การแทนที่ TTS ระดับบัญชีใช้
โครงสร้างเดียวกับ messages.tts และผสานแบบลึกทับการกำหนดค่า TTS ระดับช่อง/ส่วนกลาง
คำขอ STT จะหมดเวลาหลังจาก 60 วินาทีโดยค่าเริ่มต้น STT เฉพาะ Plugin ใช้
การแทนที่ models.providers.<id>.timeoutSeconds ที่เลือก STT เสียงของเฟรมเวิร์ก
ใช้ tools.media.audio.models[0].timeoutSeconds จากนั้น
tools.media.audio.timeoutSeconds และตามด้วยการแทนที่ผู้ให้บริการที่เลือก
ไฟล์แนบเสียง QQ ขาเข้าจะแสดงต่อเอเจนต์เป็นข้อมูลเมตาสื่อเสียง
โดยไม่นำไฟล์เสียงดิบเข้าสู่ MediaPaths ทั่วไป [[audio_as_voice]]
ในการตอบกลับแบบข้อความธรรมดาจะสังเคราะห์ TTS และส่งข้อความเสียง QQ แบบเนทีฟเมื่อ
กำหนดค่า TTS แล้ว
นอกจากนี้ยังปรับแต่งพฤติกรรมการอัปโหลด/แปลงรหัสเสียงขาออกได้ด้วย
channels.qqbot.audioFormatPolicy:
sttDirectFormatsuploadDirectFormatstranscodeEnabled
รูปแบบเป้าหมาย
| รูปแบบ | คำอธิบาย |
|---|---|
qqbot:c2c:OPENID |
แชตส่วนตัว (C2C) |
qqbot:group:GROUP_OPENID |
แชตกลุ่ม |
qqbot:channel:CHANNEL_ID |
ช่องกิลด์ |
คำสั่งแบบสแลช
คำสั่งในตัวที่ถูกสกัดก่อนเข้าสู่คิว AI:
| คำสั่ง | การยืนยันสิทธิ์ | ขอบเขต | คำอธิบาย |
|---|---|---|---|
/bot-ping |
— | ใดก็ได้ | ทดสอบเวลาแฝง |
/bot-help |
— | ใดก็ได้ | แสดงรายการคำสั่งทั้งหมด |
/bot-me |
— | แชทส่วนตัวเท่านั้น | แสดง ID ผู้ใช้ QQ (openid) ของผู้ส่งสำหรับการตั้งค่า allowFrom / groupAllowFrom |
/bot-version |
— | แชทส่วนตัวเท่านั้น | แสดงเวอร์ชันเฟรมเวิร์ก OpenClaw และเวอร์ชัน Plugin |
/bot-upgrade |
— | แชทส่วนตัวเท่านั้น | แสดงลิงก์คู่มืออัปเกรด QQBot |
/bot-approve |
รายการที่อนุญาต | แชทส่วนตัวเท่านั้น | จัดการการกำหนดค่าการอนุมัติการเรียกใช้คำสั่ง (เปิด / ปิด / เสมอ / รีเซ็ต / สถานะ) |
/bot-logs |
รายการที่อนุญาต | แชทส่วนตัวเท่านั้น | ส่งออกบันทึกล่าสุดของ Gateway เป็นไฟล์ |
/bot-clear-storage |
รายการที่อนุญาต | แชทส่วนตัวเท่านั้น | ลบไฟล์ดาวน์โหลดที่แคชไว้ภายใต้ไดเรกทอรีสื่อของ QQBot |
/bot-streaming |
รายการที่อนุญาต | แชทส่วนตัวเท่านั้น | เปิดหรือปิดการตอบกลับแบบสตรีมสำหรับ C2C |
/bot-group-allways |
รายการที่อนุญาต | แชทส่วนตัวเท่านั้น | สลับโหมดการเปิดใช้งานกลุ่มเริ่มต้น (ต้องกล่าวถึงเทียบกับเปิดตลอดเวลา) |
ต่อท้าย ? ในคำสั่งใดก็ได้เพื่อดูวิธีใช้ (เช่น /bot-upgrade ?)
คำสั่งที่มี "การยืนยันสิทธิ์: รายการที่อนุญาต" ยังกำหนดให้ openid ของผู้ส่งอยู่ในรายการ
allowFrom แบบระบุชัดเจนที่ไม่ใช่อักขระแทนค่า (groupAllowFrom มีลำดับความสำคัญเหนือกว่าสำหรับ
คำสั่งที่ออกจากกลุ่ม โดยจะใช้ allowFrom แทนหากไม่มี) อักขระแทนค่า
allowFrom: ["*"] อนุญาตให้แชทได้แต่ไม่อนุญาตคำสั่งเหล่านี้ การเรียกใช้คำสั่งใดคำสั่งหนึ่ง
นอกแชทส่วนตัวหรือโดยไม่ได้รับอนุญาตจะส่งคำแนะนำกลับมา แทนที่จะ
ละทิ้งข้อความโดยไม่แจ้งให้ทราบ
/bot-me, /bot-version และ /bot-upgrade ใช้ได้เฉพาะในแชทส่วนตัว แต่ไม่
ต้องอยู่ในรายการที่อนุญาต ผู้ส่ง C2C ทุกคนสามารถเรียกใช้ได้
เมื่อการอนุมัติการเรียกใช้คำสั่งของ QQ Bot ใช้การย้อนกลับไปยังแชทเดียวกันตามค่าเริ่มต้น การคลิกปุ่ม
อนุมัติแบบเนทีฟจะใช้รายการอนุญาตคำสั่งแบบระบุชัดเจนที่ไม่ใช่อักขระแทนค่าเดียวกัน หากต้องการ
ให้สิทธิ์เฉพาะการอนุมัติโดยไม่ให้สิทธิ์เข้าถึงคำสั่งอื่นในวงกว้าง ให้กำหนดค่า
channels.qqbot.execApprovals.approvers การอนุมัติการเรียกใช้คำสั่งแบบเนทีฟเปิดใช้งาน
โดยค่าเริ่มต้น
สื่อและพื้นที่จัดเก็บ
- สื่อขาเข้า ขาออก และบริดจ์ Gateway ใช้รูทเพย์โหลดเดียวกันภายใต้
~/.openclaw/media/qqbot(โดยใช้OPENCLAW_HOMEหากตั้งค่าไว้) ดังนั้นไฟล์อัปโหลด ไฟล์ดาวน์โหลด และแคชการแปลงรหัสจะอยู่ภายใต้ไดเรกทอรีที่มีการป้องกันเดียวกัน - การส่งสื่อสมบูรณ์สำหรับเป้าหมาย C2C และกลุ่มดำเนินการผ่านเส้นทาง
sendMediaเดียว ไฟล์ในเครื่องและบัฟเฟอร์ในหน่วยความจำขนาด 5 MiB ขึ้นไปจะใช้ เอนด์พอยต์อัปโหลดแบบแบ่งส่วนของ QQ ส่วนเพย์โหลดที่เล็กกว่าและแหล่งที่มาแบบ URL ระยะไกล/Base64 จะใช้ API อัปโหลดแบบครั้งเดียว - หากการอัปเกรดแบบร้อนขัดจังหวะ Gateway ก่อนเขียน
openclaw.jsonเสร็จ Plugin จะกู้คืนappId/clientSecretล่าสุดที่ทราบของบัญชีนั้นจากสแนปช็อตภายในเมื่อเริ่มต้นครั้งถัดไป (โดยจะไม่ เขียนทับการเปลี่ยนแปลงการกำหนดค่าที่ตั้งใจไว้) จึงไม่ จำเป็นต้องสแกนรหัส QR ใหม่
การแก้ไขปัญหา
- Gateway ไม่เริ่มทำงาน / ไม่มีข้อความขาเข้า: ตรวจสอบว่า
appIdและclientSecretถูกต้อง และเปิดใช้งานบอตบน QQ Open Platform แล้ว หากข้อมูลประจำตัวหายไป ระบบจะแสดง "ไม่ได้กำหนดค่า QQBot (ไม่มี appId หรือ clientSecret)" - ตั้งค่าด้วย
--token-fileแล้วยังแสดงว่ายังไม่ได้กำหนดค่า:--token-fileตั้งค่า เฉพาะ AppSecret เท่านั้น ยังต้องตั้งค่าappIdในการกำหนดค่าหรือQQBOT_APP_ID - การตอบกลับกลุ่มแบบเป็นชุดชนกัน: เมื่อคิวของเพียร์เต็ม คิวขาเข้าจะนำข้อความ ที่บอตสร้างออกก่อนข้อความของมนุษย์ และรวมชุดข้อความกลุ่มปกติ (ที่ไม่ใช่คำสั่ง) ให้เป็นเทิร์นเดียวพร้อมระบุผู้ส่ง เพื่อไม่ให้ข้อความจากบอตที่หลั่งไหลเข้ามา ขัดขวางข้อความของมนุษย์
- ข้อความเชิงรุกไม่มาถึง: QQ อาจบล็อกข้อความที่บอตเป็นฝ่ายเริ่ม หาก ผู้ใช้ไม่ได้โต้ตอบเมื่อไม่นานมานี้
- เสียงไม่ได้รับการถอดข้อความ: ตรวจสอบว่าได้กำหนดค่า STT แล้วและสามารถ ติดต่อผู้ให้บริการได้