Use the official slack-go/slack library to interact with the Slack API, as it handles authentication, rate limiting, and JSON serialization automatically. You initialize a client with your bot token, then call methods like PostMessage or GetUsers to perform actions without writing raw HTTP requests.
First, install the library via go get:
go get github.com/slack-go/slack
Here is a practical example of posting a message to a channel and handling a simple interaction:
package main
import (
"fmt"
"log"
"github.com/slack-go/slack"
)
func main() {
// Replace with your Bot User OAuth Token
token := "xoxb-your-bot-token-here"
api := slack.New(token)
// Post a message to a specific channel
channelID := "C012AB3CD" // Replace with your channel ID
text := "Hello from Go! This is a test message."
ts, channel, timestamp, err := api.PostMessage(channelID, slack.MsgOptionText(text, false))
if err != nil {
log.Fatalf("Failed to post message: %v", err)
}
fmt.Printf("Message posted to channel %s at timestamp %s\n", channel, timestamp)
// Example: Get user info by ID
userID := "U012AB3CD"
user, err := api.GetUser(userID)
if err != nil {
log.Fatalf("Failed to get user: %v", err)
}
fmt.Printf("User %s is named %s\n", user.Name, user.Profile.RealName)
}
For interactive components like buttons or modals, you typically run a webhook listener. The library provides a slack.InteractionHandler to parse incoming JSON payloads from Slack. You must verify the request signature to ensure it actually came from Slack.
import (
"net/http"
"github.com/slack-go/slack"
)
func handleInteractions(w http.ResponseWriter, r *http.Request) {
// Verify the request signature using your signing secret
if !slack.VerifyRequest(r, "your-signing-secret") {
http.Error(w, "Bad request", http.StatusUnauthorized)
return
}
// Parse the interaction payload
var interaction slack.InteractionCallback
if err := json.NewDecoder(r.Body).Decode(&interaction); err != nil {
http.Error(w, "Bad request", http.StatusBadRequest)
return
}
// Handle the specific interaction type
switch interaction.Type {
case slack.InteractionTypeBlockActions:
// Handle button clicks or select menus
// You can update the message or send a new one based on the action
api := slack.New("xoxb-your-bot-token-here")
api.PostMessage(interaction.Channel.ID, slack.MsgOptionText("You clicked a button!", false))
}
}
Remember to set up your Slack App in the developer portal to generate the Bot Token and Signing Secret. Ensure your app has the necessary scopes (e.g., channels:write, users:read) enabled. The library automatically handles retries and exponential backoff for rate limits, but you should still check error responses for specific Slack API errors like rate_limited.