ã¿ãªããããã«ã¡ã¯ãããã®èšäºã¯ãMicrosoft Teams éçºã®åå¿è åãã¬ã€ã第ïŒåŒŸã«ãªããŸããååã®2ã€ã®ãã¥ãŒããªã¢ã« ( ã¿ãã®éçº ãš Bot éçºïŒã楜ããã§ããããŠãããããããã§ãã
ä»åã¯ãTeams UI ããã®ãŠãŒã¶ããã®ã¢ã¯ã·ã§ã³ã§æ€çŽ¢çµæãã¡ãã»ãŒãžãæžãåºãæ¹æ³ã«ã€ããŠèª¬æããŸãã
Teams ã¢ããªã®äœæã«ã¯ããã€ãã®æ¹æ³ãããŒã«ãããã®ã§ããããã®ãã¥ãŒããªã¢ã«ã§ã¯ãã³ã³ã»ãããåŠãã§ãããããšãéèŠãããã®ã§ãæäœéã®ã³ãŒããšæå°éã®ããŒã«ã»ããã䜿çšããŠããŸãããŸãããã€ã¯ããœãã Azure ãã ç°å¢ãã»ããã¢ããããããšãã§ããŸãããä»åã¯ãã®ããã»ã¹ã䜿ãããæ°è»œã«åŠãã§ããããããã«ãã©ãŠã¶äžã§ã³ãŒããå®è¡ããŠãããŸãã
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãã¡ãã»ãŒãžã³ã°ã»ãšã¯ã¹ãã³ã·ã§ã³ (Messaging Extensions / ã¡ãã»ãŒãžã³ã°æ¡åŒµæ©èœ)ãšããæ©èœãã€ãã£ãéçºã«ã€ããŠçŽ¹ä»ããŸãã
ã¡ãã»ãŒãžã³ã°æ¡åŒµæ©èœã«ã¯ãã¢ã¯ã·ã§ã³ãšæ€çŽ¢ãšãã 2 çš®é¡ãããã®ã§ãããä»åã¯ãã¢ã¯ã·ã§ã³ã»ã³ãã³ããïŒæäœã³ãã³ãïŒã«ã€ããŠçŽ¹ä»ããŸãã
ããŒã ã®æ©èœ: ãã¢ã¯ã·ã§ã³ã»ã³ãã³ãã
ã¢ã¯ã·ã§ã³ã»ã³ãã³ãã䜿çšãããšãæ å ±ãåéãŸãã¯è¡šç€ºããããã®ã¢ãŒãã« ãããã¢ããããŠãŒã¶ãŒã«è¡šç€ºã§ããŸãããã©ãŒã ãéä¿¡ãããšãã¢ããªãã€ãŸã Web ãµãŒãã¹ã¯ãã¡ãã»ãŒãžãäŒè©±ã«çŽæ¥æ¿å ¥ããããã¡ãã»ãŒãžäœæããã¯ã¹ã«æ¿å ¥ããŠãŠãŒã¶ãŒã®éžæã§ã°ã«ãŒãã«ã¡ãã»ãŒãžãéä¿¡ã§ããããã«ãããã§ããŸãã
ã¡ãã»ãŒãžã»ã¢ã¯ã·ã§ã³ãã€ãã£ãŠãã¡ãã»ãŒãžå 容ãã¢ãŒã«ã¹ ã³ãŒãã«å€æãããµãŒãã¹ãäœãïŒ
ããŸããäœæããŠããã¢ããªã¯ããŠãŒã¶ãŒãéžãã ä»»æã®ã¡ãã»ãŒãžã«å«ãŸããããã¹ããæœåºããŠã¢ãŒã«ã¹ã³ãŒãã«å€æããããšãããã®ã§ãã
ã¢ããªã®åäœã¯æ¬¡ã®ãšããã§ãã
- ãŠãŒã¶ãŒãã¡ãã»ãŒãžãããŠã¹ãªãŒããŒããŠã¡ãã»ãŒãžã¡ãã¥ãŒãéããããã®ã»ãã®æäœã(More actions) ã¡ãã¥ãŒããã¢ãŒã«ã¹ bot ãéžæ
- ãŠãŒã¶ãŒããã®æäœãããªã¬ãŒããããšããã€ããŒããã¡ãã»ãŒãžã³ã°ãšã³ããã€ã³ãã«éä¿¡ã (/api/messages)
- fetchTask ã®åŒã³åºããããã§ã¡ãã»ãŒãž ããã¹ã ããŒã¿ãæœåºãããŸãã
- ãããã¢ãã ãã€ã¢ãã°ã衚瀺ãããŸãããŠãŒã¶ãŒã¯å¿ èŠã«å¿ããŠããã¹ãã³ã³ãã³ããç·šéããéä¿¡
- ã¢ããªã¯ãããã¹ããã¢ãŒã«ã¹ã³ãŒãã«å€æããã³ã³ãã³ããè¿ä¿¡ãšããŠè¡šç€º
- ãŠãŒã¶ãŒã¯çµæãã¯ã©ã€ã¢ã³ãã«æ°èŠã¡ãã»ãŒãžãšããŠéä¿¡
çµæã¯æ¬¡ã®ããã«ãªããŸãã
ð å¿ é ç§ç®
Teams ã«ã¢ããªãã€ã³ã¹ããŒã«ã§ããããã«ããã«ã¯ãçµç¹ã®ç®¡çè
ãã¢ã¯ã»ã¹èš±å¯ãä»äžããå¿
èŠããããŸãã
ãã以å€ã®å Žåã¯ãç¡æã®Microsoft 365 éçºè
ããã°ã©ã ã«ç»é²ããŸãããããã®ããã°ã©ã ã§ã¯ãéçºè
ããã³ãã®ãµã³ãããã¯ã¹ããµã³ãã« ããŒã¿ ããã¯ã«ä»å±ããŠããã¢ã㯠ãŠãŒã¶ãŒããŒã¿ãªã©ã䜿ãããµãã¹ã¯ãªãã·ã§ã³ã¯ãªã©ã§ããªãã¥ãŒã¢ã«ã§ããŸãã
- éçºã®èš±å¯ããã Teams ããã³ãããŸãã¯éçºå°çšããã³ã (M365 éçºè ããã°ã©ã ã«ãµã€ã³ã¢ããããã)
- App Studio - ããŒã ã¯ã©ã€ã¢ã³ãã®ã¢ããªã¡ãã¥ãŒããã¢ããªãæ¢ããããã³ãã®ã¯ãŒã¯ã¹ããŒã¹ã«ã€ã³ã¹ããŒã«ããŠã
- JavaScript ã®åºç€ç¥è
ðŸ ãã®ãã¥ãŒããªã¢ã«ã§äœ¿çšããæè¡
- Node.js
-
Microsoft Bot Framework
- Adaptive Cards for building some UI snippets
ã¢ã¯ã·ã§ã³ã®æ§ç¯
ð ã³ãŒã ãµã³ãã«ã®ååŸ
ãã®ãã¥ãŒããªã¢ã« ã·ãªãŒãºã§ã¯ããããžã§ã¯ãã®ã³ãŒãã®ãã¹ãã£ã³ã°ãšå®è¡ãç°¡ç¥åããããã«ããµãŒãããŒãã£ã®ããŒã«ãGlitchã䜿çšããŠããŸãã
Glitch ã¯ãnode.jsã³ãŒããèšè¿°ããŠå®è¡ã§ããWebããŒã¹ã®IDEãªã®ã§ãå°ãªããšãä»ã®ãšãããlocalhostã®ãã³ãã«ããããã€ãæ°ã«ããããšãªããTeamsã¢ããªéçºã®æŠå¿µãšåºæ¬ãåŠã¶ããšã«éäžã§ããŸãã
ãŸãããã® Glitch ãããžã§ã¯ãã® remix ãã§ãããªã³ã¯ããŸãã¯äžã®ãã¿ã³ãã¯ãªãã¯ããŠãã ããããªããã¯ã¹ãšã¯ GitHub ã§èšããšããã®ãªããžãã®ããã©ãŒã¯ã®ãããªãããªãã®ã§ãèªåçšã®ãããžã§ã¯ãã®ã³ããŒãçæããããããå
ã®ã³ãŒãã«åœ±é¿ãªãèªåçšã«å¥œããªããã«å€æŽã§ããŸãã
ããŠãèªåå°çšãããžã§ã¯ãã®ãªããååŸãããšãèªåçã«ç¬èªã®WebãµãŒããŒURLãååŸããŸããããšãã°ãçæããããããžã§ã¯ãã¯ãïŒåèªã»ã©ã§ã§ããã©ã³ãã ãªèªã§æ§æãããŠããŸããããšãã°ãã®ãããžã§ã¯ãåã achieved-diligent-bell ã ã£ããããŠã§ããµãŒããŒã®URL㯠https://achieved-diligent-bell.glitch.me
ã«ãªããŸããå¿
èŠã«å¿ããŠååãã«ã¹ã¿ãã€ãºããããšãã§ããŸãã
âïž App Configuration: App Studioã䜿ã£ãŠã¢ã㪠ãããã§ã¹ããäœæ
Teams ã¢ããªããã±ãŒãžã®åºæ¬ã«ã€ããŠã¯åã®ãã¥ãŒããªã¢ã«ãåç §ããŠãã ããã
ð App Studio ã䜿ã
App Studio äžéšã® Manifest EditorïŒãããã§ã¹ã ãšãã£ã¿ãŒïŒ ã¿ããã¯ãªãã¯ããCreate a new appïŒæ°ããã¢ããªã®äœæ]ïŒãéžæããŸããå¿ èŠäºé ãå ¥åããŠãã ããã
ãã㊠App ID ãçæããŠãã ããã
ð ã¡ãã»ãŒãžã»ãšã¯ã¹ãã³ã·ã§ã³ã®èšå®
å·ŠåŽã®ã¡ãã¥ãŒããã Capabilities > Massaging Extensions ãéžæ
å
ã«é²ã¿ãèšå®ãããã¿ã³ãã¯ãªãã¯ã
ååãä»ããŸãã
ð App credentials
ãããåã®æšªã«ãã ID ('2cd53e8a-e698-4exx-...' ã®ããã«èŠãã) ãã³ããŒããé ããã¡ã€ã«ã§ãã.envãã¡ã€ã«ã«ç°å¢å€æ°ãšããŠè²Œãä»ããŸã ('.env-sample' ã®ååã '.env' ã«å€æŽããŸã)ã
App Passwordsã®äžã§æ°èŠãã¹ã¯ãŒããçæãããããã³ããŒããããã .envãã¡ã€ã«ã«è²Œãä»ããŸãã
ãããã®æ
å ±ã¯ãbot ã¢ããã¿ãŒãåæåããããã«äœ¿çšãããŸãã(index.js ãåç
§ããŠãã ããã
(äžèšã®ç»é¢ç»åã®ã¹ããã3ã¯ããã®ããåŸã«èª¬æããŸãã)
ð¬ ã¢ã¯ã·ã§ã³ã®èšå®
Messaging Endpoint ã§ããµãŒããŒãå
¥åããŸããä»åã¯ãGlitch ãµãŒãäžã§ã³ãŒããåãããŠããã®ã§ã https://[your project].glitch.me/api/messages
ã®ããã«èªåã®ãããžã§ã¯ãåãå
¥ã£ã URL ããµãŒããšãªããŸãã
 Command ãŸã§ã¹ã¯ããŒã«ã [Add] ãã¯ãªãã¯
ãã€ã¢ãã° ããã¯ã¹ã§
1. Allow users to trigger actions in external service... ãéžæ
2. Fetch a dynamic set of parameters from your bot ãéžæ
3. command ID ãš title text ãå
¥åã Massage ãã§ãã¯ããã¯ã¹ãéžæ (ä»ã®ãã§ãã¯ããã¯ã¹ãäºåã«éžæãããŠããå Žåã¯ããã®ãã§ãã¯ããã¯ã¹ããªãã«ããŸãã) æ®ãã¯ç©ºçœã®ãŸãŸã«ããŠä¿åããŸãã
ðŠ App manifest ããã±ãŒãžãã€ã³ã¹ããŒã«
Finish > Test and distribute ãžè¡ããŸãã
ãšã©ãŒãçºçããå Žåã¯ããããä¿®æ£ããŠãã ãããããã§ãªããã°ãInstall ãã¯ãªãã¯ããŠãã ããã
ãŸãã'manifest.json' ãå«ã zip ãã¡ã€ã«ãšãåŸã§ã€ã³ã¹ããŒã«ãŸãã¯é
åžãã 2 ã€ã®ã¢ã€ã³ã³ ã€ã¡ãŒãžãããŠã³ããŒãããããšãã§ããŸãã
ã³ãŒã ãµã³ãã«ããã®ãŸãŸãªããã¯ã¹ããŠããéãããã® bot ã¯æ¢ã«åäœããã¯ãã§ããè©ŠããŠã¿ãåã«ããããã©ã®ããã«ã³ãŒãã£ã³ã°ãããŠããããç°¡åã«èª¬æããŠã¿ãŸãã
ð€ Microsoft Bot Framework
ãã€ã¯ããœããããããã¬ãŒã ã¯ãŒã¯ ã¯ãã€ã³ããªãžã§ã³ããªãšã³ã¿ãŒãã©ã€ãºã°ã¬ãŒãã®ããããæ§ç¯ã§ãããªãŒãã³ãœãŒã¹SDKã§ãã
ãã® SDK ã¯ãTeams ã ãã§ãªããWeb ãã¢ãã€ã« ãã£ãããSkypeãFacebookãAmazon AlexaãSlackãTwilio ãªã©ãå¹ åºãçš®é¡ã®ãã£ãã ãããã§åäœããããã«èšèšããã匷åãªãã©ãããã©ãŒã ã§ãã
ð§ Initiating the bot service
ãŸããGlitch ã³ãŒã ãµã³ãã« Repo ã« 2 ã€ã® JS ãã¡ã€ã«ããããŸãã index.js and bots.js ã§ãã
ããã§ã¯ãExpress ã䜿çšã㊠HTTP ãµãŒããŒãèšå®ããHTTP ãªã¯ãšã¹ããã«ãŒãã£ã³ã°ããŠããŸãããµãŒãã¹ãéå§ããæ¹æ³ã¯ãåã® Bots ãã¥ãŒããªã¢ã«ãšåãã§ãããããã¯åæåãšããã ã¢ããã¿ã®äœæã«ã€ããŠãããäžåºŠèŠçŽããã³ãŒããäžã®ããã«ãªããŸãã
// Import bot services
const { BotFrameworkAdapter } = require('botbuilder');
// Bot's main dialog
const { ReverseBot } = require('./bot');
// App credentials from .env
const adapter = new BotFrameworkAdapter({
appId: process.env.MicrosoftAppId,
appPassword: process.env.MicrosoftAppPassword
});
// Create the main dialog
const myBot = new MorseBot();
泚:ãã®äŸã§ã¯ãç§ã¯ããããã«ããŒã®ããŒãžã§ã³4.10.0ã䜿çšããŠããŸããã³ãŒããæåŸ ã©ããã«åäœããªãå Žåã¯ã䜿çšããŠããããŒãžã§ã³ã確èªããŠãã ãã!
ðŠ Bot ããžãã¯ãžã®èŠæ±ã®è»¢é
Express ã䜿çšããŠãçä¿¡ãªã¯ãšã¹ãããªãã¹ã³ããã«ãŒãã£ã³ã°ãåŠçããŸãã
app.post('/api/messages', (req, res) => {
adapter.processActivity(req, res, async context => {
await myBot.run(context);
});
});
åã®æé ã§ã App Studio 㧠URL ãèšå®ããŸããã/api/messages
ã¯ãã¯ã©ã€ã¢ã³ãèŠæ±ã«å¿çããã¢ããªã±ãŒã·ã§ã³ã®ãšã³ããã€ã³ã URL ã§ãã
ðââïž ãªã¯ãšã¹ãã®åŠç
ãšã³ããã€ã³ãã§èŠæ±ãåä¿¡ããããã ããžãã¯ã«è»¢éãããšãã¢ããªã¯èŠæ±ã®ã³ã³ãã¯ã¹ããåãåããbots.js ã§ã«ã¹ã¿ã å¿çãäœæããŸãã
èŠæ±ã«å¯Ÿããé©åãªãã³ãã©ãŒãäœæããããã«æ¡åŒµããã TeamsActivityHandler
ãåç
§ããŠãã ããã
class ReverseBot extends TeamsActivityHandler {
// ãŠãŒã¶ããã®ã¢ã¯ã·ã§ã³ã«ãã£ãŠããªã¬ãŒ
handleTeamsMessagingExtensionFetchTask(context, action) {
/*
ããã§è¡šç€ºãããã€ã¢ãã°ã®ã³ã³ãã³ãã adaptive card UI (modal dialog)ãäœæã
ãŠãŒã¶ããã€ã¢ãã°ã確èªããŠéä¿¡ã
*/
}
// FetchTask ãããŠãŒã¶ã«ãã£ãŠéä¿¡ããããããªã¬ãŒ
handleTeamsMessagingExtensionSubmitAction(context, action) {
// display the result
}
TeamsActivityHandler
ã¯ãã¡ãã»ãŒãž ã€ãã³ã (*äŸãã° onMembersAdded
ã¡ãœãããäŒè©±ã«ã¡ã³ããŒãè¿œå ããããã³ã«åŒã³åºããã) ãªã©ã®ã¡ãã»ãŒãžãåŠçããè¿ä¿¡ãéä¿¡ããããŒã åºæã®ã¯ã©ã¹ã§ãã
ããã§ã¯ããŠãŒã¶ãã¡ãã»ãŒãžã«å¯Ÿãã¢ã¯ã·ã§ã³ãèµ·ãããšãhandleTeamsMessagingExtensionFetchTask
ãããªã¬ãŒãããããããå
ã®ã¡ãã»ãŒãžã«é¢ããæ
å ±ãåãåããŸãã
ãããã«ã€ããŠã¯ããã¥ã¡ã³ããã¿ã¹ã¯ã¢ãžã¥ãŒã«ãäœæããŠéä¿¡ãã ãã§ãã£ãšè©³ããåŠã¶ããšãã§ããŸãã
ð ã¢ãããã£ã ã«ãŒãã䜿çšããã¢ãŒãã« ãã€ã¢ãã°ã®è¡šç€º
ãã€ã¢ãã° UI ã¯ã Microsoft ã®ãªãŒãã³ ãœãŒã¹ã§ãããã¢ãããã£ã ã«ãŒãã䜿ã£ãŠ JSON 㧠UI ãæ§ç¯ããããšãã§ããŸããã¢ãããã£ã ã«ãŒãã¯ãTeams ã®ä»ãOutlook ã®ã¢ã¯ã·ã§ã³å¯èœãªã¡ãã»ãŒãžãCortana ã¹ãã«ãªã©ããŸããŸãª Microsoft ãã¡ããªãŒã®ãµãŒãã¹ã®éçºã§äœ¿ãããšãã§ããŸãã
handleTeamsMessagingExtensionFetchTask
ãåŒã³åºããããšãã¡ãã»ãŒãž ã³ã³ãã³ã ããã¹ããååŸããå¿çãšããŠãã€ã¢ãã°ãšããŠã¢ãããã£ã ã«ãŒãã«è¡šç€ºããŸãã
ã¢ãããã£ã ã«ãŒããšã³ã³ãã³ããå®çŸ©ããã«ã¯:
const card = {
type: 'AdaptiveCard',
version: '1.0'
};
card.body = [
{ type: 'TextBlock', text: 'The message to be encoded to Morse code:', weight: 'bolder'},
{ id: 'editedMessage', type: 'Input.Text', value: content },
];
card.actions = [{
data: { submitLocation: 'messagingExtensionFetchTask'},
title: 'Encode to Morse!',
type: 'Action.Submit'
}];
const adaptiveCard = CardFactory.adaptiveCard(card);
return {
task: {
type: 'continue',
value: {
card: adaptiveCard
}
}
};
æœåºãããã¡ãã»ãŒãžããã¹ãã type: 'Input.Text'
ã§è¡šç€ºãããŠãŒã¶ãŒãã¢ãŒã«ã¹ã³ãŒãåããããã¹ããç·šéã§ããããã«ããŸãã
å®å šãªã³ãŒãã衚瀺ããã«ã¯ãã°ãªããã®ã³ãŒã ãµã³ãã«ã® bot.js ãã¡ã€ã«ãåç §ããŠãã ããã
ð® ãŠãŒã¶ãŒã®éä¿¡ãåŠçãã
ãŠãŒã¶ãŒãã¿ã¹ã¯ ã¢ãžã¥ãŒã«ãéä¿¡ãããšãhandleTeamsMessagingExtensionSubmitAction
ãããªã¬ãŒãããWeb ãµãŒãã¹ã¯ã³ãã³ã ID ãšãã©ã¡ãŒã¿ãŒå€ãèšå®ããããªããžã§ã¯ããåãåããŸãã
ãã®ãµã³ãã« ã³ãŒãã§ã¯ãã«ã¹ã¿ã ããŒã¿ editedMessage
ãååšãããã©ããã ãã確èªããŸãããã®å Žåã¯ãå€ïŒããã§ã¯æåå) ãååŸãããããã¢ãŒã«ã¹ã«å€æããŠãæ°ããã¡ãã»ãŒãžãšããŠäœæããã³ã³ãã³ãã衚瀺ããŸãã
async handleTeamsMessagingExtensionSubmitAction(context, action) {
if(action.data.editedMessage) {
const text = action.data.editedMessage;
const morseText = await encodeToMorse(text);
return {
composeExtension: {
type: 'result',
attachmentLayout: 'list',
attachments: [
// the message UI component here
]
}
}
}
bots.js ã«ç€ºãããŠããã³ãŒããµã³ãã«ã§ã¯ãçµæã¡ãã»ãŒãžãäœæããããã« Bot Framework ã«ä»å±ã®ãµã ãã€ã«ã«ãŒããšåŒã°ããã·ã³ãã«ãªUI ã«ãŒãã䜿çšããŠããŸããããã¡ããåè¿°ã®ã¢ãããã£ãã«ãŒãã䜿çšã§ããŸãã
ð€ð¬ ã¡ãã»ãŒãžã¢ã¯ã·ã§ã³ãè©ŠããŠã¿ã
ããã§ã¯ãã¢ã¯ã·ã§ã³ãè©ŠããŠã¿ãŸããã!
Teams ã¯ã©ã€ã¢ã³ãã«ç§»åãããªãã ãã©ãŒããããç»åã§ã¯ãªããã·ã³ãã«ããã¹ãã§æ§æãããã¡ãã»ãŒãžã®ãããããã¯ãªãã¯ããŠã¿ãŠãã ããã
ãã¹ãŠãæåŸ ã©ããã«åäœããå Žåã¯ãä»»æã®ããã¹ã ã¡ãã»ãŒãžãã¢ãŒã«ã¹ ã³ãŒãã«å€æã§ããã¯ãã§ãã
ð
ãã¥ãŒããªã¢ã«ã楜ããã§ããã ããŸãããïŒã¢ãŒã«ã¹ã»ã³ãŒããžã®å€æã¯æ£çŽãããŸãæ®æ®µåœ¹ã«ç«ã€ãã®ã§ã¯ãªãã§ãããããã©ãã¿ãªããã¯ãã£ãšè¯ããŠãŒã¹ã±ãŒã¹ãèŠã€ããŠçŽ æŽãããã¢ããªãäœæããããšãé¡ã£ãŠããŸã!
次ã®ãã¥ãŒããªã¢ã«ã§ã¯ãæ€çŽ¢ã³ãã³ãã§ããå¥ã®çš®é¡ã®ã¡ãã»ãŒãžã³ã°æ¡åŒµæ©èœãæ§ç¯ããæ¹æ³ã«ã€ããŠèª¬æããŸãã次åãäŒãããŸããã ð
ðºðž ãã®èšäºãè±èªã§èªã¿ãããšããæ¹ã¯ dev.to ã®ãªã³ã¯ããã©ããïŒ
ð Learn more
- MS Teams Documentation - ã¡ãã»ãŒãžã³ã°ã»ãšã¯ã¹ãã³ã·ã§ã³
- Microsoft Bot Frameworks
- Bot Services Documentation - How bot works?
- ã¢ãããã£ã ã«ãŒã
- [å®å šç¡æã§] Microsoft Teams ã§åã ãªã¬ãªã¬ bot ã 1 æéã§äœã - Azure ããããããäœã£ãŠãããŸã
- Microsoft @ Qiita