オープンソース

一覧へ

9. ボット

9.1. ボットについて

Zulipには、ボットという機能があります。ボットは擬似的なユーザーとして存在し、ボットに話しかけることで、外部のサービスやプログラムと連携して情報のやりとりをすることができるようになります。

また、Zulipのボットは、次の5種類が存在します。

  • Zulip組み込みのボット
    • Welcome Bot
      • 新規ユーザーにWelcomeメッセージを送るボット
    • Notification Bot
      • ユーザーに通知を送るボット
    • Email Gateway
      • メール通知を行うボット
  • 受信Webフック(Incoming webhook)
    • 外部から特定のURLへのリクエストで動作するボット
  • 発信Webフック(Outgoing webhook)
    • ボットへのダイレクトメッセージやメンションをトリガーとして、外部にリクエストを送信するボット

9.2. ボットの作成

次のような手順で、ボットを作成することができます。

組織の設定のメニューの「ボット」をクリックすると、以下の画面が表示されます。

_images/bot0-1.png

新しいボットを追加 のリンクをクリックすると、以下の画面が表示されます。

_images/bot0-2.png

次のような項目を設定できます。

  • ボット種別
    • 以下2つのうちいずれかを選択します
      • Incoming webhook(受信Webフック)
        • この項目を選択することで、外部サービスから通知を受け取るボットを作成することができます
      • Outgoing webhook(発信Webフック)
        • この項目を選択することで、外部サービスに対してリクエストを送るボットを作成することができます
  • 名前
    • ボットの名前を指定します
  • ボットのメールアドレス
    • ボットのメールアドレスを指定します
  • アバター
    • ボットの画像を指定します

追加 をクリックすることで、ボットを作成することができます。

_images/bot0-3.png

9.3. ボットの管理

次のような手順で、ボットの管理を行うことができます。

個人の設定のメニューの「ボット」をクリックすると、以下の画面が表示されます。

_images/bot0-4-1.png _images/bot0-4-2.png

上記スクリーンショットの番号に対応する説明は以下の通りです。

1.アクティブなボット

  • 現在稼働しているボットを表示することができます

2.非アクティブなボット

  • 現在停止中のボットを表示することができます

3.ボットを管理

  • ボットの名前・役割・オーナー(管理者)・アバターを変更することができます
_images/bot0-5.png

4.zuliprcをダウンロード

  • zuliprcを端末にダウンロードすることができます

5.zuliprcをコピー

  • zuliprcの情報をコピーすることができます

6.ボットを無効化

  • ボットを無効化することができます。無効化されたボットは、非アクティブなボットに表示されます

7.登録済みチャンネル

  • ボットに登録済みのチャンネルの一覧を表示することができます
_images/bot0-6.png

8.Generate URL for an integration

  • 連携先のサービスを指定し、連携用のURLを生成することができます
_images/bot0-7.png

9.4. 受信Webフック

受信Webフックには、多くの種類が存在します。例えば次のようなものです。

  • Slack
    • Slackから通知を受け取る
  • Git
    • Gitからリポジトリの変更に関する通知を受け取る
  • Zabbix
    • Zabbixからアラートを受け取る

Note

連携できるすべてのサービスについては、以下を参照してください。

https://zulip.com/integrations/

実際にこれらの機能を利用する場合、まずZulipの管理画面でボットを作成します。 受信Webフックのボットを作成する際、ボット種別でIncoming webhookを選択すると、以下のような画面になります。

_images/bot1-1-1.png

以下は、受信Webフック用のボット作成後の画面です。ここに表示されているAPIキーを使用して、外部からZulipにリクエストを送信することができます。なお、メールアドレスは擬似的なものであるため、実際に存在する必要はありません。

_images/bot1-1-2.png

受信Webフックには、開発者向けのサンプル受信Webフックである、Hello Worldというフックが含まれています。Zulipのボットの連携は、サービスごとに連携のための設定値や方法が異なるため、ここでは動作検証用にHello Worldを使用した受信Webフックの例を記載します。

Hello World を利用するためには、以下のようなURLフォーマットを使用します。

https://domain/api/v1/external/helloworld?api_key=abcdefgh&stream=stream

また、JSONでメッセージやURLを送ることができます。以下は、curlコマンドでリクエストを送信する例です。

# curl "https://zulip-kensyo.example.com/api/v1/external/helloworld?api_key=t0BWFAQ9HNXfq5iYrJjlO5Yswt9Sof2A&channel=general" \
       -d '{ "featured_title":"mytitle", "featured_url":"https://www.designet.co.jp" }'

送信すると以下のように、ボットがgeneralチャンネルに自動的にHello Worldというトピックを作成し、メッセージを投稿することができます。

_images/bot1-2.png

上記では動作確認目的でcurlを利用しましたが、実際には他のサービスから上記のようなURLにリクエストを送信することになります。そうすることで、外部サービスからの通知をZulipで受け取ることができるようになります。

9.5. 発信Webフック

発信Webフックも、受信Webフックと同様、専用のボットが必要です。

発信Webフックのボットを作成する際、ボット種別でOutgoing webhookを選択すると、以下のような画面になります。

_images/bot2-1.png

受信Webフックとの違いは、リクエストを送信する先のURLを指定する点です。また、メッセージの形式についてはZulip形式の他に、Slack互換方式(Slack-compatible)を選択することもできます。Slack互換の形式を使うことで、Slack用に作られた外部サービスを利用できるようになります。

発信Webフックの起動トリガーは、以下の2つです。なお、特定のチャンネルや、全てのメッセージを対象にすることはできません。

  • ボットへのダイレクトメッセージ
  • ボットへのメンション

実際にボットにダイレクトメッセージを送ると、次のようなリクエストが送信されます。

POST /api HTTP/1.1
Host: zulip-kensyo.example.com:8000
User-Agent: ZulipOutgoingWebhook/11.4
Content-Length: 914
Accept: */*
Content-Type: application/json
Accept-Encoding: gzip
{"data": "メッセージ", "message": {"id": 61862, "sender_id": 8, "content": "メッセージ",
"recipient_id": 522, "timestamp": 1696408268, "client": "website", "subject": "", "topic_links": [],
"rendered_content": "<p>メッセージ</p>", "is_me_message": false, "reactions": [],"submessages": [],
 "sender_full_name": "\u68ee \u5f70\u543e", "sender_email": "ohkochi@example.com", "sender_realm_str": "",
 "display_recipient": [{"id": 514, "email": "out-bot@zulip-kensyo.example.com", "full_name": "out",
 "is_mirror_dummy": false}, {"email": "ohkochi@example.com", "full_name": "\u68ee \u5f70\u543e",
 "id": 8, "is_mirror_dummy": false}], "type":"private", "avatar_url":
 "https://secure.gravatar.com/avatar/bbc74f32162ce65bfe639e349f575aec?d=identicon&version=1",
 "content_type": "text/x-markdown"},"bot_email": "out-bot@zulip-kensyo.example.com", "bot_full_name":
 "out", "token":"5f74fIArhd5tYGR1PRHqMwJJYcmF76Rz", "trigger": "private_message"}

外部プログラムでこのリクエストを受け取り、適切なレスポンスを返すことで、外部と連携した処理が可能になります。

Note

受信Webフックプログラムの開発については、以下を参照してください。

https://zulip.com/api/running-bots

なお、Zulipデフォルトの設定では、プライベートIPアドレスレンジへのリクエスト送信が拒否されます。Zulip内部サービスとしては、smokescreenというサービスが、Zulipから外に出ていくアクセスの拒否・許可を行っています。

プライベートIPアドレスを許可する場合、管理者権限でサーバにログインし、 /etc/supervisor/conf.d/zulip/smokescreen.conf ファイルに以下のように設定します。

[program:smokescreen]
command=/usr/local/bin/smokescreen-1b618edf4d3dda409ab7a00cdf3f202e143b5289-go-1.24.4 --listen-ip 127.0.0.1 --unsafe-allow-private-ranges
priority=15
autostart=true
autorestart=true
user=zulip
redirect_stderr=true
stdout_logfile=/var/log/zulip/smokescreen.log

上記は「--unsafe-allow-private-ranges」を追加して、プライベートIPアドレスを全許可する例です。他にも「--allow-range」というオプションで、特定のIPアドレスだけを許可することが可能です。

Zulipの機能の性質上、一般のユーザーもボットを作成する可能性があるため、許可するIPアドレスには充分注意が必要です。

一覧へ