Chatworkでbotを作る(1) - php で webhook


チャットツールで生産性アップ??

ChatworkやSlackなど、生産性の向上に取り入れたり検討している会社も多いでしょう。
あくまでもツールなので、使い方によりけりで、必ずしも生産性があがるとは思いません。

何でもかんでも共有すればいい(すぐ会議ルーム作成)と思いこんでいる人や、チャットツールにかける時間が長い人(これ自体が仕事?)も見うけられます。

会社でChatworkを導入しており、多人数で物事を共有するコミュニケーションツール・コラボレーションツールとしてはアリかなとは思いますが、優先順位をつけて通知設定ができない(ミュートはできますが)ので、思考を中断する悪さをするツールです=>これも使い方ですね

Chatwork API に webhook が使えるようになった

ChatworkにはAPIがあり、v1の時からウオッチしてきましたが、v2になって(?)webhookが使えるようになっていました。

webhookとは、サービス側からトリガーで設定したURLを呼び出してくれる機能です。

例えば、チャットルームに書き込みがあった場合に、WEBサーバーのURLを呼び出してデータをPOSTしてくれます。

webhook があれば Chatwork で botができる

webhookが使えるようになったことにより、メッセージの書き込みに対して、自動的にメッセージを返す bot(チャットボット)ができるはずです。

LINEでbotをいくつか作りましたが、書き込みをトリガーにすれば色々なサービスが作れそうです。

例えば、タイムカード(在籍状況)チャットルームでは以下のようなbotを作ってやりとりができそうです。

[ユーザー1] おはよう

[bot] ユーザー1さんおはようございます。タイムカードを打刻しました。

[ユーザー2] 今日出勤してない人は

[bot] CさんとFさんが現在出勤していません

[そうむゆーざー] 全員の出勤簿を送って

[bot] 出勤簿を送ります。念のため設定されたパスワードを返信して下さい

[ユーザー1] 退勤します

[bot] ユーザー1さんおつかれさまでした。今日の勤務時間は8時間32分でした。

おおー、スケジューラーと連動させたりと 妄想 可能性は広がりますね。

bot開発すればグループウェア代わりにもなりそう。

webhook を使う事前設定

Chatworkでwebhookを含むAPIを使うには、フリープラン・パーソナルプランはメニューのAPI設定から、その他の組織プランは管理者にAPI使用の承認リクエストをしてもらわなくてはなりません。

APIを使える状態であれば、右上の「API設定」メニューから「API Token」を選び、APIキーを生成します。
厳密にはwebhookを使う(受ける)だけならAPIキーは不要です。

APIキーを表示して、コピペして保存しておきます。ただしいつでも表示できるので何もしなくても大丈夫です。

次に webhook 設定です。

あらかじめ メッセージが投稿された際にトリガーとなるルームIDを控えておきます。
ルームIDとは、Chatworkをブラウザで使用する際にURLとして表示されています。

例えば、チャットの画面を開いて

https://www.chatwork.com/#!rid1234567

とブラウザのアドレスが表示されていれば、1234567がルームIDになります。
ダイレクトチャットもチャットルーム扱いで、ルームIDが割り振られます。

webhook でアクセスされるサーバーのURL(webhook URL) も必要です。
今回はPHPで作成し、「chatwork.php」というプログラムとします。

注意点は https でなければならないことです。
暗号化されないと覗き見される可能性があるので当然ですね。

PHP で webhook で送信されたデータを確認するプログラム

chatwork.php というプログラムをChatworkから呼び出すよう前項で設定しました。
今回はどのようなデータが送信されるのかを確認するように、ログファイルに出力してみます。

chatwork.php
<?php

$raw = file_get_contents('php://input');
$receive = json_decode($raw, true);

error_log(print_r($receive,true),"3","/var/log/php.log");

webhookのアクセスを受け取り、JSON形式をデコードして /var/log/php.log に出力します。
WEBサーバーの書き込みアクセス権のあるファイルを touch コマンドで作って下さい。

チャットルームで発言して webhook アクセスがあるか確認

Chatworkで指定したチャットルームで発言してみます。

送信ボタンを押して「おはよう!」と発言します。

もちろん何も返答はありませんしエラー等も起こりません。

サーバー側のログファイルに出力されているか、シェルでログインして確認してみましょう。

#cat /var/log/php.log
Array
(
    [webhook_setting_id] => 736
    [webhook_event_type] => message_created
    [webhook_event_time] => 1519019750
    [webhook_event] => Array
        (
            [message_id] => 1017313389526647584
            [room_id] => 1234567
            [account_id] => 1234321
            [body] => おはよう!
            [send_time] => 1519019750
            [update_time] => 0
        )

)
#

おー、ちゃんと送られているのが確認できました。
もちろんAPIのドキュメントどおりなのですが。

[body]の項目が発言内容なのがわかると思います。
[room_id]と[account_id]は書き換えてますのでご了承下さい。

チャットルームで発言すると、webhook で送られることが確認しました。

bot にするには、これに返答しなくてはならないです。。。(2)につづく

Chatworkのシステム以外からも webhook のURLにはアクセスできるため、実際に運用する場合はトークンを使って署名検証をして、検証に通らないアクセスは排除する必要があります。
アクセス元をIPアドレスやドメインなどで制限できれば簡単でいいのですが、IPアドレス情報は提供されていません。