æè¿ãéè¡ã®ãããžã§ã¯ãã®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) {
äžèšã®äŸã§ã¯ãåçä¿¡ã¡ãã»ãŒãžã¯ãŠãŒã¶ãŒã«åéä¿¡ãããŸãã 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 {
Telegramã«ãµãŒãã¹ã®å ŽæãäŒããããã«ã次ã®ç°¡åãªã³ã³ãœãŒã«ã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸãã
using Telegram.Bot; using Telegram.Bot.Args; using Telegram.Bot.Types; using Telegram.Bot.Types.Enums; class Program { static void Main(string[] args) {
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:
ããããã¬ãŒã ã¯ãŒã¯
ãã€ã¯ããœããã®ããããã¬ãŒã ã¯ãŒã¯ãªã©ã®ãã°ãããããŒã«ã«è§Šããªãå Žåãã¬ãã¥ãŒã¯äžå®å
šã«ãªããŸãã
ãŸãã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/572designprincipia.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
远å ã®æç€º