我正在尝试设置一个简单的Azure函数来与Slack'slash'命令集成。除了Slack发送的内容类型为'application / x-www-form-urlencoded'之外,所有似乎都连接起来,显然Azure Functions不知道如何处理。
除非Azure为“Slack”设置特定的Web挂钩设置,否则我会让它变得“不可行”,这让我相信它应该可以工作。
有关如何使其工作的任何提示?
Azure函数确实支持Slack WebHooks。我不确定你遇到了什么错误,因为它没有详细说明,但这里有一个斜杠命令函数的快速示例,它会将消息回显给用户:
码:
using System.Collections.Specialized;
public static async Task<string> Run(HttpRequestMessage req, TraceWriter log)
{
NameValueCollection data = await req.Content.ReadAsFormDataAsync();
return data["text"];
}
功能配置(注意WebHook类型):
{
"bindings": [
{
"type": "httpTrigger",
"direction": "in",
"webHookType": "slack",
"name": "req"
},
{
"type": "http",
"direction": "out",
"name": "res"
}
],
"disabled": false
}
提示:值得一提的是,将对Slack请求进行验证,以确保它确实来自Slack。由于Slack不允许您将函数secret作为令牌,因此您需要执行相反的操作(将Slack令牌带到您的函数中以便用作秘密)。为了做到这一点,抓住你的Slack令牌,打开你的功能的“键”面板,删除你的功能级别“默认”键,并通过粘贴你从Slack获得的令牌重新创建(命名为“默认”)。
我尝试了Fabio的方法,但无法让它工作,因为我不确定我们是否应该放弃一个新的URL发送帖子(尝试了网址的变化,但不断得到客户端错误消息)。我最后只是手动解析表单数据。这似乎每次都很好用。
string responseURL = "";
string command = "";
string content = await req.Content.ReadAsStringAsync();
string formdata = content.Split(';')[0];
string[] namevalues = formdata.Split('&');
NameValueCollection col = new NameValueCollection();
foreach (string value in namevalues)
{
string[] nameValueItem = value.Split('=');
col.Add(nameValueItem[0], nameValueItem[1]);
log.Info(nameValueItem[0] + " - " + nameValueItem[1]);
if(nameValueItem[0] == "response_url")
{
responseURL = System.Web.HttpUtility.UrlDecode(nameValueItem[1]);
}
else if(nameValueItem[0] == "command")
{
command = System.Web.HttpUtility.UrlDecode(nameValueItem[1]);
}
}