Chatwork Creator's Note

ビジネスチャット「Chatwork」のエンジニアとデザイナーのブログです。

ビジネスチャット「Chatwork」のエンジニアとデザイナーのブログです。

読者になる

チャットワークのWebhookを使ってチャットボットを作ってみた

千葉です。ChatWork Advent Calendar 2017の19日目の担当です。 2017年10月についにチャットワークのWebhookがリリースされましたね! ということで、Webhookを利用してボットを作った話をしようと思います。

どんなボットを作ろうか?

Webhookを使ってボットを作るといっても、どういうボットを作ったらいいのだろうか? 徹夜で寝ながら考える日々…ある時ふと思いつきました。 そうだ!決まった返事を返すだけだと面白くない。AIを使ってチャットワーク上で雑談ができるようなボットを作ろう。

決まりです。

AIと雑談?

調べてみるとAIを使った会話ができるAPIが幾つかありました。 私が考えていたのは仲のいい友達との雑談です。真面目な答えなんていらない。友達感覚で返事が欲しい。 と考え色々と試してみると、ものすごく友達っぽい返事が返ってくるAPIがありました。UserLocalの人工知能ボット全自動会話APIなのでそれを使うことにしました。 他に試したAPIはなんなのよ!?という方は直接私に聞いてください。教えます。

試してみる

UserLocalの人工知能ボットを利用するためには申し込みが必要です。 ただ、申し込みをする前のお試しができるようなので試してみます。

「key」には本来UserLocalから提供されたAPIキーを指定するのですが、「sample」と指定するとほんの少しだけ試せます。

curl https://chatbot-api.userlocal.jp/api/chat\?key\=sample\&message\=おはよう | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    53    0    53    0     0     53      0 --:--:--  0:00:01 --:--:--    30
{
  "status": "success",
  "result": "……もじもじ。"
}

照れてます。なんだかわかりませんが、いい感じです。

curl https://chatbot-api.userlocal.jp/api/chat\?key\=sample\&message\=どうしたの? | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    45    0    45    0     0     15      0 --:--:--  0:00:03 --:--:--    14
{
  "status": "success",
  "result": "難しいよw"
}

なんだかわからないけどいい感じです。

UserLocalの全自動会話APIが使えるということがわかったので、ボットを作るための準備を始めます。

チャットワーク上での準備

ボットの動作確認をするためには最低2つのアカウントが必要です。 問いかける側と答える側。 これからの説明のために分かりづらいので登場人物をまとめます。

登場人物

  • フックン:これから作成するボット用のアカウント
  • ヤックン:ボットに問いかけるアカウント(あなたが普段使用しているアカウントですが、わかりやすい名前を付けました)

モックンはいません。

フックンの準備

フックンのために新たなチャットワークアカウントを作ります。

アカウントが作成できたら以下の事をしておいてください。

Webhookの作成の際はアカウントイベントを選択してください。

これらが終わったらフックンは一度ログアウトしましょう。

ヤックンの準備

ヤックンでログインし直します。そうすると、フックンからのコンタクトリクエストが来ていると思うので、承認してください。 フックンからのコンタクトリクエストを承認すると、ダイレクトチャットが作成されます。 それを確認し、ルームIDを控えておいてください。

ここまででチャットワーク側の準備は完了です。 次は実装ですね。

フックンの実装

実装と言ってもやることはとても単純です。

  1. チャットワークのWebhookからHTTPリクエストを受け取る
  2. ボット用APIに問いかけて返事を貰う
  3. 2で受け取った返事をチャットワークのAPIを使って投稿する

これだけです!受け取ってAPIを2回実行するだけです。 なので実際のコードは書きません。それぞれが使いやすい言語で使いやすいHTTPクライアントを使って実装してみてください。

チャットワークのWebhookからHTTPリクエストを受け取る

受け取るだけです。 受け取ったリクエストのボディは以下のようなJSONオブジェクトになっていると思います。

受け取った後に、署名検証を行うかどうかはそれぞれにおまかせします。やったほうがいいと思いますが、ここでは省略します。もし、やりたいということであれば、各言語の署名認証についての記事がありますのでそちらをご参照ください。

{
    "webhook_setting_id": "12345",
    "webhook_event_type": "mention_to_me",
    "webhook_event_time": 1498028130,
    "webhook_event":{
        "from_account_id": 123456,
        "to_account_id": 1484814,
        "room_id": 567890123,
        "message_id": "789012345",
        "body": "[To:1484814]おかずはなんですか?",
        "send_time": 1498028125,
        "update_time": 0
    }
}

この中で使うのは以下の4つです。後で使います。

  • webhook_event.from_account_id
  • webhook_event.room_id
  • webhook_event.message_id
  • webhook_event.body

ボット用APIに問いかけて返事を貰う

受け取ったリクエストの中の webhook_event.body をボット用APIに送信します。 この際、雑談には関係のない[To:******]などの部分は消しておいたほうがいいと思います。

curl https://chatbot-api.userlocal.jp/api/chat\?key\=sample\&message\=おかずはなんですか? | jq .
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    53    0    53    0     0     53      0 --:--:-- --:--:-- --:--:--   207
{
  "status": "success",
  "result": "違う話がいいな"
}

いいです。いい感じに友達感がでていますね。

受け取った返事をチャットワークのAPIを使って投稿する

受け取った返事をチャットワークAPIを使って投稿します。

curl -X POST \
-H "X-ChatWorkToken: 自分のAPIトークン" \
-d "body=[rp aid={webhook_event.from_account_id} to={webhook_event.room_id}-{webhook_event.message_id}]\n{ボットからの返信}" \
"https://api.chatwork.com/v2/rooms/{webhook_event.room_id}/messages"

これだけです。簡単ですね!!

動作確認

フックンに話しかけてみました f:id:cw-chiba:20171218150903p:plain 動きました。引き続き話しかけてみます。

f:id:cw-chiba:20171218151406p:plain わけがわかりませんね。

まとめ

ボットを作るのは楽しかったです。取り敢えず動いたので良かったです。 今回は全自動会話APIを使ったけれど、この部分はどんなAPIでも利用できるかもしれないです。と言うかできるでしょうね。 なんでもできそう。夢が広がりますね。