[.NET] 將Slack內的訊息傳送到指定的WebAPI中

在上一篇文章[.NET] 透過自製的WebAPI,推送Slack訊息到指定頻道中,我們透過外部的WebAPI傳送訊息至Slack中
但若是想將Slack中的訊息傳出到WebAPI是否也可以達成呢?

本篇文章會說明如何完成這樣的功能,並讓Slack的輸入與輸出訊息都傳入到同一個WebAPI中,讓開發人員可以進行後續功能的強化

要把Slack的訊息傳出到WebAPI的功能很簡單,雖然說前一篇文章中,我們已經作到了自動傳入Slack訊息的API,不過在這裡會將這個API作一個整理,讓傳出與傳入Slack訊息的功能作一個程式碼的調整,所以即使沒有看過上一篇文章也沒關係,照著下面的步驟就可以完成Slack訊息的傳入與傳出了

1.首先先打開Visual Studio,並建立一個WebAPI專案,接著建立一個SlackModel.cs

2.把下面的模型類別放入至SlackModel.cs之中

public class SlackModel
{
    /// <summary>
    /// 傳入Slack訊息的物件模型
    /// </summary>
    public class SlackMessageQuery
    {
        public string text { get; set; }
    }

    public class SlackOutgoingContent
    {
        public string token { get; set; }
        public string team_id { get; set; }
        public string team_domain { get; set; }
        public string channel_id { get; set; }
        public string channel_name { get; set; }
        public string timestamp { get; set; }
        public string user_id { get; set; }
        public string username { get; set; }
        public string text { get; set; }
        public string trigger_word { get; set; }
    }
}

在這個模型類別裡,我們把從Slack傳出至WebAPI的訊息,以及要傳入Slack訊息的模型都放進去,讓後面程式碼可以使用

3.在App_Code資料夾中,加入一個SlackMessageObj.cs的類別庫

4.將下面的程式碼加入至該類別庫之中

public class SlackMessageObj
{
    HttpStatusCode code = HttpStatusCode.OK;

    public string SendMessage(SlackMessageQuery query)
    {
        string strUrl = "[Slack incoming Web Hook Url]";
        string strResult = this.CallAPI(strUrl, "POST", JsonConvert.SerializeObject(query), out code);

        return strResult;
    }

    /// <summary>
    /// 呼叫WebAPI
    /// </summary>
    /// <param name="strUrl"></param>
    /// <param name="strHttpMethod"></param>
    /// <param name="strPostContent"></param>
    /// <param name="code"></param>
    /// <returns></returns>
    protected string CallAPI(string strUrl, string strHttpMethod, string strPostContent, out HttpStatusCode code)
    {
        HttpWebRequest request = HttpWebRequest.Create(strUrl) as HttpWebRequest;
        request.Method = strHttpMethod;
        code = HttpStatusCode.OK;

        if (strPostContent != "" && strPostContent != string.Empty)
        {
            request.KeepAlive = true;
            request.ContentType = "application/json";

            byte[] bs = Encoding.UTF8.GetBytes(strPostContent);
            Stream reqStream = request.GetRequestStream();
            reqStream.Write(bs, 0, bs.Length);
        }

        string strReturn = "";
        try
        {
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            var respStream = response.GetResponseStream();
            strReturn = new StreamReader(respStream).ReadToEnd();
        }
        catch (Exception e)
        {
            strReturn = e.Message;
            code = HttpStatusCode.NotFound;
        }

        return strReturn;
    }
}

在這個類別庫中,會將訊息透過incoming的WebHook回傳訊息回Slack裡,內容就跟前篇文章[.NET] 透過自製的WebAPI,推送Slack訊息到指定頻道中相同

5.加入一個名為OutgoingController.cs的控制器

6.把下面的程式碼放入到這個控制器中

public class OutgoingController : ApiController
{
    HttpStatusCode code = HttpStatusCode.OK;

    public HttpResponseMessage Post(SlackOutgoingContent query)
    {
        string strReplyMessage = $"你輸入的訊息是{query.text}";
        string strResult = "";

        // 呼叫回送至Slack的function
        try
        {
            SlackMessageQuery objReply = new SlackMessageQuery()
            {
                text = strReplyMessage,
            };

            strResult = new SlackMessageObj().SendMessage(objReply);
        }
        catch (Exception e)
        {
            code = HttpStatusCode.BadRequest;
        }
        // 找出內容

        return Request.CreateResponse(HttpStatusCode.OK, strResult);
    }
}

在這段程式碼中,接收了從Slack傳出的訊息,並在接收到之後,將傳出的訊息,再次回傳到Slack裡面,回傳至Slack,當然就是呼叫剛剛建立了SlackMessageObj.cs這個物件的function

傳出訊息至Slack的程式碼,在這裡就不再贅述,請參考前篇文章[.NET] 透過自製的WebAPI,推送Slack訊息到指定頻道中,或自行下載文末所附上的Github連結作參考

 

程式碼到這裡,就算完成了,但是為了要接收Slack所傳出的訊息,所以必須將這個WebAPI發行到網路上。
所以我們將這個WebAPI發行到網路上後,別忘了把這個WebAPI的網址先記下來,等一下會用到透過Swagger,可以確認WebAPI已經發行到網路上了

接下來,就必須回到Slack中,進行Slack的設定

1.開啟Slack,並在對話視窗中按下[Channel Settings],並選擇[Add an app or integration]

2.進入到設定畫面後,在上方的查詢文字方塊中,輸入[Outgoing WebHooks],並點選進入查到的App項目

3.在[Outgoing WebHooks]的App設定中,點選[Add Configuration]

4.在Outgoing WebHooks的設定中,主要設定內容有兩個必須注意的,一個是要傳出的Channel名稱,在這裡指定好了頻道名稱,之後在這個頻道中所談論的內容,就會傳出到指定的WebAPI上。而URL(s)則是指定要將這個訊息傳出至哪一個WebAPI的URL,若是需要傳出至多個WebAPI,可以透過分行的方式加入至設定之中

Trigger Word(s) 這個設定,可以指定哪些字串開頭的訊息才要傳出至外部的WebAPI,例如:輸入"賈維斯",那麼在頻道內討論的內容,只有"賈維斯"開頭的字串,才會輸出到WebAPI上
在這裡,強烈建議一定要針對訊息的處理作過濾,Trigger Word(s)一定要加上去,因為透過incoming webhooks的輸入訊息,也會當作頻道訊息,再次傳出到outgoing webhooks之中,這點一定要特別注意一下

設定完成後,到這裡所有的工作就已經處理完成,可以試著到Slack之中輸入一些訊息看一看,不論是outgoing webhooks或是incoming webhooks都已經有正確的運作了

參考資料:
Outgoing Webhooks

程式下載:
https://github.com/madukapai/SlackWebAPI