Telegram、Slack、Facebook向けの.Net Coreのボット

最近、銀行のプロゞェクトの1぀で、ボットを䜜成するずいうタスクが発生したした。 この経隓の結果はこのテキストであり、これは䞻に初心者の開発者を察象ずしおいたす。







最新のメッセヌゞングツヌルを䜿甚するほずんどすべおの人がボットに出䌚いたした。 ボットの定矩の1぀は、特定のスケゞュヌルに埓っお自動的に、および/たたは特定のスケゞュヌルに埓っお、ナヌザヌ向けのむンタヌフェヌスを介しおアクションを実行するプログラムです。



ボットは、通知、プロセスの自動化たずえば、ナヌザヌの手玙に基づいたTFSでのタスクの自動生成、およびその他の倚くの目的に䜿甚できたすが、 1぀の蚘事ではすべおのオプションを怜蚎するのに十分ではないため、コマンドを凊理するためのボットの䜜成方法に぀いお説明したす。



電報甚ボット



最も軜い開発プラットフォヌムはTelegramです。 プロセスは、特別なBotFatherボットを呌び出すこずから始たりたす。







すべおが非垞に簡単です。BotFatherでドラむブする怜玢バヌで、スタヌトボタンを抌し、\ newbotコマンドを遞択し、質問に連続しお答えお、ボットの名前ずそのナヌザヌ名を瀺したす。 最終的に、Telegramはボットが正垞に䜜成されたこずを報告し、キヌを提䟛し、远加の説明を瀺したり、チヌムの名前を入力したりしたす。



技術的には、メッセヌゞずボットコマンドを凊理する2぀の方法がありたす。 1぀目は、サヌビスが定期的にTelegramサヌバヌをポヌリングしお倉曎がないかどうかです。 デモンストレヌションには、Telegram.Bot APIを䜿甚したすパッケヌゞはnugetから入手できたす。



using Telegram.Bot; using Telegram.Bot.Args; using Telegram.Bot.Types; using Telegram.Bot.Types.Enums; class Program { private static TelegramBotClient client; static void Main(string[] args) { // token,   BotFather client = new TelegramBotClient(token); client.OnMessage += BotOnMessageReceived; client.OnMessageEdited += BotOnMessageReceived; client.StartReceiving(); Console.ReadLine(); client.StopReceiving(); } private async void BotOnMessageReceived(object sender, MessageEventArgs messageEventArgs) { var message = messageEventArgs.Message; if (message?.Type == MessageType.TextMessage) { await client.SendTextMessageAsync(message.Chat.Id, message.Text); } } }
      
      





䞊蚘の䟋では、各着信メッセヌゞはナヌザヌに再送信されたす。 Telegramでは、チヌムもメッセヌゞであり、「/」蚘号のみが付いおいたす。



2番目の方法では、webhookを蚭定する必芁がありたす。 倉曎を凊理するhttpsアドレスでホストされるサヌビス。 この方法では、Telegramサヌバヌの負荷は軜枛されたすが、蚌明曞が必芁です。 ただし、蚌明曞の問題は、Ngrokサヌビスhttps://ngrok.com/のおかげで簡単に解決できたす。Ngrokサヌビスは、httpsアドレスからマシンのアプリケヌションアドレスにリク゚ストをトンネルできたす。



Ngrokを䜿甚するには、以䞋を行う必芁がありたす。





開始埌、生成されたアドレスを含むりィンドりが衚瀺されたす。 たた、すべおのトンネリングむベントに関する情報がここに衚瀺されたす。







Ngrokによっお返されるHTTPSアドレスは、トンネリングが開始されるたびに倉曎されたすが、アプリケヌションをデバッグするずきに垞にこれを行う必芁はありたせん。 特定のポヌトにトンネリングを1回蚭定し、必芁な回数だけサヌビスを停止開始したす。



Ngrokには管理ペヌゞがあり、 127.0.0.1 4040で利甚できたす。このペヌゞでは、ナヌザヌリク゚ストのパラメヌタヌを確認できたす。







メッセヌゞを再床送信しお前の䟋に戻り、次のWebAPIコントロヌラヌを䜿甚しおASP.NET Coreプロゞェクトを䜜成したす。



 [Route("bot")] public class BotController : Controller { // token,   BotFather private readonly TelegramBotClient client = new TelegramBotClient(token); [HttpPost] public async void Post([FromBody]Update update) { if (update == null) return; var message = update.Message; if (message?.Type == MessageType.TextMessage) { await client.SendTextMessageAsync(message.Chat.Id, message.Text); } } }
      
      





Telegramにサヌビスの堎所を䌝えるために、次の簡単なコン゜ヌルアプリケヌションを䜜成できたす。



 using Telegram.Bot; using Telegram.Bot.Args; using Telegram.Bot.Types; using Telegram.Bot.Types.Enums; class Program { static void Main(string[] args) { // token,   BotFather var client = new TelegramBotClient(token); client.SetWebhookAsync("https   Ngrok ").Wait(); Console.ReadLine(); client.SetWebhookAsync().Wait(); } }
      
      





Slackのボット



別の䞀般的なメッセヌゞングサヌビスを怜蚎しおください。 Slackでのボットの䜜成は、単玔なフォヌム https://api.slack.com/apps/new から始たりたす。このフォヌムでは、アプリケヌションの名前を入力し、ワヌクスペヌスを指定する必芁がありたす。



[アプリの䜜成]ボタンをクリックするず、セットアップペヌゞが衚瀺されたす。[機胜の远加]サブセクションで、[スラッシュコマンド]項目を遞択しおボットコマンドの䜜成に進む必芁がありたす。 衚瀺されるフォヌムで、次を入力する必芁がありたす。









図は、チャットがAlfaTestNdoボットのgetmoneyコマンドを呌び出す方法の䟋を瀺しおいたす。







指定されたhttpsアドレスでSlackコマンドを遞択するず、次のメッセヌゞを送信したす



 public class Message { public string channel_id { get; set; } public string channel_name { get; set; } public string command { get; set; } public string response_url { get; set; } public string team_domain { get; set; } public string team_id { get; set; } public string text { get; set; } public string token { get; set; } public string trigger_id { get; set; } public string user_id { get; set; } public string user_name { get; set; } }
      
      





ここで、サヌビスのコヌドがどのように芋えるかを芋おみたしょう。応答ずしお「hello」メッセヌゞを送信したす。



 [Route("bot")] public class BotController : Controller { [HttpPost] public async void Post(Message message) { var uri = new Uri("https://slack.com/api/chat.postMessage?token=" + token + "&channel=“ + message.channel_id + "&text=hello"); var httpClient = new HttpClient(); await httpClient.GetAsync(uri).ConfigureAwait(false); } }
      
      





トヌクンキヌずチャネル識別子message.channel_idを含むchat.postMessageメ゜ッドがサヌビスで呌び出されたす。



Slackは次のキヌタむプを定矩したす。





Slack APIメ゜ッドはすべお十分に文曞化されおおり、サポヌトされるキヌに関する情報が含たれおいたす。 メ゜ッドの説明ペヌゞには、テスト甚の[テスタヌ]タブもありたす。



https://api.slack.com/methods/chat.postMessage







Slackトピックの最埌に、Telegramず同様に、テキストメッセヌゞだけでなく、ボタン、メニュヌなどのさたざたなむンタラクティブコンポヌネントも䜜成できるこずを远加したす。



Facebook甚ボット



私の意芋では、Facebookでボットを䜜成するこずはTelegramやSlackよりも耇雑ですが、䞀般的にはほずんどすべおが同じです。 developers.facebook.com/appsペヌゞにアクセスし、「Add a new application」ボタンをクリックしお、フィヌドバック甚の名前ずメヌルアドレスを入力する必芁がありたす。







[アプリケヌションIDの䜜成]ボタンをクリックするず、セットアップペヌゞが開きたす。ここで、APIメ゜ッドぞのアクセスキヌを取埗するために、ボットの個人ペヌゞを指定する必芁がありたす䜜成する必芁がありたす。







[Webhook]セクションで、サヌビスのhttpsアドレスを指定し、確認キヌを芋぀けお[トヌクンの確認]フィヌルドに入力し、賌読する情報を遞択する必芁がありたす。







「確認しお保存」ボタンをクリックするず、Facebookは、hub.mode、hub.challengeおよびhub.verify_tokenの各フィヌルドを含む確認メッセヌゞを送信したす。 キヌが実際にhub.verify_tokenフィヌルドに転送された堎合、サヌビスはこのメッセヌゞを受け入れ、hub.challengeを成功ずしお返すこずができるはずです。



  [Route("bot")] public class BotController : Controller { [HttpGet] public string Verify() { var mode = Request.Query["hub.mode"].FirstOrDefault(); var challenge = Request.Query["hub.challenge"].FirstOrDefault(); var token = Request.Query["hub.verify_token"].FirstOrDefault(); return challenge ?? string.Empty; } }
      
      





メッセヌゞのみをサブスクラむブし、メッセヌゞ「hello」をボットに送信するずしたす。 この堎合、Facebookは指定したhttpsアドレスに次のメッセヌゞを送信したす。







着信メッセヌゞを凊理するためのコヌドはどのように芋えたすか この䟋では、メッセヌゞはナヌザヌに再送信されたす。



  [Route("bot")] public class BotController : Controller { [HttpPost] public void Post([FromBody] Letter letter) { var content = letter.entry[0].messaging[0]; const string token = “ ,     "; var uri = new Uri("https://graph.facebook.com/v2.6/me/messages?access_token=" + token); var request = (HttpWebRequest)WebRequest.Create(uri); request.ContentType = "application/json"; request.Method = "POST"; using (var requestWriter = new StreamWriter(request.GetRequestStream())) { requestWriter.Write($@" {{recipient: {{ id: {content.sender.id}}},message: {{text: ""{content.message.text}"" }}}}"); } var response = (HttpWebResponse)request.GetResponse(); } }
      
      





ボットフレヌムワヌク



マむクロ゜フトのボットフレヌムワヌクなどのすばらしいツヌルに觊れない堎合、レビュヌは䞍完党になりたす。



たず、Bot Frameworkは、Bing、Cortana、Email、Facebook、GroupMe、Kik、Skype、Skype for Business、Slack、SMS、Microsoft Teamsなどのさたざたなチャネルで䜜業するための統合APIを提䟛したす。



次に、゚ミュレヌタhttps://github.com/Microsoft/BotFramework-Emulatorを取埗しお、httpsアドレスを必芁ずしないサヌビスをテストしたす。 ゚ミュレヌタヌでは、 dev.botframework.com/botsに既に配眮されおいるサヌビスを確認するこずもできたすが、この堎合、アプリケヌションIDずパスワヌドを指定する必芁がありたす。







確かに、倚くの䞍快な瞬間がありたす。 特に、.Net Coreはサポヌトされおいたせん。 これに぀いおは、ここで詳しく説明したす。

github.com/Microsoft/BotBuilder/issues/572

designprincipia.com/microsoft-bot-framework-on-asp-net-core



メッセヌゞを再送信しお、䟋に戻りたしょう。 Bot Frameworkテンプレヌトをむンストヌルする必芁がありたす。







この䟋では、ナヌザヌからのテキストメッセヌゞActivityTypes.Message型に応答しお、IDialogむンタヌフェむスをサポヌトするクラスのむンスタンスが䜜成されたす。



  [Route("api/[controller]")] [BotAuthentication] public class MessagesController : Controller { [HttpPost] public async Task<HttpResponseMessage> Post([FromBody]Activity activity) { if (activity?.Type == ActivityTypes.Message) { await Conversation.SendAsync(activity, () => new Dialogs.RootDialog()); } return new HttpResponseMessage(HttpStatusCode.OK); } }
      
      





私たちの堎合、これはStartAsyncメ゜ッドを持぀RootDialogクラスであり、着信メッセヌゞを送信するタスクを線成したす。



 [Serializable] public class RootDialog : IDialog<object> { public Task StartAsync(IDialogContext context) { context.Wait(MessageReceivedAsync); return Task.CompletedTask; } private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result) { var activity = await result as Activity; await context.PostAsync(activity.Text); context.Wait(MessageReceivedAsync); } }
      
      





私の意芋では、Bot Frameworkの最も興味深い機胜はConnectorです。 これは、異なるチャネル間の通信を敎理できるAPIです。 詳现に぀いおは、 docs.microsoft.com / en-us / bot-framework / dotnet / bot-builder-dotnet-connectorをご芧ください。



おわりに



ボットずWebアプリケヌションの開発プロセスを比范するず、次の点に泚意するこずができたす。どちらの堎合も、リク゚スト凊理の䞭間局が同様に必芁ですが、フロントパヌトに぀いおは、違いが倧きいです。 ボットを䜜成する堎合、さたざたなブラりザヌやオペレヌティングシステムで動䜜するむンタヌフェむスを開発するためにリ゜ヌスを探す必芁はありたせん。 むンタヌフェむスはメッセンゞャヌサヌビス開発者の責任です。 APIを制埡するこずはできたせんが、倚くの堎合、サむトではなくボットを介したナヌザヌむンタラクションの実装がより有望であり、倚くのリ゜ヌスを節玄できたす。



䟿利なリンク



公匏の指瀺





SDK





远加の指瀺






All Articles