ちなみに

火曜日の空は僕を押しつぶした。

AppleScriptでSlackの特定チャネルに定型文を投稿する

Slackの特定のチャネルを開いて定型文を入力したい。具体的にはAPIでは発火できないスラッシュコマンドを実行したい。

特定のチャネルを開く簡単な方法は、Slackアプリに用意されている Deep Link を使うことです。 この場合は slack://channel を使うと目的を達成できます。試すには open slack://channel?team=<チームID>&id=<チャネルID> みたいにすると良い。 IDはWeb版で目的にチャネルを開くとURLに含まれているので、2つ合わせてゲットするにはそこからが速いかも。

AppleScript でこれを開くにはいくつか方法がありますが、今回は System Events を使います。 (System Events についてのドキュメントを発見できなかったのだけれど誰か教えてください。)

tell application "System Events"
    open location "slack://channel?team=<チームID>&id=<チャネルID>"
end tell

System Events を使ったのは文字入力をするための布石で keystroke を使っていきます。 keystroke "Hello" のようにすると、キーボードから Hello と入力したのと同様の結果が得られます。

tell application "System Events"
    keystroke "Hello"
end tell

ただしここで問題が生じます。キーストロークなので日本語をそのまま与えてもおかしなことになります。 キーボード操作を考えても、IMEをオンにして、文字を入力、変換して、確定という操作をしているので当然です。

そんな面倒なことを再現しないといけないのかというとそうでもなくて、クリップボードを使うと実現できます。

set the clipboard to "日本語でこんにちは"

tell application "System Events"
    keystroke "v" using {command down}
end tell

using {command down}Cmd を押しながら別のキーを押すを実現できます。 これで Cmd+v をして貼り付けすることが出来ます。

これらを組み合わせると以下のように特定のチャネルに定型文を投稿することが可能です。

ここでは ジョブカン のスラッシュコマンドを実行しています。 メッセージも入力したいので引数を受け取れるようにしました。

on run argv
    set message to item 1 of argv
    set the clipboard to "/jobcan_touch " & message

    tell application "System Events"
        open location "slack://channel?team=<チームID>&id=<チャネルID>"
        delay 1

        keystroke "v" using {command down}
        delay 0.5

        keystroke return
    end tell
end run

これで人力でやっていたチャネルを開いて、入力して、投稿の3ステップの操作が1ステップで完了できるようになりました。

べんりですね。