はじめに

こんにちは!プロダクツ統括本部 アプリ・コミュニティディレクターのMonoです。
本日はリバークレインが使っているコミュニケーションツールや運用方法について書いていこうと思います。

リバークレインでは様々なコミュニケーションツールを使用しており、SlackやGoogle Chat、Chatwork、Skype、Meets、Zoomなど目的・用途に応じて様々なコミュニケーションツールを使い分けています。
現状、部署間だけでなく海外のメンバーとも簡単にやり取りができるSkypeがメインのコミュニケーションツールとして採用されており、正社員・クルーを含め全従業員がインストールして使用しています。

システムアラートには何が最適か?

突然ですが、サイト運営やシステム開発をしていく上で、例えば何かシステムに問題があった場合、何で通知するのが最適だと思いますか?
メール?コミュニケーションツール?業務用のツール?
それぞれにメリットデメリットが存在し、業務や異常の内容に応じて通知すべき部署や相手が変わるので一概にこれというものは選べないと思います。

まずは、それぞれのツールの特性をまとめて、リバークレインに必要なアラート手段はなんなのか?を考えてみました。

メール

メリット:

現代では誰もがスマートフォンを持っている時代なので、メーラーアプリさえあれば、いつでもどこでも端末の種類に問わずそのアラートに気がつくことができる
送信先の管理もメールアドレスがあればできるため、容易に送信対象の管理が行える
どの開発言語やサービスにおいてもメールを送信するプラグインやライブラリが豊富に存在するため、開発・実装が容易である

デメリット

メールのフィルタリングである程度は制御できるが、他のメールと一緒になってしまい、見過ごされる可能性が非常に高くなってしまう
関係者に送るだけで、誰が対応するのかなど横の連携がしにくくなる
外でメールを受け取っても対応する手段がない可能性がある

コミュニケーションツール

メリット

スマートフォンがあれば専用のコミュニケーションツールアプリが存在し、スマートフォンがあればいつでも確認することができる
全体周知だけでなく、対応する人に対してメンションをつけるなどして名指しなどが行える
コミュニケーションツールなので通知に対してすぐにレスができたりなどリアルタイムなコミュニケーションをツール上で行える
アラートの共有が想定されているおかげか、メッセージの送信だったりさまざまな監視ツールとの連携するプラグインが存在する

デメリット

ツールを扱う上である程度の習熟度が必要である
対応開始したら一言チャットをするなどのルール作りが必要である
基本は無料で行えるが、利用者数によっては有料になってしまうため利用者を絞る必要がある
一部の国で利用ができないツールが存在する
一部コミュニケーションツールは自動でメッセージの送信が簡単に行えるプラットフォームがない場合がある(後述)
一度に複数の問題が発生した場合に、会話などで履歴が流されてしまう可能性がある
利用している人が一部の場合、利用している人から関係者に対して手動でアラートを別コミュニケーションツールにコピぺするなどして通知する必要がある(←現状の運用)

業務ツール

メリット

オペレーティングしているときに通知が来るため、異常が発生した際にそのまま業務ツールで対応することが可能である
オペレーターは異常が発生した際にすぐに対応するかなどの判断をコミュニケーション上でできるため、お互いに待ってしまうことを防げる

デメリット

業務ツールを使用している時しか通知が来ないため、非業務時には気が付けない(他の手段と合わせて使うことである程度のカバーは可能)
常に確認して作業を行なっているオペレータにしか通知が来ないため、別部署や関係各所に伝達が遅れてしまう可能性がある(他の手段と合わせて使うことである程度のカバーは可能)

まとめ

これらを見ると、結局のところすぐに対応状況の報告が行えるコミュニケーションツールが一歩優れているように見え、また、メッセージAPIが完備されているSlackやGoogle Chatのようにシステムに組み込むことが最適で、開発難易度も低そうに感じます。

しかしながら、SlackやGoogle Chatは一部の国で利用できなかったり利用人数に応じて課金が発生するため、弊社のようにさまざまな国に開発拠点やオペレーターが分散している企業の場合、必ずしも関係者全員にメッセージを共有できないことに問題があります。

では誰でも使えるツールということでメールが挙げられますが、こちらも結局のところ誰かが見ただろうという過信からその通知の内容を誰かが対応したかわからず対応が遅れるという可能性もあります。
ECサイトを運営している以上、常に画面の先にはお客様がいて、欲しいものが買えずに困っているので対応が遅れることは死活問題になります。

これらの問題を解決するためにも、異常対応をする関係者がシステムから通知にいち早く気がつけるように最も利用されているコミュニケーションツールに対してアラートを送ることが必要不可欠だと考えました。

そこで目につけたのはリバークレインのスタンダードアプリケーションとなっているSkypeにシステムからメッセージを送れないか?と考えた次第です。

SlackやGoogle Chatなどのメッセージ送信APIが準備されているコミュニケーションツールと同じように、Skypeにも自由にメッセージを送れる仕組みを構築し、システムトラブルやメンバーにできるだけ早く情報共有ができる仕組みについて考えていこうと思います。

まだ、試行段階ですが同じ悩みを持っているメンバーを思い今回の記事を書いていこうと思います。

準備

Skypeにメッセージを送る方法は以下の2つだけです
・Pythonの開発環境
・Skypeアカウント

実装方法

本記事ではPythonの実行環境の作り方については省略します。

メッセージを送信するにあたってPythonのSkpyというライブラリを採用しました。
他にもMicrosoftが公式で出しているMicrosoft Bot Frameworkというものがあります。
Microsoftのオフィシャルフレームワークなので信頼性が高いのと、Google Apps Scriptとも連携が出来そうなので採用したいですが、Azureになってからの実装方法についてのドキュメントがあまりなかったのと、調査に時間がかかりそうなので今回の実装では一旦見送りました。

Skpyのインストール

 pip install skpy

1つだけなので簡単ですね

コーディングする

実装していきます。

from skpy import Skype
from google.oauth2.service_account import Credentials
import urllib.request
import gspread

def send(user, password, topic, message):
    skype_obj = Skype(user, password)
    for c in skype_obj.chats.recent():
        chat = skype_obj.chats[c]
        if hasattr(chat, 'topic') and chat.topic == topic:
            chat.sendMsg(message)
            break

uid = "Microsoftアカウント作成時に登録したメール" 
pa = "Microsoftアカウントに設定したパスワード"
group = "#Skype上で作成したグループ名" 
msg = "こんにちわ"
Skype(uid ,pa)
send(uid, pa, group, msg)

あとはmsgに好きなメッセージを設定すればPythonから自動でメッセージをSkypeに送れるようになります。
なお、今回用意したSkypeアカウントは二段階認証があると上手くいきません。

アプリケーションパスワードを使用して認証を通す必要がありますが、本コードでは対応出来ないのでご注意ください。

実行する

コーディングが終わったらファイルを保存して保存してください。

ターミナルにて

 python 保存したファイル名.py

で、実行してみましょう。

自分が作成したグループにメッセージが送信されれば成功です。

ちょっと応用

せっかくなので、ちょっとした応用をしたいと思います。
メッセージ内容をPython内で作成するのもいいですが、別のプログラムでメッセージを作成して、それをSkypeに送りたいという場合があると思います。

リバークレインでは業務アプリの開発に.Net6 C#を採用しているのでexeファイルに引数を渡せば自由にメッセージを送ることができるようになります。

そこで、引数を渡せるように改修したコードが下記になります。

import sys
from skpy import Skype

def send_message(skype_id, password, destination, message):
    sk = Skype(skype_id, password)  # Skypeにログイン
    # 指定されたグループ名のチャットを探し、メッセージを送信
    found = False
    for chat_id in sk.chats.recent():
        chat = sk.chats[chat_id]
        if hasattr(chat, 'topic') and chat.topic == destination:
            chat.sendMsg(message)
            found = True
            print(f"Message sent to group: {destination}")
            break
    if not found:
        print(f"Group named '{destination}' not found.")

if __name__ == "__main__":
    if len(sys.argv) != 6:
        print("Usage: script.py skype_id password send_pattern destination message")
        sys.exit(1)

    skype_id = sys.argv[1]
    password = sys.argv[2]
    destination = sys.argv[4]
    message = sys.argv[5]

    send_message(skype_id, password, destination, message)

本コードではSkypeIDとパスワード、送信先のグループ、送信したいメッセージを引数に自由にSkypeにメッセージを送ることができるようになります。

PowerShellなどのコマンドラインを使って下記のように実行してみてください。

.\skype_send_message.exe "SkypeのアカウントID" "Skypeのアカウントパスワード" "送信したいグループ名" "送信したいメッセージ"

無事送信されれば成功です。

さいごに

以上でPythonを使ってSkypeにシステムからのメッセージを送る方法の実装方法について説明を終わります。

本記事の途中にも今後課題は記載していますが、まだこの仕組みは実装に向けて色々調査を行なっている途中で本採用されているものではありません。
採用するにあたっての障壁としては、
・より安全性の高いMicrosoftが公式で出しているMicrosoft Bot Frameworkを利用できるようにし、セキュリティを高める
・Google apps scriptと連携出来るようにする(スプレッドシートで管理している作業や旧システムによってメールでしかアラートが飛んでいないものをSkypeに送信する)
・アプリケーションパスワードを使用したセキュリティ面に考慮した実装方法を模索する

などまだまだ本採用するには難しい点が多々あります。
少しずつですが、これらの解決をしていき、自動化を進めていきたいと思います。