Help us understand the problem. What is going on with this article?

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

mighty-n
株式会社マイティークラフトのテクニカルディレクター兼サーバー管理者のNです。
https://www.m-craft.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away