Slack でステータス(ログイン状態)を常にオンライン(アクティブ)にする

Slack では 30 分放置すると強制的に Away(離席中) になってしまう。この挙動を変えることはできない。これは「離席中であることをシステムが保証してくれる」点では素晴らしいが、離席しているのがバレるというデメリットもある。というわけで、でもないのだが、離席中にならないようにする方法を考えてみた。

最初に結論

  • Slack の設定上からは(REST API を使っても)実現できない
  • 常にアクティブを実現したいなら、(30分未満の頻度で活動を行う)ツールやスクリを仕込むしかない
  • で、できたの?
    • Ans: 一応できたっぽい
    • AutoHotkey で「Slack のブラウザウィンドウの定期的なアクティブ化を自動化する」でいけた

まずは仕様をまとめとく

ステータスとログイン状態

Slack の用語では

  • ステータス(Status)
  • ログイン状態(Availability)

の二つがある。

ステータスとは「会議中」や「病欠」など、自分で任意に設定できる テキスト

ログイン状態は アクティブ(Active) or 離席中(Away)のいずれか二値を取る状態

本記事でいうステータスとは後者、ログイン状態のこと。以降では「ログイン状態」という呼称を使うことにする。

ログイン状態の仕様

一言で:

  • Slack の仕様なので 変更や停止は不可能
  • 30分 未活動だと離席中(Away) になる

Slack のステータスを設定する – Slack によると、離席中と判断されるのは、

  • デスクトップの場合、『非アクティブ状態が 30 分間続いた』
  • Webブラウザの場合、『ブラウザの非アクティブ状態が 30 分間続いた』
  • モバイルの場合、『アプリを切り替えた』『Slack を終了した』『画面をロックした』

続いて REST API として User presence and status | Slack を見てみると、

  • active と away の二値
  • 30分未活動なら away になる。これは slack の仕様で変更不可、停止不可
  • user.setPresence を使えば away(ずっとaway) or auto(上記の30分awayルール) をセットできる
    • 常に active は無理

常にアクティブにする戦略を考える

デスクトップアプリ、Webブラウザ、モバイルと 3 パターンあるが、モバイルは除外する。

いずれにせよ「30分活動しなかったら離席中になる」仕様なので、だったら 30 分以内に何かしら活動する よう仕込めばいい。

残る不明点

  • 活動とは何か
  • どうやって活動を仕込むか

活動については(よほど Slack の実装がひねくれてなければ) mouseover, mouseclick あたりが該当するだろう。つまり Slack の画面内でマウスカーソルを動かす or マウスクリックできればいい。

どうやって仕込むか

実現方法として以下 2 パターンが考えられる。

  • (1) ブラウザの機能(拡張機能など)でマウス操作をエミュレート
  • (2) OSの機能(たとえばクリック自動化ツール or マウス操作を行えるスクリを書く)でマウス操作をエミュレート

また、いずれにしても仕込む際は以下 3 ケースを考慮する必要がある。

  • (A) 離席中(Slack のウィンドウを30分以上アクティブにしなかった)
  • (B) 離席中(Slack のウィンドウはアクティブだが、30分以上操作しなかった)
  • (C) 離席中(PC ロックをして30分以上経った)

注意すべきが (C)。PC ロックすると画面が PC ロック画面になってしまうため、特に (2) で「指定座標をクリックする」ようなやり方を採用していた場合に、自動化が効かなくなる。

試してみた

本題。以下方法を試した。

  • [1] Firefox Quantum + Tampermonkey で、Slack の入力欄を 1 秒間隔でクリックするスクリプト
  • [2] Windows + AutoHotkey でウィンドウアクティブ化を自動化するスクリプト

各方法に関する詳細解説は割愛。スクリだけ載せる。

[1] (失敗) Tampermonkey でクリック自動化

結果:

  • PC ロックして放置 → 動作せず(30分で離席中になった)
  • PC ロックせずに放置 → 動作せず(30分で離席中になった)

Tampermonkey – Get this Extension for Firefox (ja)

// ==UserScript==
// @name         Slack always active
// @namespace    http://tampermonkey.net/
// @version      0.1
// @author       You
// @match        https://(YOUR-TEAM).slack.com/messages/(CHANNEL_ID)/
// @require      http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js
// @grant        none
// ==/UserScript==

function touch(){
    $('#msg_input').click();
}
$(function(){
    setInterval(touch, 1000);
});

スクリプト解説:

  • Slack のメッセージ入力欄を 1 秒ごとにクリックする
  • メッセージ入力欄にフォーカスが当たる = Slack 側で Active とみなすのでは?という仮説
  • 結論: 仮説は間違っていた

[2] (成功) AutoHotkey でウィンドウアクティブ化を自動化

結果:

  • PC ロックして放置 → たぶん成功?
  • PC ロックせずに放置 → 成功
#Persistent
#WinActivateForce

Loop
{
  SetTitleMatchMode, 2

  WinActivate, Slack - Mozilla Firefox
  sleep, 1000*3

  WinActivate, ahk_class Progman
  sleep, 1000*30
}

スクリプト解説(AHKスクリプトに書いてたコメントを載せただけなので多少見づらいが):

; Slack のブラウザウィンドウを指定インターバルでアクティブにする. ただし,
; - 既にアクティブの場合は何もしないに等しくなるので,
;   別のウィンドウ(ここではデスクトップ)をアクティブにする操作もはさむ.
; - PCロックから復帰した時に Slack が Active かどうかを見たいので,
;   Slack ウィンドウがアクティブになりづらいように Sleep する.
;   (はさむ方のウィンドウを長めにアクティブにする)
;   → 何が言いたいかというと、PC ロックを解除した直後に
;      「PC ロックせずに放置」時の挙動で Active になったのを
;      「あ、PC ロックして放置しててもアクティブじゃん」と誤解してしまうのを
;     防ぎたいという話.

『PC ロックして放置 → たぶん成功?』って何?:

  • 30分以上ロックして放置する実験がだるかった
  • 数回ほど試したけど、ぶっちゃけ上記の『「あ、PC ロックして放置しててもアクティブじゃん」と誤解してしまう』をしてしまったかもしれないので「成功!」と言えない
  • 気が向いたら実験し直す予定

参考

本記事を書くきっかけになった記事。

Auto mouse mover.

などヒントが得られた記事。