Microsoft Bot Framework V1を使用して、カードからカードへ送金するためのマルチプラットフォームボットを作成しています

Microsoft Build 2016カンファレンスで、Microsoft Bot Framework(Build 2016とのセッション: ビデオ )が発表されました。 それを使用して、ボット(C#またはNode.js)を作成し、SMS、Skype、Telegram、Slackなどのさまざまなチャネル/アプリケーションに接続できます。 MicrosoftのBot Builder SDKを使用してボットを作成し、ボットコネクタがサードパーティAPIのすべての問題を処理します(画像を参照)。 きれいに聞こえますが、アルファ版の製品の魅力をすべて体験した後、カードからカードへ送金できる単純なボットを作成してみましょう(アルファバンク-テストスタンド、API記述: アルファバンクから転送ロジックを取ります)。



免責事項:執筆時点で、マイクロソフトはフレームワークの新しいバージョンをリリースしました。そのため、第2シリーズを待ちます。ボットをv1からV3に移行します。







開発環境の準備



ボット開発を成功させるには、次のものが必要です。



  1. Visual Studio 2015
  2. dev.botframework.comでログインするためのMicrosoftアカウント
  3. ボットのデプロイされたコードを含むURL。 このURLは一般公開されている必要があります。
  4. テレグラム/スカイプ/などの開発者アカウントは、通信チャネルを追加できるようにします(アプリケーションごとに独自のトリックと設定)。


次に、Bot Frameworkのプロジェクトテンプレートaka.ms/bf-bc-vstemplateをダウンロードします。 新しいプロジェクトタイプをVisual Studio 2015で使用できるようにするには、ダウンロードしたアーカイブをフォルダー「%USERPROFILE%\ Documents \ Visual Studio 2015 \ Templates \ ProjectTemplates \ Visual C#」にコピーします。これで、最も単純なエコーボットを作成する準備ができました。



最初のボット



Visual Studio 2015を開きましょう。新しいタイプのプロジェクトがあります。







作成されたプロジェクトは、1つのコントローラー( MessagesController )を持つWeb APIプロジェクトです。これには、使用可能なPostメソッドが1つしかありません。



MessagesController
[BotAuthentication] public class MessagesController : ApiController { /// <summary> /// POST: api/Messages /// Receive a message from a user and reply to it /// </summary> public async Task<Message> Post([FromBody]Message message) { if (message.Type == "Message") { // calculate something for us to return int length = (message.Text ?? string.Empty).Length; // return our reply to the user return message.CreateReplyMessage($"You sent {length} characters"); } else { return HandleSystemMessage(message); } } private Message HandleSystemMessage(Message message) { if (message.Type == "Ping") { Message reply = message.CreateReplyMessage(); reply.Type = "Ping"; return reply; } else if (message.Type == "DeleteUserData") { // Implement user deletion here // If we handle user deletion, return a real message } else if (message.Type == "BotAddedToConversation") { } else if (message.Type == "BotRemovedFromConversation") { } else if (message.Type == "UserAddedToConversation") { } else if (message.Type == "UserRemovedFromConversation") { } else if (message.Type == "EndOfConversation") { } return null; } }
      
      









このメソッドは、ボットに送信されたメッセージだけでなく、たとえばチャットへの新しいユーザーの追加や会話の終了などのイベントも表すMessageタイプの単一のパラメーターを受け入れます。 メッセージオブジェクトが何であるかを正確に調べるには、コントローラーで行われるTypeプロパティを確認する必要があります。 これがユーザーからの通常のメッセージ(message.Type ==“ Message”)である場合、メッセージ自体を読み取って処理し、 CreateReplyMessageメソッドを使用して返信できます。 簡単なボットの準備ができました。次に、これを起動して操作性を確認します。 マイクロソフトは、便利なユーティリティBot Framework Emulator( v1用にダウンロード )を提供しています。これにより、ローカルマシンでボットを便利に実行およびデバッグできます。 EchoBotプロジェクトを実行すると、ブラウザーでこのページがlocalhostに表示されます:3978 /









次に、インストールされたボットフレームワークエミュレーターを実行します。これは、ポート3978で実行中のボットを探す価値があることを知っています。









ボットにメッセージを送信し、回答を受け取ります。 ご覧のとおり、すべてが機能します。 次に、ユーザー入力に基づいて、カードからカードへ送金できるボットの作成を検討します。



カードからカードへ送金するボット



カードからカードへの送金には、これらのカードと送金額に関する情報が必要です。 ボットフレームワークを使用して標準スクリプトを記述するタスクを容易にするために、マイクロソフトはボットと対話するための2つの最も一般的なオプションであるダイアログとFormFlowのサポートを作成しました。 私たちの場合、ボットのすべての作業はフォームにデータを入力してから処理するように表現できるため、FormFlowが適しています。 ダイアログを使用すると、特定のイベントが発生したときの通知スクリプトなど、より単純なシナリオで作業できます(サーバーの監視に役立ちます)。 クラスを追加してボットの作成を始めましょう。クラスはユーザーが入力する必要のあるフォームです。 このクラスは[Serializable]としてマークする必要があり、 Microsoft.Bot.Builder.FormFlow名前空間の属性を使用してプロパティに注釈を付けます。



CardToCardTransfer
 [Serializable] public class CardToCardTransfer { [Prompt("  :")] [Describe(" ,      ")] public string SourceCardNumber; [Prompt("  :")] [Describe(" ,      ")] public string DestinationCardNumber; [Prompt("VALID THRU ():")] [Describe("VALID THRU ()")] public Month ValidThruMonth; [Prompt("VALID THRU ():")] [Describe("VALID THRU ()")] [Numeric(2016, 2050)] public int ValidThruYear; [Prompt("CVV:")] [Describe("CVV (    )")] public string CVV; [Prompt("  ():")] [Describe("  ()")] public int Amount; [Prompt(" ():")] [Describe(" ()")] public double Fee; }
      
      







Bot FrameworkがFormFlowのクラスを使用するには、すべての開いているフィールドまたはプロパティが次のいずれかのタイプに属している必要があります。





Prompt属性は、フィールドを埋めるためのヒントとして表示されるテキストを説明します。Describe-フィールドがユーザーに呼び出される方法。 ここで、 FormBuilderクラスを使用して、Bot Frameworkに、ダイアログのフォームとしてCardToCardTransferクラスを使用することを伝える必要があります。 新しいCardToCardFormBuilderクラスを作成します。

CardToCardFormBuilder
  public static class CardToCardFormBuilder { public static IForm<CardToCardTransfer> MakeForm() { FormBuilder<CardToCardTransfer> _order = new FormBuilder<CardToCardTransfer>(); return _order .Message("         !") .Field(nameof(CardToCardTransfer.SourceCardNumber)) .Field(nameof(CardToCardTransfer.ValidThruMonth)) .Field(nameof(CardToCardTransfer.ValidThruYear)) .Field(nameof(CardToCardTransfer.DestinationCardNumber), null, validateCard) .Field(nameof(CardToCardTransfer.CVV)) .Field(nameof(CardToCardTransfer.Amount)) .OnCompletionAsync(async (context, cardTocardTransfer) => { Debug.WriteLine("{0}", cardTocardTransfer); }) .Build(); } }
      
      





FormBuilderクラス<CardToCardTransfer>をインスタンス化し、 CardToCardTransferをフォームとして使用していることを示します。 メソッド呼び出しチェーンを使用して、次のことを行います



  1. Messageメソッドは、グリーティングメッセージを設定します。
  2. Fieldメソッドは、ユーザーが入力しなければならないフィールドを設定します。順序は重要です。
  3. OnCompletionAsyncメソッドを使用すると、ユーザーがすべてのフィールドに入力したときに呼び出されるデリゲートを設定できます
  4. Buildメソッドは主な仕事をします-IForm <CardToCardTransfer>を実装するオブジェクトを返します。


すべてが非常に単純ですが、入力した値の単純な検証と手数料の計算を追加したいと思います。 手数料を計算するには、バンキングAPIとのすべての相互作用を実装するAlfabankServiceクラスがあるという事実を使用します。 カード番号を検証するには、フィールドの検証に使用されるデリゲートを示すCardValidatorクラスを作成し、3番目のパラメーターを使用してFieldメソッドに渡す必要があります。 バージョン1では、ボットフレームワークがこのための他のメカニズムを提供していなかったため、コミッションの計算も検証メソッドで実行する必要があります。

検証とコミッション計算を備えたCardToCardFormBuilder
 public static class CardToCardFormBuilder { public static IForm<CardToCardTransfer> MakeForm() { FormBuilder<CardToCardTransfer> _order = new FormBuilder<CardToCardTransfer>(); ValidateAsyncDelegate<CardToCardTransfer> validateCard = async (state, value) => { var cardNumber = value as string; string errorMessage; ValidateResult result = new ValidateResult(); result.IsValid = CardValidator.IsCardValid(cardNumber, out errorMessage); result.Feedback = errorMessage; return result; }; return _order .Message("         !") .Field(nameof(CardToCardTransfer.SourceCardNumber), null, validateCard) .Field(nameof(CardToCardTransfer.Fee), state => false) .Field(nameof(CardToCardTransfer.ValidThruMonth)) .Field(nameof(CardToCardTransfer.ValidThruYear)) .Field(nameof(CardToCardTransfer.DestinationCardNumber), null, validateCard) .Field(nameof(CardToCardTransfer.CVV)) .Field(nameof(CardToCardTransfer.Amount), null, async (state, value) => { int amount = int.Parse(value.ToString()); var alfabankService = new AlfabankService(); string auth = await alfabankService.AuthorizePartner(); state.Fee = (double) await alfabankService.GetCommission(auth, state.SourceCardNumber, state.DestinationCardNumber, amount); ValidateResult result = new ValidateResult(); result.IsValid = true; return result; }) .Confirm("   {Amount}    {SourceCardNumber}   {DestinationCardNumber}?   {Fee} . (y/n)") .OnCompletionAsync(async (context, cardTocardTransfer) => { Debug.WriteLine("{0}", cardTocardTransfer); }) .Build(); } }
      
      







残った最後のステップは、 CardToCardFormBuilderをコントローラーに統合することです。 これを行うには、 IDialog <CardToCardTransfer>を返し、 Conversation.SendAsyncメソッドの2番目のパラメーターとして順番に渡すメソッドが必要です。

MessagesController
 [BotAuthentication] public class MessagesController : ApiController { internal static IDialog<CardToCardTransfer> MakeRoot() { return Chain.From(() => FormDialog.FromForm(CardToCardFormBuilder.MakeForm)) .Do(async (context, order) => { try { var completed = await order; var alfaService = new AlfabankService(); string expDate = completed.ValidThruYear.ToString() + ((int)completed.ValidThruMonth).ToString("D2"); string confirmationUrl = await alfaService.TransferMoney(completed.SourceCardNumber, expDate, completed.CVV, completed.DestinationCardNumber, completed.Amount); await context.PostAsync($"   .    {confirmationUrl}"); } catch (FormCanceledException<CardToCardTransfer> e) { string reply; if (e.InnerException == null) { reply = $"  ,  !"; } else { reply = ",  .  ."; } await context.PostAsync(reply); } }); } /// <summary> /// POST: api/Messages /// Receive a message from a user and reply to it /// </summary> public async Task<Message> Post([FromBody]Message message) { if (message.Type == "Message") { return await Conversation.SendAsync(message, MakeRoot); } else { return HandleSystemMessage(message); } }
      
      





実際のバインディングは、コードChain.From(()=> FormDialog.FromForm(CardToCardFormBuilder.MakeForm))で発生します。その後、エラーの処理も担当しながら、リクエストの完了を待機して処理するメソッドをDoメソッドに渡します。 これでボットを開始し、エミュレータでその動作をテストできます。







ボットが期待どおりに動作することを確認できます。次に、ボットコネクタと友達を作る必要があります。



ボットコネクタにボットを登録する



まず、ボットをいくつかのパブリックURL(Azureなど)にアップロードする必要があります(無料のサブスクリプションが適しています): https : //alfacard2cardbot.azurewebsites.net 次に、Microsoftアカウントを使用してdev.botframework.comにアクセスします。 上部のメニューで[ボットの登録]を選択し、名前、説明、メッセージングエンドポイント-同じパブリックURLなど、すべての必須フィールドに入力します。







このステップで生成されたAppIdとAppSecretを追加して、web.configを更新することを忘れないでください。 これらの変更を停止します。 ボットが[マイボット]メニューに表示されたので、左下の[ボットへの接続をテスト]ウィンドウを使用して、ボットコネクタがボットと正しく対話することを確認できます。 テレグラムとのインタラクションを追加する必要があります。このため、右の列で「別のチャネルを追加」-「テレグラム」-「追加」を選択すると、このウィンドウが開きます。このウィンドウで、テレグラムボットを追加する手順を説明します:







ソースコード、テスト、結論



テレグラムボットは、 AlfaCard2CardBotで記述できます。テスト環境でお金は転送されません。 コードはGitHubで見つけることができます: https : //github.com/StanislavUshakov/AlfaCardToCardBot

次のシリーズでは、ボットをバージョン3に移行します!



All Articles