Posted at

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

More than 1 year has passed since last update.


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

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キーは不要です。

Image1.jpg

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

次に webhook 設定です。

あらかじめ メッセージが投稿された際にトリガーとなるルームIDを控えておきます。

ルームIDとは、Chatworkをブラウザで使用する際にURLとして表示されています。

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


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


とブラウザのアドレスが表示されていれば、1234567がルームIDになります。

ダイレクトチャットもチャットルーム扱いで、ルームIDが割り振られます。

webhook でアクセスされるサーバーのURL(webhook URL) も必要です。

今回はPHPで作成し、「chatwork.php」というプログラムとします。

Image2.jpg

注意点は 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

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

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

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

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