之前我有一篇文章講了如何在azure function上開發最簡單的outgoing webhook,收到一些反饋,建議我介紹一下如果在azure function上開發teams bot,那這篇文章就來講一下如何用function來快速開發bot。
我們先創建一個azure function資源,然后創建一個由http觸發的Function。具體步驟和上次outgoing webhook的步驟類似,我就不再重復。
為了調試方便,我這里允許匿名訪問這個function。
創建完function后,我們就可以輸入下面的代碼:
#r "Newtonsoft.Json"using System;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using Microsoft.Bot.Connector;
using Microsoft.Bot.Connector.Authentication;
using Microsoft.Bot.Schema;public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{string requestBody = await new StreamReader(req.Body).ReadToEndAsync();log.LogInformation(requestBody);var activity = JsonConvert.DeserializeObject<Activity>(requestBody);var reply = activity.CreateReply("Echo: " + activity.Text);log.LogInformation(JsonConvert.SerializeObject(reply));MicrosoftAppCredentials.TrustServiceUrl(activity.ServiceUrl, DateTime.UtcNow.AddDays(7));var botId = "2a820a1c-1111-2222-3333-e8864ad6ff54"; // your bot idvar botPassword = Environment.GetEnvironmentVariable("BotPassword"); // your bot passwordvar connector = new ConnectorClient(new Uri(activity.ServiceUrl), botId, botPassword);connector.Conversations.SendToConversationAsync(reply);return new OkResult();
}
上面的代碼先從http請求的request body里反序列化出?Activity
?對象。
var activity = JsonConvert.DeserializeObject<Activity>(requestBody);
然后從這個activity對象,創建出回復的消息。
var reply = activity.CreateReply("Echo: " + activity.Text);
接著,創建?connector
?對象,然后用這個對象來發送回復的消息:
var connector = new ConnectorClient(new Uri(activity.ServiceUrl), botId, botPassword);
connector.Conversations.SendToConversationAsync(reply);
在發送回復消息之前,我們需要trust teams的serive url。
MicrosoftAppCredentials.TrustServiceUrl(activity.ServiceUrl, DateTime.UtcNow.AddDays(7));
當我們保存上面的代碼的時候,azure function 就會自動進行編譯,但是編譯失敗,原因是?Microsoft.Bot.*
?命名空間找不到,因為我們還沒有引用對應的庫。我們進入 App Service Editor (目前還是preview版本),在我們的function的目錄下創建一個?function.proj
?文件。
function.proj
?文件內容如下:
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>netstandard2.0</TargetFramework></PropertyGroup><ItemGroup><PackageReference Include="Microsoft.Bot.Schema" Version="4.10.3" /><PackageReference Include="Microsoft.Bot.Connector" Version="4.10.3" /></ItemGroup>
</Project>
回到function后,重新執行,就可以成功編譯執行了。
完成了function后,我們就可以和普通的bot一樣的在teams里創建一個bot app,然后填入azure function的url,就可以測試我們的bot了。 :D