ตั้งค่าการผสาน Slack
คู่มือนี้แสดงวิธีเชื่อม Slack เข้ากับเวิร์กสเปซ Control Center ไม่ว่าจะโดยให้ Control Center สร้างแอปให้ หรือโดยสร้างแอปนั้นด้วยตัวเอง
สำหรับการเริ่มต้นใช้งานแบบมีคำแนะนำ ดูที่ เชื่อม Slack เข้ากับเวิร์กสเปซ
ก่อนเริ่ม
หัวข้อที่มีชื่อว่า “ก่อนเริ่ม”- บทบาท
ownerหรือadminในเวิร์กสเปซ Control Center — การเชื่อมแอปแชทคือการเปลี่ยนแปลงการตั้งค่าของเวิร์กสเปซ - สิทธิ์ในการสร้างและติดตั้งแอปในเวิร์กสเปซ Slack
- ไม่ต้องมีอะไรที่เข้าถึงได้จากสาธารณะ: การเชื่อมต่อเป็นขาออก (Socket Mode) เซิร์ฟเวอร์จึงไม่ต้องมีพอร์ตขาเข้า ทันเนล หรือโดเมน
สามวิธีในการรับแอป
หัวข้อที่มีชื่อว่า “สามวิธีในการรับแอป”| เส้นทาง | คุณต้องให้ | Control Center ทำ |
|---|---|---|
| แบบมีคำแนะนำ | โทเค็นการตั้งค่าแอป (xoxe-…) |
สร้างแอปพร้อมสโคป เหตุการณ์ Socket Mode และคำสั่งสแลชที่ถูกต้อง แล้วมอบสองขั้นตอนที่ Slack ไม่มี API ให้ |
| สร้างใน Slack | ไม่ต้องให้อะไร | เปิด Slack ด้วยการตั้งค่าเดียวกันที่กรอกไว้ล่วงหน้า คุณเลือกเวิร์กสเปซและยืนยัน |
| ด้วยตัวเอง | โทเค็นของแอปที่สร้างเสร็จแล้ว | ตรวจสอบโทเค็นเหล่านั้นและเชื่อมต่อ |
เส้นทางแบบมีคำแนะนำเป็นเส้นทางเดียวที่ทำให้แอปยัง_จัดการได้_จาก Control Center ซึ่งเป็นสิ่งที่ทำให้ปรับแต่งแชทบอตใช้งานได้ แอปที่สร้างด้วย สร้างใน Slack สามารถยกระดับเป็นแอปที่จัดการได้ในภายหลัง โดยวางโทเค็นการตั้งค่าในไดอะล็อกเชื่อมต่อ
ไม่มีปุ่ม “ติดตั้งแอป Slack ของ Control Center” โดยเจตนา การติดตั้งแอป Slack แบบแจกจ่ายต้องใช้ client secret ร่วมกัน (Slack ไม่มี PKCE) และ Socket Mode กระจายเหตุการณ์ของแอปแบบสุ่มไปตามการเชื่อมต่อของมัน — แอปที่ใช้ร่วมกันหนึ่งตัวจึงจะส่งข้อความของเวิร์กสเปซของคุณไปยังเซิร์ฟเวอร์ของคนอื่น แต่ละเวิร์กสเปซจึงเป็นเจ้าของแอปของตัวเอง และสามเส้นทางนี้พูดถึงว่างานที่คุณต้องทำนั้นน้อยแค่ไหน
ตัวเลือก A: ให้ Control Center สร้างแอป
หัวข้อที่มีชื่อว่า “ตัวเลือก A: ให้ Control Center สร้างแอป”- สร้างคู่โทเค็นการตั้งค่าแอปที่ api.slack.com/apps แล้วคัดลอกโทเค็น refresh (
xoxe-…) - ใน Control Center ไปที่ การตั้งค่า → เวิร์กสเปซ → ทั่วไป แล้วเลื่อนไปที่การ์ด สะพานแชท
- ในบล็อก Slack คลิก สร้างแอปให้ฉัน
- วางโทเค็น ปรับชื่อแอป ชื่อบอท คำอธิบาย และคำสั่งสแลช แล้วคลิก สร้างแอป
- ทำตามสองขั้นตอนที่เหลือซึ่งไดอะล็อกแสดง แต่ละขั้นเป็นลิงก์เข้า Slack:
- Basic Information → App-Level Tokens: สร้างโทเค็นที่มีสโคป
connections:write(xapp-…) - Install App: ติดตั้งลงเวิร์กสเปซแล้วคัดลอก Bot User OAuth Token (
xoxb-…)
- Basic Information → App-Level Tokens: สร้างโทเค็นที่มีสโคป
- คลิก วางข้อมูลรับรอง แล้วทำต่อที่ เชื่อมต่อ
โทเค็นการตั้งค่าจะหมุนเวียนทุกครั้งที่ใช้งาน Control Center เก็บค่าที่หมุนเวียนแล้วไปเรื่อย ๆ คุณจึงไม่ต้องวางมันอีกเลย
ตัวเลือก B: สร้างใน Slack แบบกรอกล่วงหน้า
หัวข้อที่มีชื่อว่า “ตัวเลือก B: สร้างใน Slack แบบกรอกล่วงหน้า”แอปเดียวกัน โดยไม่ต้องใช้โทเค็นการตั้งค่า — Slack เปิดหน้าจอสร้างแอปของตัวเองให้คุณ โดยที่ manifest ทั้งหมดถูกกรอกไว้แล้ว
- ใน Control Center ไปที่ การตั้งค่า → เวิร์กสเปซ → ทั่วไป แล้วเลื่อนไปที่การ์ด สะพานแชท
- ในบล็อก Slack คลิก สร้างแอปให้ฉัน
- ปรับชื่อแอป ชื่อบอท คำอธิบาย และคำสั่งสแลช — สิ่งเหล่านี้ติดไปกับลิงก์
- คลิก สร้างใน Slack เบราว์เซอร์ของคุณจะเปิดหน้าสร้างแอปของ Slack พร้อมการตั้งค่าที่กรอกไว้ล่วงหน้า
- เลือกเวิร์กสเปซ Slack แล้วยืนยัน สโคป เหตุการณ์ Socket Mode และคำสั่งสแลชถูกต้องอยู่แล้ว
- กลับมาที่ Control Center ทำตามสองขั้นตอนที่เหลือซึ่งไดอะล็อกแสดง:
- Basic Information → App-Level Tokens: สร้างโทเค็นที่มีสโคป
connections:write(xapp-…) - Install App: ติดตั้งลงเวิร์กสเปซแล้วคัดลอก Bot User OAuth Token (
xoxb-…)
- Basic Information → App-Level Tokens: สร้างโทเค็นที่มีสโคป
- คลิก วางข้อมูลรับรอง แล้วทำต่อที่ เชื่อมต่อ
Slack ไม่รายงานว่าได้สร้างแอปใด Control Center จึงไม่รู้ id ของแอป และลิงก์ในขั้นตอนที่ 6 จะไปที่รายการแอปของคุณ แทนที่จะไปที่แอปนั้นโดยตรง ปรับแต่งบอท ต้องใช้โทเค็นการตั้งค่า
ตัวเลือก C: สร้างแอปด้วยตัวเอง
หัวข้อที่มีชื่อว่า “ตัวเลือก C: สร้างแอปด้วยตัวเอง”สร้างแอปที่ api.slack.com/apps แล้วตั้งค่าดังนี้
Socket Mode: เปิดใช้งานและเว้น URL คำขอทุกช่องให้ว่าง Slack ปฏิเสธ manifest ที่ขอทั้ง Socket Mode และการส่งผ่าน webhook
สโคปของโทเค็นบอท (OAuth & Permissions):
app_mentions:readassistant:writechannels:historychat:writecommandsgroups:historyim:historyusers:readusers:read.emailการสมัครรับเหตุการณ์ (เหตุการณ์ของบอท):
app_home_openedapp_mentionmessage.channelsmessage.groupsmessage.immessage.channels และ message.groups คือสิ่งที่ทำให้_การตอบกลับ_ในเธรด Slack ที่เชื่อมไว้แล้วทำงานได้ หากไม่มีสิ่งเหล่านี้ มีเพียงการกล่าวถึงครั้งแรกเท่านั้นที่จะมาถึง
คำสั่งสแลช: /cc (ใช้ชื่ออะไรก็ได้ — สะพานจะใช้คำสั่งใดก็ตามที่มันถูกเรียกใช้ครั้งล่าสุด)
App Home: เปิดแท็บ Messages และปล่อยให้เขียนได้ เพื่อให้สมาชิกส่งข้อความส่วนตัวหาบอทได้
โทเค็น: สร้างโทเค็นระดับแอปที่มี connections:write แล้วติดตั้งแอปและคัดลอกโทเค็น OAuth ของผู้ใช้บอท
เชื่อมต่อ
หัวข้อที่มีชื่อว่า “เชื่อมต่อ”- ไปที่ การตั้งค่า → เวิร์กสเปซ → ทั่วไป แล้วเลื่อนไปที่การ์ด สะพานแชท
- ในบล็อก Slack คลิก เชื่อมต่อ Slack
- กรอกฟิลด์ต่าง ๆ:
| ฟิลด์ | ค่า | อยู่ที่ไหนใน Slack |
|---|---|---|
| โทเค็น OAuth ของผู้ใช้บอท | xoxb-… |
OAuth & Permissions → Bot User OAuth Token |
| โทเค็นระดับแอป | xapp-… |
Basic Information → App-Level Tokens (connections:write) |
| โทเค็นรีเฟรชการตั้งค่าแอป (ไม่บังคับ) | xoxe-… |
คู่โทเค็นการตั้งค่าแอปบน api.slack.com/apps |
คำนำหน้าของแต่ละค่าถูกตรวจสอบทั้งสองฝั่งก่อนจะส่งอะไรออกไป ค่าที่วางผิดช่องจึง ถูกปฏิเสธด้วยประโยคเดียวกันไม่ว่าจะทางไหน
- คลิก เชื่อมต่อ
Control Center ตรวจสอบโทเค็นบอทด้วย auth.test ของ Slack ก่อน จะเก็บอะไรลงไป การพิมพ์ผิดจึงถูกรายงานให้คุณทราบ แทนที่จะกลายเป็น socket ที่ไม่ทำงานอย่างเงียบ ๆ ส่วนโทเค็นระดับแอปพิสูจน์ได้ด้วยการเปิด socket เท่านั้น โทเค็นที่ผิดจึงปรากฏขึ้นสักครู่ถัดมาเป็นข้อผิดพลาดการเชื่อมต่อบนแถวเดียวกัน
หากไม่มีโทเค็นการตั้งค่าแอป (ไม่บังคับ) การเชื่อมต่อก็ทำงานได้ปกติ — คุณเพียงแต่แก้ไขบอทจาก Control Center ไม่ได้
การเชื่อมต่อทำอะไรบ้าง
หัวข้อที่มีชื่อว่า “การเชื่อมต่อทำอะไรบ้าง”- เก็บข้อมูลรับรองไว้ในไดเรกทอรีของเวิร์กสเปซเอง ข้าง ๆ ฐานข้อมูลของมัน อ่านได้เฉพาะเจ้าของ ข้อมูลเหล่านี้ไม่เคยเดินทางกลับไปยังไคลเอนต์
- เปิดการเชื่อมต่อ Socket Mode หนึ่งรายการสำหรับเวิร์กสเปซนี้ และเริ่มรับการกล่าวถึง คำตอบในเธรด Slack ข้อความส่วนตัว และคำสั่งสแลช
- ตั้งเธรด Slack ทุกเธรดที่เคยเชื่อมไว้ให้พร้อมอีกครั้ง การเชื่อมต่อใหม่จึงทำบทสนทนาที่มีอยู่ต่อ แทนที่จะทิ้งมันไว้อย่างไร้ที่ไป
- ไม่มีค่าใช้จ่ายสำหรับเวิร์กสเปซที่ไม่มีแอปแชท: ไม่มี socket ไม่มีตัวจับเวลา ไม่มีทราฟฟิก
ตรวจสอบ
หัวข้อที่มีชื่อว่า “ตรวจสอบ”แถว Slack แสดงแท็กสถานะ: สด, กำลังเชื่อมต่อ…, ข้อผิดพลาดการเชื่อมต่อ (พร้อมข้อผิดพลาดของ Slack เองอยู่ข้าง ๆ) หรือ ยังไม่เชื่อมต่อ วิธีตรวจสอบแบบครบวงจร:
- ใน Slack เชิญบอทเข้าช่อง:
/invite @your-bot-name - กล่าวถึงมันพร้อมคำขอ
- คำตอบในเธรด Slack ปรากฏขึ้น และสเปซที่ตรงกันก็ปรากฏใน Control Center
สมาชิกทุกคนที่ต้องการใช้สะพานจะลิงก์บัญชีของตัวเองในภายหลัง — ดู เชื่อมบัญชี Slack ของคุณ
คำตอบหน้าตาเป็นอย่างไรใน Slack
หัวข้อที่มีชื่อว่า “คำตอบหน้าตาเป็นอย่างไรใน Slack”เหนือคำที่สตรีมขึ้นมาเป็นคำ ๆ นั่งอยู่คือการ์ดที่จัดกลุ่มไว้ใบเดียว โดยมีหนึ่งแถวต่อหนึ่งขั้นตอน การตั้งค่าเป็นแถวเดียวที่ชื่อเปลี่ยนจาก Working on it… เป็น Cloning … แล้วเป็น Starting the agent… การใช้เหตุผลเพิ่มแถว Thinking… เมื่อขั้นตอนนั้นจบลง ความคิดสั้น ๆ อาจปรากฏบนแถวนั้น แต่ละเครื่องมือมีแถวของตัวเอง (Read lib/main.dart) คำตอบมาเป็นข้อความธรรมดาใต้การ์ด การ์ดจะกลายเป็นสถานะสมบูรณ์เมื่อเทิร์นจบ และเป็นสถานะผิดพลาดเมื่อการรันล้มเหลว ถูกขัดจังหวะ หรือชนขีดจำกัดเทิร์นของมัน
การ์ดเริ่มทันทีที่บอทตอบรับการกล่าวถึง — Working on it… — เธรด Slack จึงไม่เงียบระหว่างที่เวิร์กสเปซยังถูกสร้างอยู่ การกล่าวถึงครั้งแรกของคุณในช่อง Slack จะสร้างบทสนทนา ซึ่งโคลนรีโปที่เอเจนต์ทำงานอยู่ แถวการตั้งค่านั้นจึงอ่านว่า Cloning acme/widgets… แล้ว Setting up Reviewer… แล้ว Starting the agent… แล้วตามด้วยแถว Thinking… เมื่อเอเจนต์ใช้เหตุผลจริง ๆ บนรีโปขนาดใหญ่ การตั้งค่าครั้งแรกนั้นใช้เวลาสักพัก การ์ดคือสิ่งที่ทำให้คุณรู้ว่ามันกำลังทำงานอยู่ แทนที่จะเพิกเฉยคุณ การกล่าวถึงครั้งต่อ ๆ ไปในเธรด Slack เดียวกันยังเปิดด้วย Working on it… แล้วข้ามขั้นตอนโคลนไป เพราะเวิร์กสเปซมีอยู่แล้ว
การใช้เหตุผลในรูปกำแพงข้อความและเอาต์พุตของเครื่องมือไม่เคยออกจาก Control Center — ความคิดบนแถว Thinking… คือบรรทัดสั้น ๆ ไม่ใช่บันทึกทั้งฉบับ View in Control Center บนการ์ดจะเปิดบทสนทนาฉบับเต็มในแอปเดสก์ท็อป — ลิงก์จะไปที่เซิร์ฟเวอร์ Control Center ของคุณเอง ซึ่งส่งต่อเบราว์เซอร์ให้แอป
หากไม่มีอะไรเกิดขึ้นเมื่อคุณคลิก แสดงว่าเซิร์ฟเวอร์ที่ส่งข้อความนั้นเข้าถึงไม่ได้จากเครื่องที่คุณคลิก (เช่น เซิร์ฟเวอร์ที่เข้าถึงได้เฉพาะผ่าน loopback แล้วคลิกจากโทรศัพท์) หรือ Control Center ไม่ได้รันอยู่ที่นั่น เซิร์ฟเวอร์ที่ไม่มีที่อยู่ซึ่งเข้าถึงได้จะส่งการ์ดที่ไม่มีปุ่ม แทนที่จะส่งการ์ดที่พาไปที่ไหนไม่ได้
หมุนเวียนโทเค็น
หัวข้อที่มีชื่อว่า “หมุนเวียนโทเค็น”วางค่าใหม่ในไดอะล็อกเชื่อมต่อแล้วคลิก เชื่อมต่อ การเชื่อมต่อจะเข้ามาแทนที่การเชื่อมต่อใดก็ตามที่รันอยู่สำหรับเวิร์กสเปซนี้ socket จึงถูกต่อใหม่ด้วยข้อมูลรับรองชุดใหม่
โทเค็นที่จำเป็นสองตัวต้องมีอยู่ทุกครั้งที่เชื่อมต่อ ส่วนโทเค็นการตั้งค่าแอป (ไม่บังคับ) จะเก็บค่าเดิมไว้เมื่อคุณเว้นช่องว่าง การหมุนเวียนโทเค็นบอทจึงไม่ทำให้คุณสูญเสียความสามารถในการแก้ไขแอป
ยกเลิกการเชื่อมต่อ
หัวข้อที่มีชื่อว่า “ยกเลิกการเชื่อมต่อ”คลิก ยกเลิกการเชื่อมต่อ บนแถว Slack (แอดมินเท่านั้น) socket จะปิดลงและข้อมูลรับรองจะถูกลืม
ลิงก์ของสเปซและผู้ใช้ตั้งใจให้คงอยู่: การเชื่อมต่อแอปเดิมใหม่จะกู้คืนเธรด Slack ทุกเธรดที่เชื่อมไว้ มันเป็นแถวที่ผูกกับเวิร์กสเปซ การลบเวิร์กสเปซจึงลบมันไปอยู่ดี
การแก้ปัญหา
หัวข้อที่มีชื่อว่า “การแก้ปัญหา”แถวระบุว่า “ข้อผิดพลาดการเชื่อมต่อ”
หัวข้อที่มีชื่อว่า “แถวระบุว่า “ข้อผิดพลาดการเชื่อมต่อ””อ่านข้อผิดพลาดที่แสดงข้างแท็ก ข้อมูลรับรองที่ถูกปฏิเสธ (invalid_auth, not_authed, token_revoked, account_inactive) ถือเป็นจุดสิ้นสุด — สะพานหยุดลองใหม่และรอโทเค็นชุดใหม่ เพราะการลองโทเค็นที่ถูกเพิกถอนซ้ำไม่รู้จบมีแต่จะทำให้คุณถูกจำกัดอัตรา วางโทเค็นใหม่ในไดอะล็อกเชื่อมต่อ
ข้อผิดพลาด missing_scope หมายความว่าแอปถูกติดตั้งด้วยสโคปน้อยกว่าที่สะพานต้องการ เพิ่มสโคปที่ขาดไป ติดตั้งแอปใหม่ใน Slack แล้วเชื่อมต่อใหม่
สิ่งใดก็ตามที่เป็นเพียงชั่วคราว (socket หลุด Slack สะดุด) จะเชื่อมต่อใหม่เองด้วย exponential backoff ที่มีเพดาน 30 วินาที และการหมุน socket ตามปกติของ Slack จะไม่ทำให้ backoff นั้นเพิ่มระดับ
บอทไม่ตอบการกล่าวถึง
หัวข้อที่มีชื่อว่า “บอทไม่ตอบการกล่าวถึง”- บอทอยู่ในช่องหรือยัง? Slack ส่งข้อความในช่องให้เฉพาะแอปที่เป็นสมาชิกเท่านั้น รัน
/invite @your-bot-name - คุณถูกลิงก์แล้วหรือยัง? สมาชิกที่ยังไม่ได้ลิงก์จะได้รับคำตอบในเธรด Slack นั้นซึ่งอธิบายวิธีลิงก์ ดู เชื่อมบัญชี Slack ของคุณ
- คุณเป็นสมาชิกของเวิร์กสเปซที่มีบทบาทเขียนหรือไม่?
viewerหรือguestจะได้รับแจ้งว่าบทบาทของตนเป็นแบบอ่านอย่างเดียว สะพานไม่เคยเริ่มงานแทนคนที่มันระบุที่มาไม่ได้ - เวิร์กสเปซมีเอเจนต์หรือยัง? หากไม่มีเอเจนต์ ข้อความจะถูกเก็บไว้แต่ไม่มีใครตอบมัน
มันตอบในช่องแต่ไม่สนใจข้อความธรรมดา
หัวข้อที่มีชื่อว่า “มันตอบในช่องแต่ไม่สนใจข้อความธรรมดา”นี่เป็นเจตนา นอกเหนือจากข้อความส่วนตัว สะพานจะทำงานเฉพาะกับข้อความที่กล่าวถึงบอท หรือการตอบกลับในเธรด Slack ที่มันเป็นเจ้าของอยู่แล้ว ที่เหลือคือบทสนทนาของคนอื่น
คำตอบมาเป็นข้อความก้อนใหญ่ก้อนเดียวแทนที่จะสตรีม
หัวข้อที่มีชื่อว่า “คำตอบมาเป็นข้อความก้อนใหญ่ก้อนเดียวแทนที่จะสตรีม”แถวระบุว่า “สตรีมสดปิดสำหรับแอป Slack นี้ — คำตอบมาเป็นข้อความเดียว” คำตอบแบบสตรีมของ Slack ต้องใช้ฟีเจอร์ Agents & AI Apps บนแพ็กเกจแบบเสียเงิน เมื่อ Slack ปฏิเสธ สะพานจะหยุดขอไปตลอดอายุการเชื่อมต่อนั้น และโพสต์คำตอบเต็มแทน ไม่มีอะไรสูญหาย — บันทึกฉบับเต็มอยู่ใน Control Center เสมอ
การสตรีมยังต้องมีจุดยึดเธรดใน Slack คำตอบที่ไม่มีเธรด Slack ให้งอกขึ้นมาจึงถูกโพสต์เต็ม การ์ดงานยังมาถึงทั้งสองกรณี: สำหรับคำตอบเต็ม มันติดไปกับข้อความเดียวกันและสมบูรณ์อยู่แล้ว
คำตอบไม่มีการ์ดอยู่ด้านบน
หัวข้อที่มีชื่อว่า “คำตอบไม่มีการ์ดอยู่ด้านบน”การ์ดงานของ Slack เป็นส่วนหนึ่งของพื้นผิว Agents & AI Apps ชุดใหม่เดียวกันกับการสตรีม และ Slack จะปฏิเสธเฉพาะตอนเรียกใช้ เมื่อเป็นเช่นนั้น Control Center จะเก็บคำตอบไว้และทิ้งการ์ดไปตลอดอายุการเชื่อมต่อนั้น — คำตอบที่ไม่มีบรรทัดสถานะดีกว่าบรรทัดสถานะที่ไม่มีคำตอบ
“Control Center ต้องมีโทเค็นการตั้งค่าแอปเพื่อแก้ไขบอท”
หัวข้อที่มีชื่อว่า ““Control Center ต้องมีโทเค็นการตั้งค่าแอปเพื่อแก้ไขบอท””แถว ปรับแต่งบอท ถูกปิดใช้งานเพราะการเชื่อมต่อไม่มีโทเค็นการตั้งค่าแอป นี่เป็นเรื่องที่คาดหมายได้สำหรับแอปที่สร้างด้วยตัวเองหรือสร้างผ่าน สร้างใน Slack — Slack ไม่เคยบอก Control Center ว่ามันคือแอปใด สร้างคู่โทเค็นที่ api.slack.com/apps แล้วเชื่อมต่อใหม่โดยกรอกโทเค็น refresh
คำตอบยาวถูกตัด
หัวข้อที่มีชื่อว่า “คำตอบยาวถูกตัด”Slack จำกัดข้อความเดียวไว้ที่ 40,000 ตัวอักษร สะพานจึงตัดที่ 39,000 แล้วต่อท้ายด้วยตัวชี้ไปยัง Control Center — คำตอบที่สั้นลงดีกว่าคำตอบที่ Slack ปฏิเสธทันที ข้อความฉบับเต็มอยู่ในทรานสคริปต์ของสเปซเสมอ