はじめに
おざわです。私が所属するデータアナリティクス事業本部では、お昼休みにはいる前に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の詳細はこちらをご確認ください
script-command.template.sh
#!/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スクリプトを起動するようにしています。
休憩入る宣言
start-lunch.sh
#!/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
休憩終わり宣言
done-lunch.sh
#!/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の取得方法については、冒頭のブログ記事をご参照ください。
lunch.py
#!/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に投稿できました。