この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
大阪オフィスの岡田です。
皆さんはSlackで分報やってますか? 私は悩みを呟ける場所が欲しくなって最近始めました。
やり始めると、
- Slackアプリに毎回移動するのがめんどくさいなぁ
- Slackの雑談部屋が気になるなぁ
- 分報を投稿するために作業の手がとまってしまう...
という気持ちが出てきます。本当はもっと楽に、作業中の思考を止めずに気楽にポイポイポストしたいです。
車輪の再発明
MacだとAlfredから分報がポストできたら上記の悩みが解決できそう! 少し調べるとAlfredからSlackに投稿するやり方はいくつかヒットするのですが、この程度の車輪なら再発明(再開発)してみたいですよね。というわけで作ることにしました。
Alfredのワークフローでは複数の開発言語をサポートしていますが、今回はGo言語でSlackへ投稿するスクリプトを書き、それをzshスクリプトから呼び出すという方式にしています。 わざわざGoで書く理由ですが、普段業務ではScalaを書く事が多いので
Goで書いてみたい
という理由です。それ以外にはありません。
まずは成果物
t [テキスト]
で、テキストを投稿します。
投稿するためにSlackアプリに移動しなくていいので楽です!
前提
- Slackのアプリを新規作成し、トークンを取得しておく
- Bolt入門ガイド がわかりやすいです
トークンとアプリのインストール
まででOK- 権限は
char:write
に設定します
- AlfredのPowerpackを購入する
- 無償版ではワークフローが使えなかったので、今回課金しました
コード
まずSlackに投稿するスクリプトです。
package main
import (
"flag"
"fmt"
"log"
"net/http"
"net/url"
"strings"
"time"
)
type Config struct {
Token string `json:"token"`
Channel string `json:"channel"`
}
func main() {
postUrl := "https://slack.com/api/chat.postMessage"
// コマンドライン引数からメッセージを取得
token := flag.String("t", "", "oAuth token of slack app")
channel := flag.String("c", "", "slack channel name")
text := flag.String("m", "", "chatting text message")
flag.Parse()
if len(*token) > 0 && len(*text) > 0 && len(*channel) > 0 {
values := url.Values{}
values.Add("token", *token)
values.Add("channel", *channel)
values.Add("text", *text)
client := http.Client{Timeout: time.Duration(10) * time.Second}
req, err := http.NewRequest("POST", postUrl, strings.NewReader(values.Encode()))
if err != nil {
log.Fatal(err)
panic(err)
}
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
res, err := client.Do(req)
if err != nil {
log.Fatal(err)
panic(err)
}
defer res.Body.Close()
} else {
err := fmt.Sprintf("not set param. (t=%s, c=%s, m=%s)", *token, *channel, *text)
log.Fatal(err)
panic(err)
}
}
スクリプトがコピーできたらgoのコマンドビルドし、実行ファイルを作成します。
ビルドした実行ファイルは post-to-slack
とします。
次にAlfredのワークフローです。
エラー時にMacの通知にメッセージを表示するために、フローの最後にサイドバーの通知を入れています。
最後にワークフローの真ん中になるbashスクリプトです。
#!/bin/zsh
PATH=$PATH:~/work/go/times-okaryu/bin #実行ファイルのパスを追加
token="[Slackのトークン]"
channel="#[チャンネル名]"
text="{query}"
post-to-slack -t $token -c $channel -m "$text"
上記をAlfredのワークフローにコピペします。
token
はSlackアプリで取得したトークン。 channel
はポストしたいチャンネル名です。
{query}
にAlfredで入力したテキストが入ります。
post-to-slack
に必要なコマンドラインパラメータを渡して実行してやると、前述のGo製のスクリプトが実行され、SlackのAPIを叩きます。
まとめ
Alfredから投稿できるようになったので、プログラミング途中だろうが、ブログを書いていようが、Zoomで会議中だろうがサクッと投稿できてしまいます。ScalaもGoも楽しい。