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を作ってやりとりができそうです。

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

>[ユーザー２] 今日出勤してない人は
>>[bot] ＣさんとＦさんが現在出勤していません

>[そうむゆーざー] 全員の出勤簿を送って
>>[bot] 出勤簿を送ります。念のため設定されたパスワードを返信して下さい

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

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

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

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

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

![Image1.jpg](https://qiita-image-store.s3.amazonaws.com/0/59033/cc308af9-2883-52d7-8e4c-9b54993f2539.jpeg)

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

次に webhook 設定です。

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

例えば、チャットの画面を開いて
> https://www.chatwork.com/#!rid1234567

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

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

![Image2.jpg](https://qiita-image-store.s3.amazonaws.com/0/59033/f13b241a-cae7-450c-66d6-1ae726e7b1ef.jpeg)

注意点は 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で指定したチャットルームで発言してみます。
![Image3.jpg](https://qiita-image-store.s3.amazonaws.com/0/59033/d2cba18e-0274-657d-ee6f-cd86d28e397b.jpeg)
送信ボタンを押して「おはよう！」と発言します。

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

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

```
#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アドレス情報は提供されていません。