情シスは何度でも甦るさ。

VBA!VBA!

slackで未払い残業代を手にいれる

GWも明けて五月病真っ只中の季節ですが、新卒の人たちは社会人生活を謳歌してるのでしょうか。

え?GWも出勤?しかも、残業代が出ない?ブラック企業へ入社おめでとう!

でも、そんな可哀想なあなたに、slackを使って、ブラック企業から未払い残業代を請求する方法を伝授します。

もくじ

  1. どうやって残業代を請求するの?
  2. 準備
    1. slackのアカウント取得
    2. APIのURLを取得
    3. curlのダウンロード
  3. slackにつぶやく
    1. batファイルを作る
    2. メッセージを飾ってみる
    3. スタートアップ/シャットダウンスクリプトの設定
  4. そして本当の戦い

1.どうやって残業代を請求するの?

残業代に必要なものは、残業していたという記録です。 それは、就労時間を記録したメモでもよいのですが、メモなんてしてる暇ねーよ。さっさと帰りたいんだよ。しかも、周りに怪しまれるじゃねーか。

というわけで、PCをオン・オフしたところでslackにメッセージを飛ばすことで就労時間を自動で記録するのがゴールです。

2.準備

対象はWindows PCです。 MAC?そんな会社ブラックじゃねーよ。

1.slackのアカウント取得

slack.com にいってアカウント作るべし。 [company name] ってあるけど、本当の会社名入れないように。URLに使われるだけだから、適当なワードを入力すること

2.APIアドレスの設定

Incoming WebHooks という通知用のURLを取得する。 設定画面から、URLを取得できる。 詳しくは以下参照のこと
Incoming WebHooksを使用して、GitBucketにpushしたり、pull request作成,pull requestをマージ,pull requestにコメント,issue作成等をした際にSlackのチャンネルに通知メッセージを投稿してみる - keiwt’s diary

3. curlのダウンロード

公式にもある通り、メッセージを通知するのは、cURLコマンドで先ほど取得したURLにPOSTするのが一番楽。 だが、Windowsでは、curlコマンドはないので、ダウンロードする。 詳細は以下を参照。
Windows®環境にcURLコマンドを実行できるようにインストールする手順 | ええかげんブログ(本店)

会社PCだとインストールできない場合もあるが、zip版を落とせば解凍しただけでコマンドが使える。 適当なフォルダで解凍しましょう。 その後、環境変数PATHにそのフォルダを設定しておく。

3. slackにつぶやく

batファイルを作成し、以下のコマンドを書いて実行する。

start.bat

curl -X POST --data-urlencode "payload={\"text\":\"start working!\"}" https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

ダブルコーテーションをエンコードするのは、WindowscURLの仕様です。参考

え?proxy使ってる?

ならばこう。

start.bat(proxy設定)

curl -X POST --proxy http://192.168.1.1:8080 --data-urlencode "payload={\"text\":\"start working!\"}" https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

え?sslがなんたらとかへんなエラーが出た?

curl performs SSL certificate verification by default, using a "bundle" of Certificate Authority (CA) public keys (CA certs). If the default bundle file isn't adequate, you can specify an alternate file using the --cacert option.  
If this HTTPS server uses a certificate signed by a CA represented in the bundle, the certificate verification probably failed due to a problem with the certificate (it might be expired, or the name might not match the domain name in the URL).  
If you'd like to turn off curl's verification of the certificate, use the -k (or --insecure) option.

じゃ、メッセージの通り、-kオプションを追加で。

start.bat(-kオプション)

curl -X POST --data-urlencode "payload={\"text\":\"start working!\"}" -k https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

で、実行すると

f:id:ryoben:20150509220437p:plain

おめでとう!

2. メッセージを飾ってみる

今回起動用とシャットダウン用とで2つbatファイルを作るので、ついでに日本語にしてみる。
なお、slackのAPIでは文字コードをutf−8で送らなければならず、WindowscURLコマンドラインでは文字化け不可避なので、apiに渡す部分を外部ファイル化する。 また、あとあとスタートアップスクリプトとして利用できるように、cdコマンドなども追記しとく

start.bat

c:
cd C:¥script¥slack
curl -X POST --data-urlencode payload@start.json  https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

start.json (文字コードはutf−8)

{
"text": "今日も一日がんばるぞい!",
"channel":"#work",
"username":"社畜",
"icon_emoji":":smiley:"
}

end.bat

c:
cd C:¥script¥slack
curl -X POST --data-urlencode payload@end.json  https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

end.json (文字コードはutf−8)

{
"text": "今日も一日がんばったぞい!",
"channel":"#work",
"username":"社畜",
"icon_emoji":":skull:"
}

オプションの説明
text:メッセージ本文
channel:slack上のチャンネル(なしでも可)
username:つぶやいた人の名前
icon_emoji:つぶやいた人のアイコンを絵文字で指定できる。一覧はここから

これらのファイルを C:¥script¥slack に全部置いて順番に実行すると、こんな感じになる。
f:id:ryoben:20150509222605p:plain

ちゃんと時間が記録されてますね(もちろん日付も見える)
では、最後の仕上げ

3. スタートアップ/シャットダウンスクリプトの設定

このスクリプトWindowsのスタートアップ/シャットダウン時のスクリプトとして動作させます。 簡単なのは、グループポリシーを使用してスタートアップ/シャットダウン時に先ほどのスクリプトを指定します。 以下参照(XPですが)
@IT:Windows TIPS -- Tips:グループ・ポリシーを使って、コンピュータの終了時にコマンドを実行する

4. そして本当の戦い

slackは無料枠で、10000メッセージが保存されるので、5000日分つまり13年は出退勤の時刻が保存可能。 あとは、その証拠(slackの就労記録と実際の給与明細の労働時間とか)を持って労働基準監督署にヘルプミーして、会社を相手に一戦交えれば晴れて未払い残業代をゲットだぜ!

補足

うまく動かないんだぜ?
グループポリシーのスクリプト実行時の環境変数PATHは、ユーザー変数は認識しないので、システム変数のPATHを設定すること。
PATH自体設定できない場合は、batファイル内でフルパスでcurlコマンドを実行。

グループポリシーが使えない場合
スタートアップにショートカットを置くか、トリガーを起動時にしたタスクを作成することで、起動時のスクリプトは実行できる
しかし、シャットダウン時は、そういう方法が使えないので、slackへのメッセージ通知コマンドの後ろにシャットダウンコマンドを書いたbatファイルを作り、PCの電源を切る時は、そのbatファイルを起動するようにする(若干厳しいか・・・)