やりたかったこと
各種作業を自動化するにあたり、Slackに投稿するためのコマンドが欲しかった。
しかもRubyでやりたかった
できたもの
ターミナルなどでこうすると
こうなる
やり方
Slackに書き込むコードを書く
$ mkdir slack # 作業ディレクトリ。任意の名前。
$ rbenv local 2.3.1 # rbenvでRubyを管理している場合
$ bundle init # BundlerでGemを管理したい場合
$ vim Gemfile
Gemのslack-api
とdotenv
(環境変数を管理)を入れます
source "https://rubygems.org"
gem 'slack-api'
gem 'dotenv'
Gemをインストール
$ bundle install --path vendor/bundle
こんな感じのファイル構成になるはずです
.bundle
.ruby-version
Gemfile
Gemfile.lock
vendor
コードはこんな感じに。
アクセストークンは開発用にはこちら(https://api.slack.com/docs/oauth-test-tokens )、本番用にはこちら(https://my.slack.com/services/new/bot )を使うといいようです。
開発用のアクセストークンが簡単に取れるのが嬉しい。
require 'slack'
require 'dotenv'
Dotenv.load #.envファイルを読み込み
message = ARGV[0]
channel_name = ARGV[1] || 'my_channel'
Slack.configure do |config|
config.token = ENV['SLACK_API_TOKEN']
end
Slack.chat_postMessage(text: message, channel: channel_name)
.evn
ファイルを作って、同じディレクトリに配置します。
SLACK_API_TOKEN=##トークンに置き換える##
ファイル構成は今こんな感じになっているはず
.bundle
.env
.ruby-version
Gemfile
Gemfile.lock
main.rb
vendor
試しに実行してみましょう
$ bundle exec ruby main.rb Hello my_channel
#my_channel
にHelloと書き込まれれば成功です。
もっとオプションを受け取ったりしてコマンドっぽくしたい場合はGemのThor
などを使うといいでしょう。
コマンド化する
これをどこからでも単にslack
とするだけで呼び出せるようにしたいです。
rbenvやBundlerを使っていなければ、パスが通ってるところから単にスクリプトにシンボリックリンクなどを張るだけでいいのですが今回はそうではありません。
いろいろなやり方がありますが、私は~/bin
にPATHを通してそこからシェルスクリプトで呼び出すという方法でやります。
#!/bin/bash
if [ $# -ne 1 ]; then
echo "テキストを引数として渡してください" 1>&2
exit 1
fi
cd ~/projects/slack
bundle exec ruby main.rb $1 $2
こんな感じのスクリプトを書いて~/bin
に配置します。
実行権限をつけるのを忘れずに。
$ chmod +x slack
最後にパスを通します。.bash_profile
などに追記しましょう。
export PATH=$PATH:~/bin
とすれば、どこからでもslack
とするだけで呼び出せるようになります。
次のステップ
せっかくコマンドにしたので標準入力も受け取れるようにしたいですね。