Daily Archives

2 Articles

MicrosoftBotFramework v1とv3の罠

結論

  • 使用していたクラスはv1時代のものでv3では非推奨となっている(使えるけど)
  • v1時代はSkypeのグループ会話に対応していなかった
  • v1時代のクラスでBotを開発していたのでSkypeグループでのMentionに反応できなかった
  • v3のクラスに置き換えましょう

事の発端

12/18に横浜でMicrosoftBotFrameworkのハッカソンを開いたとき、参加者の方からこのような質問をいただきました。

BotFrameworkで作成したBotが、普通の1対1の会話には反応してくれるけどグループ会話に追加したときに反応してくれない

 

そもそもBotFrameworkはSkypeのグループチャットを有効にしたとき、「@botname こんにちは」などのMentionを飛ばすことで反応ができるはずなのに実際に動きを見せてもらったら見事に反応してませんでした。

その後ソースコードをいただき、その原因を探ってみました。

ソースコードは以下となります。(掲載許可はいただきました)

 

原因調査

原因調査するにはデバッグするのが一番ということでローカルに実行環境を作成しデバッグしてみるとコンソールに以下のようなメッセージが表示されていました。

 

BotConnectorBot class is deprecated. Use UniversalBot with a ChatConnector class.
CommandDialog class is deprecated. Use IntentDialog class instead.

 

どうやらBotConnectorBotクラスと、CommandDialogクラスは現在のバージョンでは非推奨のようです。

それぞれ、UniversalBotとIntentDialogに置き換えましょうとのことでした。

ソースコードの場所を見ても、deprecatedフォルダ以下にあるので完全に非推奨クラスのようです。

 

BotFrameworkはv1から始まり、現在v3なのですが、v3で大きく仕様が変化しました。

また、v1のドキュメントを見ても、Skypeのグループ会話機能の説明がないことから、Skypeのグループ会話機能はv3からということが推測できます。

 

つまり、v3の環境で、v1のクラスを呼び出していたため、Skypeのグループ会話に対応していないv1では、グループ会話に応答できなかったということです。

 

対処方法

v3のコードに置き換えましょう。

実際に置き換えたサンプルを以下に示します。

 

これで正しく応答することができます。

1対1の場合

グループ会話の場合

Mention以外には反応しない

Mentionにだけ反応する

対策方法

BotFrameworkは最近出たということもあり、仕様がどんどん進化していきます。(v3でだいぶ安定してるとは思いますが)

このようなところに引っかからないためには以下のことに注意すると良いです。

デバッグメッセージを見る

Microsoftの製品はとくに、広報互換性を重視しているので古いコードでも難なく動いてしまいます。

そういう時は、必ずデバッグメッセージとして表示されますのでそれを注意深く読んでみるのがいいかと思います。

デバッグメッセージはたいてい英語ですが頑張れば読めます

公式ドキュメントを見る

公式ドキュメントは常に最新の情報が上がっているので仕様が安定していないようなプラットフォームであれば、公式を見るのがよいでしょう。

英語ですが頑張れば読めます。

Botの応答でprintfデバッグ

Bot系は特に、ローカル環境でのデバッグが難しいプラットフォームになります。printfのような出力環境も難しいので、Botの応答に変数の値を出力させちゃうのが良いでしょう。

node.jsの場合であればJSON.stringifyでJSON化して応答させるとみやすくて良いです。

 

時間のかかるpythonスクリプトをssh上でログアウトしても止めずに実行し続ける

Linuxでsshをし、ログアウトしても実行し続けるにはコマンドの前のnohupをつけます

これでout.logファイルに標準出力が入ります

しかしpythonでnohupを実行すると、出力がバッファにとどまってしまうので-uオプションをつける必要があります。