UnitからSlackApiを通して、連続投稿時スレッドで投稿する。

記述日:2021年8月21日

概要

Unityなどの環境から、SlackApi(以下App)を通して投稿する際に、スレッド投稿するのをやるにはどうすればいいか?といったものを解説するためのもの

ターゲット

この記事は、SlackApiに関して権限の理解(今回ならば、write:chat,write:uploadがわかっている)している状態で、UnityWebRequestを使用して、すでに投稿とかはできるけどスレッドの投稿がやり方がわからないという人向け。 そもそもそれらがワカラナイ場合は、以下の記事を行ってからすると理解が進みやすいと思います。

https://herie270714.hatenablog.com/entry/2021/08/15/165146

今回のやる内容

  1. UnityWebRequestを使用して、チャットメッセージを指定のチャンネルに投稿する。
  2. 投稿した際のレスポンスに入っているスレッドを指し示す情報(以下 ts)を取得する
  3. UnityWebRequesetを使用して、以降投稿するものに対してtsを付属して投稿する。

の3ステップです。

1.Step1 チャットメッセージをチャンネル投稿をする。

基本的には、ここのチャットメッセージを送るのは、基本的には、tsを取得するためのものです。 なお、チャットメッセージと指定しているのは、ファイルをアップロードするという投稿の場合は、このts情報がなんかしらの理由で含まれていないため、取得することができません。

そのため、チャットメッセージで送る必要があるのです。

なおチャットメッセージを送るサンプルは以下の通りです。

サンプルコード

    //送るURL
    private const readonly string SlackApiUrl = "https://slack.com/api";
    private const readonly string ChatPostURL = "/chat.postMessage";

    private const readonly string BotAccessToken = "xoxb-あなたのappのAOuthToken";
    private const readonly string Channel = "#あなたのチャンネル名";
    private const readonly string UserName = "投稿した際の名前";


    eprivate string thread_ts;


    private class AAA
    {
        public string ts;
    }
        
    //チャットを送るためのフォームを使用する。
    private WWWForm BuildChatMessageRequest(string message)
    {
        var form = new WWWForm();
        form.AddField("token", BotAccessToken);
        form.AddField("channel", Channel);
        form.AddField("text", message);
        form.AddField("username", UserName);

        return form;
    }

   //投稿する
    public IEnumrator Send()
    {

        var form = BuildChatMessageRequest("メッセージを送る");
        var request = UnityWebRequest.Post(SlackApiUrl + ChatPostURL, form);
        request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
        var operation = request.SendWebRequest();


        while (!soperation.isDone)
        {
            yield return null;
        }

        if (request.isHttpError)
        {
            Debug.LogFormat("requestError:{0}", request.error);
        }
        else
        {

            //これで特定の要素だけ取得する事が出来る
            AAA ts = JsonUtility.FromJson<AAA>(request.downloadHandler.text);
            if(null != ts)
            {
                thread_ts = ts.ts;
            }


        }
    }

Step2.tsを取得する

先ほどのサンプルコードの以下の部分がそれになります。

            thread_ts = "";


            //これで特定の要素だけ取得する事が出来る
            AAA ts = JsonUtility.FromJson<AAA>(srequest.downloadHandler.text);
            if(null != ts)
            {
                //スレッド情報を取得
                thread_ts = ts.ts;
            }

これは、送った後に帰ってきたtextデータから、特定の情報を取得しているものです。

なお、AAAクラスは、クラス名としてはなんでも大丈夫なのですが、定義されている変数名は、かならず取得するパラメータにする必要があります。 今回で言うならばtsがそれにあたります。

Step3.スレッドを使用して、投稿するものに対してtsを付属して投稿する。

これは、単純にWWWFormのFieldに対して以下のフィールドを付与するだけで完了します

        if (thread_ts.Length != 0)
        {
            form.AddField("thread_ts", thread_ts);
        }

フィールド名はthread_tsです。 なお設定する値としては、文字列形式、1629509002.003900  といった文字列がセットされます。