
ææ°ã®ã¡ãã»ãŒãžã³ã°ããŒã«ã䜿çšããã»ãšãã©ãã¹ãŠã®äººããããã«åºäŒããŸããã ãããã®å®çŸ©ã®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.exeãã€ã³ã¹ããŒã«ããã³ãã³ãããã³ããã§ngrok authtoken NgrokããŒãå ¥åããŸãã
- ngrok http port serviceã³ãã³ããå®è¡ããŸãã
- Visual Studioã§ã¯ãNgrokãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããã¡ãã¥ãŒã®[ããŒã«]-> [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 ïŒããå§ãŸããŸãããã®ãã©ãŒã ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ååãå ¥åããã¯ãŒã¯ã¹ããŒã¹ãæå®ããå¿ èŠããããŸãã
[ã¢ããªã®äœæ]ãã¿ã³ãã¯ãªãã¯ãããšãã»ããã¢ããããŒãžã衚瀺ãããŸãã[æ©èœã®è¿œå ]ãµãã»ã¯ã·ã§ã³ã§ã[ã¹ã©ãã·ã¥ã³ãã³ã]é ç®ãéžæããŠãããã³ãã³ãã®äœæã«é²ãå¿ èŠããããŸãã 衚瀺ããããã©ãŒã ã§ã次ãå ¥åããå¿ èŠããããŸãã
- [ã³ãã³ã]ãã£ãŒã«ã-ã³ãã³ãã®åå
- [ãªã¯ãšã¹ãURL]ãã£ãŒã«ã-ãµãŒãã¹ã®httpsã¢ãã¬ã¹
- ç°¡åãªèª¬æãã£ãŒã«ã-ã³ãã³ãã®ç®ç

å³ã¯ããã£ããã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ã¯æ¬¡ã®ããŒã¿ã€ããå®çŸ©ããŸãã
- ãŠãŒã¶ãŒããŒã¯ã³-ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ãããŠãŒã¶ãŒã®ããŒãOauthã«ããæ¿èªãé©çšãããŸãã ãã¬ãã£ãã¯ã¹ã¯xoxpã§ãã 詳现ã¯ãã¡ãhttps://api.slack.com/docs/oauth
- ããããŠãŒã¶ãŒããŒã¯ã³-ããŒãæè¡ä»®æ³ãŠãŒã¶ãŒã xoxbãã¬ãã£ãã¯ã¹ããããŸãã ãããã®è©³çŽ°ã«ã€ããŠã¯ã https://api.slack.com/bot-usersãã芧ãã ãã ã
- ã¯ãŒã¯ã¹ããŒã¹ããŒã¯ã³-ã¯ãŒã¯ã¹ããŒã¹ããŒã æ¥é èŸxoxaãæã£ãŠããŸãã
- ã¬ã¬ã·ãŒããŒã¯ã³-èš±å¯ããããŠãŒã¶ãŒããŒã ãã¬ãã£ãã¯ã¹ã¯xoxpã§ãã ãããã®è©³çŽ°ã«ã€ããŠã¯ã https://api.slack.com/custom-integrations/legacy-tokensãã芧ãã ãã ã ãããã䜿çšããããšã¯æšå¥šãããŸããã
- æ€èšŒããŒã¯ã³-ãã®ããŒã¹ã©ãã¯ã¯ããµãŒãã¹ã«ã¢ã¯ã»ã¹ãããšãã«éä¿¡ãããŸãã ããã䜿çšããŠããµãŒãã¹ã«ã¢ã¯ã»ã¹ããã®ãã¢ããªã±ãŒã·ã§ã³ã§ããããšã確èªã§ããŸãã APIã¡ãœããã®åŒã³åºãã«ã¯äœ¿çšãããŸããã
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ãå¶åŸ¡ããããšã¯ã§ããŸããããå€ãã®å Žåããµã€ãã§ã¯ãªãããããä»ãããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã®å®è£ ãããææã§ãããå€ãã®ãªãœãŒã¹ãç¯çŽã§ããŸãã
䟿å©ãªãªã³ã¯
å ¬åŒã®æ瀺
- Telegramã§ã®ãããã®äœæã«é¢ããæ å ±
- Slack Botæ å ±
- Facebookãããã®æé
- ããããã¬ãŒã ã¯ãŒã¯ã®ããã¥ã¡ã³ã
- Viberãããæ å ±
- vk.com/dev/botsããã³vk.com/dev/bots_docs " -VKãããã«é¢ããæ å ±
SDK
- .Netäžã®Telegram APIïŒTelegram.Bot nugetããã±ãŒãžïŒ
- Telegram.bot APIã®äŸ
- CïŒãå«ãããŸããŸãªèšèªã§ã®APIã®å®è£ ã«é¢ããå ¬åŒããŒãž