我正在尝试设置一个简单的Azure函数来与Slack'slash'命令集成。除了Slack发送的内容类型为“application / x-www-form-urlencoded”之外,所有似乎都连接起来,显然Azure Functions不知道如何处理。
除非Azure为“Slack”设置了特定的Web挂钩设置,否则我会让它变得“不可行”,这让我相信它应该能够正常工作。
有关如何使其正常工作的任何提示?
答案 0 :(得分:1)
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不允许您将函数机密作为令牌,因此您需要执行相反的操作(将Slack令牌带到您的函数中以便用作秘密)。为了做到这一点,抓住你的Slack令牌,打开&#34;键&#34;您的功能面板,删除您的功能级别&#34;默认&#34;键入并重新创建(将其命名为#34;默认&#34; ),方法是粘贴您从Slack获得的令牌。
答案 1 :(得分:0)
我尝试了法比奥的方法,但无法让它工作,因为我不确定我们是否应该给一个新的网址发送帖子(尝试了网址的变种,但不断收到客户端错误消息) )。我最后只是手动解析表单数据。这似乎每次都很好用。
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]);
}
}