Raycastでお昼のSlack投稿を楽にしてみた

RaycastからSlack投稿してみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

おざわです。私が所属するデータアナリティクス事業本部では、お昼休みにはいる前にSlackで宣言してから休憩に入ることになっています。いままでは普通にSlackアプリを開いてから、手で「お昼休憩入ります」のような投稿をしていましたが、こちらのブログを見て私も自動化したくなりました。

今回は上のブログと同じことをRaycastでやってみたので、方法を共有したいと思います。

Raycastについて

Raycastは超便利なランチャーツールです。 私自身は2週間ほど前に使い始めたばかりの初心者ですが、もはや手放せない状態です。

今回はこちらのScript Commandsを使ってSlackにメッセージを投稿するスクリプトを実行します。Python/Ruby/Node.js/Bash/Swift/Apple Scriptで書かれたプログラムなら実行できますので、プログラムさえ書いてしまえば数回キーボードを操作するだけで簡単に呼び出すことができます。

Script Commandsを使うまでの流れ

4ステップありますが、1が必要なのは最初の1回目だけです。

  1. Raycastでスクリプト用のディレクトリを設定
  2. 実行したいスクリプトを書く
  3. 1で設定したディレクトリに入れる
  4. 実行!

スクリプトにはタイトル等、いくつかパラメータを記載する必要があります。

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に投稿できました。

参考リンク