LoginSignup
3
5

More than 5 years have passed since last update.

レガシーじゃない Slack API のたたきかた

Last updated at Posted at 2017-04-25

追記
Bot user 作るだけならわざわざアプリケーション作らずに Bot で十分とコメントもらいましたので追記致します。
他の人の投稿したファイルを削除したい、とか細かい権限が必要なときは App がよいかと思います。

org
前の Generate test tokens から作る bot がレガシーレガシー言われて久しいです。
なので新しいやり方はじめました。
簡単でした。

まず Create an App から新しい Slack アプリケーションを作成します。

Slack API: Applications | Slack

スクリーンショット 2017-04-25 10.47.04.png


適宜入力。

2_スクリーンショット_2017-04-25_10_47_40.png


追加されます。

そのあと該当アプリケーションをクリックして、左のメニューから OAuth & Permissions を選択。
Permission Scopes をいくつか選びます。
なんか bot ってのしたらダメだったのでとりあえずメッセージおくれれば良いので、 chat:write:bot を追加。↓
※ちゃんとした bot Permission の使い方は公式ドキュメントには書いてる

スクリーンショット 2017-04-25 10.49.35.png

上の方に Install Team 的なのあるのでそこから Install、Authentication します。
すると、Tokens for Your Team として OAuth Access Token が発行されます。
あとはこれで API を利用して好きなことします。

golang sample code

package main

import (
    "strings"
    "net/http"
    "net/url"
)

/*
    Slack にメッセージを送信します。
*/
func sendSlack(title, msg string) bool {
    requestUrl := "https://slack.com/api/chat.postMessage"
    postData := map[string]string{
        "token":   "xoxp-XXX-XXX-XXXXXX-XXXXXXXXX",
        "channel": "err_replication_bot",
        "text":    title + "\n```" + msg + "```",
    }
    _, err := requestHttp(requestUrl, "post", nil, postData, nil, "")
    if err != nil {
        return false
    }
    return true
}

func requestHttp(requestUrl string, method string, getParam map[string]string, postParam map[string]string, cookie *http.Cookie, userAgent string) (*http.Response, error) {
    var req *http.Request
    var err error
    if strings.ToLower(method) == "post" {
        values := url.Values{}
        if postParam != nil {
            for key, val := range postParam {
                values.Add(key, val)
            }
        }
        req, err = http.NewRequest("POST", requestUrl, strings.NewReader(values.Encode()))
        if err != nil {
            return nil, err
        }
    } else if strings.ToLower(method) == "get" {
        req, err = http.NewRequest("GET", requestUrl, nil)
        if err != nil {
            return nil, err
        }
    }
    // GET parameter
    if getParam != nil {
        values2 := url.Values{}
        for key, val := range getParam {
            values2.Add(key, val)
        }
        req.URL.RawQuery = values2.Encode()
    }
    // Request Header
    if strings.ToLower(method) == "post" {
        req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
    }
    if userAgent != "" {
        req.Header.Add("User-Agent", userAgent)
    } else {
        req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; MAFSJS; rv:11.0) like Gecko")
    }
    if cookie != nil {
        req.AddCookie(cookie)
    }
    // 自動リダイレクトのオフ
    client := http.Client{
        // Go HTTP Client NOT Follow Redirects Automatically.
        CheckRedirect: func(req *http.Request, via []*http.Request) error {
            return http.ErrUseLastResponse
        },
    }
    return client.Do(req)
}

おわり。

3
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5