OpenClaw๋ฅผ Slack์ ์ฐ๊ฒฐํ๊ธฐ
Slack ์ํฌ์คํ์ด์ค์ OpenClaw๋ฅผ ์ถ๊ฐํ์ธ์. ์ฌ๋์ ๋ช ๋ น์ด ์ง์์ผ๋ก ์ฑ๋, ์ค๋ ๋ ๋๋ DM์์ AI ์ง์์ ๋ฐ์ผ์ธ์.
- โWebSocket ์ฐ๊ฒฐ โ Slack Bot API + Socket Mode๋ฅผ ํตํ ์ค์๊ฐ ๋ฉ์์ง
- โ์ฌ๋์ ๋ช ๋ น์ด โ ๋ค์ดํฐ๋ธ /clawd ๋ช ๋ น์ด ์ธํฐํ์ด์ค
- โ์ค๋ ๋ ์ง์ โ ๊ธฐ๋ก ์ปจํ ์คํธ๋ก ๋ํ๋ฅผ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌ
- โํ๋ถํ ์์ โ ๋ฆฌ์ก์ ๊ณผ ํ์ด ์๋ ์์ํ๋ ์๋ต
- โ์ ์ฐํ ์ ๊ทผ โ DM, ๊ณต๊ฐ ์ฑ๋, ๋น๊ณต๊ฐ ์ฑ๋
- โขSlack Bot ํ ํฐ โ xoxb-...๋ก ์์
- โขSlack App ํ ํฐ โ xapp-...๋ก ์์ (Socket Mode์ฉ)
- โขSlack App โ ์ ์ ํ OAuth ์ค์ฝํ๊ฐ ์ค์ ๋ ์ฑ
์ค์ ๋จ๊ณ
Slack App ์์ฑ
Slack API ํฌํธ๋ก ์ด๋ํ์ฌ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋์ธ์:
- โข api.slack.com/apps ๋ฐฉ๋ฌธ
- โข "Create New App" ํด๋ฆญ
- โข "From scratch" ์ ํ
- โข ์ด๋ฆ ์ง์ (์: "OpenClaw") ๋ฐ ์ํฌ์คํ์ด์ค ์ ํ
Bot ํ ํฐ ์ค์ฝํ ์ถ๊ฐ
๋ด์ OAuth ๊ถํ์ ์ค์ ํ์ธ์:
- โข ์ฌ์ด๋๋ฐ์์ "OAuth & Permissions"๋ก ์ด๋
- โข "Bot Token Scopes"์์ ๋ค์์ ์ถ๊ฐ:
- - app_mentions:read โ ๋ฉ์ ์ฝ๊ธฐ
- - channels:history โ ์ฑ๋ ๋ฉ์์ง ๋ณด๊ธฐ
- - channels:read โ ์ฑ๋ ์ ๋ณด ๋ณด๊ธฐ
- - chat:write โ ๋ฉ์์ง ๋ณด๋ด๊ธฐ
- - im:history โ DM ๊ธฐ๋ก ๋ณด๊ธฐ
- - im:read โ DM ์ ๋ณด ๋ณด๊ธฐ
- - im:write โ DM ๋ํ ์์
- - reactions:write โ ๋ฆฌ์ก์ ์ถ๊ฐ
- - users:read โ ์ฌ์ฉ์ ์ ๋ณด ๋ณด๊ธฐ
Socket Mode ํ์ฑํ
Socket Mode๋ ๊ณต๊ฐ URL ์์ด ์ค์๊ฐ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค:
- โข ์ฌ์ด๋๋ฐ์์ "Socket Mode"๋ก ์ด๋
- โข "Enable Socket Mode" ํ ๊ธ ์ผ๊ธฐ
- โข connections:write ์ค์ฝํ๋ก App-Level ํ ํฐ ์์ฑ
- โข ํ ํฐ ๋ณต์ฌ (xapp-...๋ก ์์)
์ํฌ์คํ์ด์ค์ App ์ค์น
์ฑ์ ์ค์นํ๊ณ Bot ํ ํฐ์ ๋ฐ์ผ์ธ์:
- โข ์ฌ์ด๋๋ฐ์์ "Install App"์ผ๋ก ์ด๋
- โข "Install to Workspace" ํด๋ฆญ
- โข ์์ฒญ๋ ๊ถํ ์น์ธ
- โข Bot User OAuth ํ ํฐ ๋ณต์ฌ (xoxb-...๋ก ์์)
OpenClaw ์ค์
openclaw.json์ Slack ์ค์ ์ ์ถ๊ฐํ์ธ์:
{
"channels": {
"slack": {
"enabled": true,
"botToken": "xoxb-...",
"appToken": "xapp-..."
}
}
}์ฑ๋์ ๋ด ์ด๋
๋ด์ด ์๋ตํ ์ฑ๋์ ๋ด์ ์ถ๊ฐํ์ธ์:
- โข Slack์์ ์ฑ๋ ์ด๊ธฐ
- โข /invite @OpenClaw ์ ๋ ฅ
- โข ๋๋ ์ฑ๋ ์ด๋ฆ ํด๋ฆญ -> ํตํฉ -> ์ฑ ์ถ๊ฐ
- โข openclaw restart๋ก OpenClaw๋ฅผ ์ฌ์์ํ๊ณ ๋ด์ ๋ฉ์ ํ์ฌ ํ ์คํธํ์ธ์.
์ค๋ ๋ ์ง์
์ค์ ๊ฐ๋ฅํ ๊ธฐ๋ก ๋ฒ์๋ก ์ค๋ ๋ ๋ด ๋ํ ์ปจํ ์คํธ ์ ์ง.
์ด๋ชจ์ง ๋ฆฌ์ก์
๋ด์ด ๋ฉ์์ง ํ์ธ ๋๋ ์ํ ํ์๋ฅผ ์ํด ๋ฆฌ์ก์ ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋ฉ์์ง ๊ณ ์
๋์ค์ ์ฝ๊ฒ ์ฐธ์กฐํ ์ ์๋๋ก ์ค์ํ ์๋ต์ ๊ณ ์ ํ์ธ์.
์ฌ๋์ ๋ช ๋ น์ด
์ด๋์๋ ๋น ๋ฅธ AI ์ฟผ๋ฆฌ๋ฅผ ์ํด /clawd๋ฅผ ์ฌ์ฉํ์ธ์.
๋ฉค๋ฒ ์ ๋ณด
ํ์ํ ๋ ์ํฌ์คํ์ด์ค ๋ฉค๋ฒ ์ ๋ณด๋ฅผ ์กฐํํ์ธ์.
DM ์ง์
๋ด๊ณผ์ ๋น๊ณต๊ฐ 1:1 ๋ํ.
Slack ํตํฉ์ ์ํ ์ ์ฒด ์ค์ ์ต์ :
{
"channels": {
"slack": {
"enabled": true,
"botToken": "xoxb-...",
"appToken": "xapp-...",
"dm": {
"enabled": true,
"policy": "pairing",
"allowFrom": ["U123", "U456"]
},
"channels": {
"#general": {
"allow": true,
"requireMention": true,
"users": ["U123"]
}
},
"historyLimit": 50,
"slashCommand": {
"enabled": true,
"name": "clawd"
},
"actions": {
"reactions": true,
"messages": true,
"pins": true
}
}
}
}dm.enabledโ ๋ด์ ๋ํ ์ง์ ๋ฉ์์ง ํ์ฉdm.policyโ DM ์ ๊ทผ ์ ์ฑ ("pairing" ๋๋ "open")dm.allowFromโ DM์ด ํ์ฉ๋ ์ฌ์ฉ์ ID ๋ฐฐ์ดchannelsโ ์ฑ๋๋ณ ์ค์ ๊ฐ์ฒดrequireMentionโ @๋ฉ์ ๋ ๋๋ง ์๋ตhistoryLimitโ ์ปจํ ์คํธ์ ํฌํจํ ๋ฉ์์ง ์slashCommandโ ์ฌ๋์ ๋ช ๋ น์ด ์ค์ ๊ตฌ์ฑactionsโ ๋ฆฌ์ก์ , ๋ฉ์์ง, ํ ํ์ฑํ/๋นํ์ฑํ
ํ์ฉ ๋ชฉ๋ก ๋ชจ๋
๋ช ์์ ์ผ๋ก ์ค์ ๋ ์ฑ๋์์๋ง ์๋ต. ํต์ ๋ ํ๊ฒฝ์ ์ ํฉ.
์คํ ๋ชจ๋
๋ด์ด ์ด๋๋ ๋ชจ๋ ์ฑ๋์์ ์๋ต. requireMention์ผ๋ก ์๋ต์ ์ ์ดํ์ธ์.
ํ๋กํ์์:
์ฌ์ฉ์ ์ด๋ฆ ํด๋ฆญ -> ํ๋กํ ๋ณด๊ธฐ -> ์ ์ธ ๊ฐ(...) ํด๋ฆญ -> ๋ฉค๋ฒ ID ๋ณต์ฌ
Slack ๊ด๋ฆฌ์์์:
์ํฌ์คํ์ด์ค ์ค์ -> ๋ฉค๋ฒ ๊ด๋ฆฌ -> ๋ฉค๋ฒ ๋ชฉ๋ก์ CSV๋ก ๋ด๋ณด๋ด๊ธฐ
์ฑ๋์์ ๋ด์ด ์๋ตํ์ง ์๋์?
๋ด์ด ์ฑ๋์ ์ด๋๋์๊ณ ์ฌ๋ฐ๋ฅธ ์ค์ฝํ๊ฐ ์๋์ง ํ์ธํ์ธ์. requireMention์ด ํ์ฑํ๋์ด ์๋์ง ํ์ธํ์ธ์.
Socket Mode ์ฐ๊ฒฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋์?
App ํ ํฐ(xapp-...)์ด ์ฌ๋ฐ๋ฅด๊ณ connections:write ์ค์ฝํ๊ฐ ์๋์ง ํ์ธํ์ธ์.
์ฌ๋์ ๋ช ๋ น์ด๊ฐ ํ์๋์ง ์๋์?
Slack ์ฑ ์ค์ ์์ "Slash Commands"๋ก ์ด๋ํ์ฌ Socket Mode๋ฅผ ๊ฐ๋ฆฌํค๋ ๋ช ๋ น์ด๋ฅผ ์๋์ผ๋ก ๋ง๋์ธ์.
๊ถํ ๊ฑฐ๋ถ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋์?
์ ์ค์ฝํ๋ฅผ ์ถ๊ฐํ ํ ์ํฌ์คํ์ด์ค์ ์ฑ์ ๋ค์ ์ค์นํ์ธ์. ์ผ๋ถ ์ค์ฝํ ๋ณ๊ฒฝ์ ์ฌ์ค์น๊ฐ ํ์ํฉ๋๋ค.
Slack ์ฐ๊ฒฐ ์๋ฃ!
์ด์ ๋ ๋ง์ ์ฑ๋์ ์ค์ ํ๊ฑฐ๋ ๋ง์ถค ์คํฌ๋ก ๋ด์ ํฅ์์ํค์ธ์.