Raycastでお昼のSlack投稿を楽にしてみた
はじめに
おざわです。私が所属するデータアナリティクス事業本部では、お昼休みにはいる前にSlackで宣言してから休憩に入ることになっています。いままでは普通にSlackアプリを開いてから、手で「お昼休憩入ります」のような投稿をしていましたが、こちらのブログを見て私も自動化したくなりました。
今回は上のブログと同じことをRaycastでやってみたので、方法を共有したいと思います。
Raycastについて
Raycastは超便利なランチャーツールです。 私自身は2週間ほど前に使い始めたばかりの初心者ですが、もはや手放せない状態です。
今回はこちらのScript Commandsを使ってSlackにメッセージを投稿するスクリプトを実行します。Python/Ruby/Node.js/Bash/Swift/Apple Scriptで書かれたプログラムなら実行できますので、プログラムさえ書いてしまえば数回キーボードを操作するだけで簡単に呼び出すことができます。
Script Commandsを使うまでの流れ
4ステップありますが、1が必要なのは最初の1回目だけです。
- Raycastでスクリプト用のディレクトリを設定
- 実行したいスクリプトを書く
- 1で設定したディレクトリに入れる
- 実行!
スクリプトにはタイトル等、いくつかパラメータを記載する必要があります。
1. Raycastでスクリプト用ディレクトリを設定
RaycastのSettingを開いて「Extensions」をクリックします。 Script Commandsを選択して「Add Directories」をクリックして任意のディレクトリを指定します。
ディレクトリを指定するとBashスクリプトのテンプレートが作成されますので、これを参考に自分のスクリプトに必要なパラメータを設定します。とりあえず必要なものは次の3つになります。
- schemaVersion - 現状は1を指定します
- title - Raycastで検索する際に表示されるスクリプト名です
- mode - fulloutput, compact, silent, inlineから選べます。modeの詳細はこちらをご確認ください
#!/bin/bash # Raycast Script Command Template # # Duplicate this file and remove ".template." from the filename to get started. # See full documentation here: https://github.com/raycast/script-commands # # Required parameters: # @raycast.schemaVersion 1 # @raycast.title My First Script # @raycast.mode fullOutput # # Optional parameters: # @raycast.icon ? # @raycast.packageName Raycast Scripts echo "Hello from My First Script"
パラメータの詳細はこちらのドキュメントをご確認ください。
2. スクリプトを書く
手元の環境でpyenvを使っているので、Bashで仮想環境を有効にしてからSlack投稿用Pythonのスクリプトを呼び出しています。ご利用の環境によっては直接Raycastから引数を渡してPythonのスクリプトを起動することも可能です。
Arguments(引数)も試してみましたが、引数を打つのにタブで移動する必要がありました。なるべくタイピング回数を少なくして投稿したいので、休憩開始・休憩終了用で2つスクリプトを用意して、そこからSlack投稿用Pythonスクリプトを起動するようにしています。
休憩入る宣言
#!/bin/bash # Required parameters: # @raycast.schemaVersion 1 # @raycast.title start lunch # @raycast.mode compact # Optional parameters: # @raycast.icon ? # 環境に応じて変更 source /Path/to/envs/Raycast/bin/activate # 投稿されない場合はログを確認 python3 ./lunch.py start > lunch-script.log deactivate
休憩終わり宣言
#!/bin/bash # Required parameters: # @raycast.schemaVersion 1 # @raycast.title done lunch # @raycast.mode compact # Optional parameters: # @raycast.icon ? # 環境に応じて変更 source /Path/to/envs/Raycast/bin/activate # 投稿されない場合はログを確認 python3 ./lunch.py done > lunch-script.log deactivate
Slack投稿用のPythonスクリプトです。 TOKENやUSER_IDの取得方法については、冒頭のブログ記事をご参照ください。
#!/usr/bin/env python3 import sys import requests TOKEN = "YOUR_SLACK_TOKEN_HERE" USER_ID = "YOUR_SLACK_USER_ID_HERE" SLACK_MESSAGE_URL = "https://slack.com/api/chat.postMessage" SLACK_STATUS_URL = "https://slack.com/api/users.profile.set" def post_message(channel, message): headers = { "Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json; charset=utf-8", } payload = { "channel": channel, "text": message, "as_user": True, } send_request(SLACK_MESSAGE_URL, headers, payload) def change_status(emoji, message): headers = { "Authorization": f"Bearer {TOKEN}", "Content-Type": "application/json; charset=utf-8", "X-Slack-User": USER_ID, } payload = { "profile": { "status_emoji": emoji, "status_text": message, }, } send_request(SLACK_STATUS_URL, headers, payload) def send_request(url, headers, payload): try: response = requests.post( url, headers=headers, json=payload, ) response.raise_for_status() print(f"Status: OK") print(response.json()) except requests.exceptions.RequestException as e: print(f"RequestException: {e}") except Exception as e: print(f"Exception: {e}") def start_lunch(): emoji_ohiru = ":ohiru:" change_status(emoji_ohiru, "お昼休憩中") post_message("部門チャンネル","お昼休憩に入ります") # 複数投稿する場合 #post_message("個人のチャンネル", "お昼休憩に入ります") def done_lunch(): emoji_working = ":working:" change_status(emoji_working, "仕事中") post_message("部門チャンネル","お昼休憩終わります") # 複数投稿する場合 #post_message("個人のチャンネル", "お昼休憩終わります") if __name__ == "__main__": if sys.argv[1] == "start": start_lunch() elif sys.argv[1] == "done": done_lunch()
3. ディレクトリに保存
必要なパラメータが記載されていればRaycastが勝手に拾ってくれるので登録作業は不要です。
4. 実行!
Raycastを「option+スペースキー」で起動します。
「st」まで打つと設定したstart lunchが選択されるので、後はエンターキーを叩くだけです。
お昼休憩が終わったら同じように「do」までタイプしてエンターキーを叩きます。
無事、Slackに投稿できました。