【Unity】Unityで作ったアプリからSlackにメッセージを投稿する

Unityで作ったアプリからSlackにメッセージを投稿する方法をまとめます。
外部からSlackに投稿する方法は色々あるようですが、今回はできることの幅が広いボットを使った実装を紹介します。
画像やファイルも投稿できるように拡張する可能性を考えるとこの方法がいいのではないかと思います。

Unity2018.3.6

ボットを導入する

まずSlackに投稿を行うボットを作成します。
ボットを作るにはまず下記のページにアクセスします。

yourworkspace.slack.com

検索窓からBotsというアプリを検索します。

f:id:halya_11:20190319182726p:plain

Add Configurationボタンをクリックすると下記の画面に遷移します。

f:id:halya_11:20190319182825p:plain

Botの名前を入力してAdd bot Integrationボタンを押し、ボットを作成します。

f:id:halya_11:20190319195617p:plain

API Tokenが発行されていればOKです。

投稿テスト

次に作ったボットで正常に投稿が行えるかテストします。
まず、ボットはジョインしているchannelにしか投稿が行えないため、投稿したいchannelに入れておきます。

f:id:halya_11:20190319195924p:plain

次に下記のページを開きます。

api.slack.com

ここでAPIのテストが行えます。
tokenとchannel名とtextを入力してTest Methodボタンを押下し、無事投稿されればOKです。

Unityから投稿する

あとはUnityからPostでリクエストを投げるだけです。

using System;
using System.Collections;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;

public class SlackBot : MonoBehaviour
{
    private static SlackBot _instance;
    public static SlackBot Instance {
        get{
            if (_instance == null){
                _instance = new GameObject().AddComponent<SlackBot>();
            }
            return _instance;
        }
    }

    private class RequestBody
    {
        public string token;
        public string channel;
        public string text;
    }

    public void Post(string token, string channelIdOrName, string message, Action<string> onSuccess = null, Action<string> onError = null)
    {
        StartCoroutine(PostRoutine(token, channelIdOrName, message, onSuccess, onError));
    }

    public IEnumerator PostRoutine(string token, string channelIdOrName, string message, Action<string> onSuccess = null, Action<string> onError = null)
    {
        var body = new RequestBody{
            token = token,
            channel = channelIdOrName,
            text = message
        };
        var bodyJson = JsonUtility.ToJson(body);

        var request = new UnityWebRequest("https://slack.com/api/chat.postMessage", "POST");
        request.SetRequestHeader("Content-Type", "application/json; charset=utf-8");
        request.SetRequestHeader("Authorization", "Bearer " + token);
        request.uploadHandler = new UploadHandlerRaw(Encoding.UTF8.GetBytes(bodyJson));
        request.downloadHandler = new DownloadHandlerBuffer();

        yield return request.SendWebRequest();
        if(request.isHttpError || request.isNetworkError) {
            // エラー
            onError?.Invoke(request.error);
        }
        else{
            // レスポンス
            onSuccess?.Invoke(request.downloadHandler.text);
        }
    }
}

こんな感じで使います。

var token = "xxxx-1234567890-1234567890-XXXXXXX";
var channel = "#bot";
var text = "content text";
SlackBot.Instance.Post(token, channel, text));

これでUnityからメッセージを投稿できました。
デバッグ時にログを投稿するようにしたりすると便利そうです。