4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【c#】Slackに投稿してスレッドに返信できるようにする。

Last updated at Posted at 2021-05-16

概要

c#からSlackにメッセージを投稿したかったのでやってみました。
Incoming WebHooksを使って投稿するなどの記事が多く見かけますがこれだとスレッドに返信できないので。
今回ではchat.postMessageを使用します。

なぜ今回c#でのSlackに投稿したいかなのですが
Windowsサービスアプリでリモート接続検知PCが接続した(切断した)をSlackに投稿したかったからです。
また頻繁に接続するとチャンネルが接続通知であふれかえるのでスレッドに返信できるようにして見た目をすっきりしたい目的もあります。

※2021/0524リモート接続検知してSlackに投稿する記事を書きました。
【c#】リモートディスクトップ接続を検知してSlackに投稿するWindowsサービスを作成する

開発環境

・Visual Studio 2019
・Slackアプリ(Windowsアプリ版)

SlackAPIの準備

確認などのために自分のSlackアカウントは作成しておきましょう。
最終的には投稿したいSlackのワークスペースでAPIを作成して運用することになると思います。

SlackAPIからアプリを作成

Slack APIからアプリを作成します。

よくサイトの場所を忘れるので私はいつも

・Slackアプリから設定と管理 > App管理からSlackの管理サイトへ行き

|image.png
:|

ビルドを選択します

|image.png
:|

Create New Appから

|image.png
:|

・今回はゼロからアプリの設定をしていきます。

|image.png
:|

項目 内容
App Name アプリ名なので好きな名前にする
Pick a workspace to develop your app in: アプリを開発するワークスペースを選択します
ワークスペースは後で変更できないので注意してください。

|image.png
:|

作成したAPIの設定

・Slackの通知でよく見かけるIncoming WebHooks今回は使いません。

|image.png
:|

OAuth&PremissionsからScopesを設定します。

|image.png
:|

・メッセージを投稿したいのでchat:writeに設定します。

項目 内容
Bot Token Scopes chat:write
User Token Scopes chat:write

|image.png
:|

ワークスペースにインストール

・ここまで設定するとワークスペースにインストールできるようになるのでインストールします。

|image.png
:|

・リクエスト権限を聞かれた場合は許可しましょう。

|image.png
:|

・今回はbotとして投稿したいのでBot User OAuth Tokenxoxb-・・・を使用します。

|image.png
:|

投稿したいチャンネルにアプリを追加

投稿したいチャンネルに対して詳細>その他>"アプリを追加する"

|image.png
:|

・先ほど作成したアプリを追加します。

image.png

Windowsコンソールアプリのプロジェクト作成

・Slackに投稿するための準備はできましたのでWindowsコンソールアプリから投稿してみましょう。
新しいプロジェクトを作成を選択して。

|image.png
:|

コンソールアプリを選択
(Windowsアプリでもいいですがボタンを作ったり面倒なので簡単な確認ではいつもコンソールアプリを選択しているだけです。)

|image.png
:|

項目 内容
プロジェクト名 好きな名前
場所 好きな保存先にしましょう

|image.png
:|

実際に通知コンソールから通知してみる

コンソールアプリで作成したプロジェクトをこのようにします。

Program.cs
using System.Collections.Specialized;
using System.Net;
using System.Text;
using System.Text.Json;

namespace Prj_SlackMessageBot
{
    class Program
    {
        private static WebClient s_webClient = new WebClient();

        static void Main(string[] args)
        {
            Rootobject rootobject = SendMessageToSlack("Hello World!");
            string ts = rootobject.message.ts;
            SendMessageToSlack("スレッドに投稿", ts);
        }


        public static Rootobject SendMessageToSlack(string text, string thread_ts = "")
        {
            var data = new NameValueCollection();
            data["token"] = "xoxb-・・・"; // Bot User OAuth Token
            data["channel"] = "チャンネル名";// 作成したSlackアプリを追加したチャンネルに(私の場合は#個人)
            data["text"] = text;
            data["thread_ts"] = thread_ts;
            var response = s_webClient.UploadValues("https://slack.com/api/chat.postMessage", "POST", data);
            string responseInString = Encoding.UTF8.GetString(response);
            return JsonSerializer.Deserialize<Rootobject>(responseInString);
        }
    }


}

public class Rootobject
{
    public bool ok { get; set; }
    public string channel { get; set; }
    public string ts { get; set; }
    public Message message { get; set; }
}

public class Message
{
    public string bot_id { get; set; }
    public string type { get; set; }
    public string text { get; set; }
    public string user { get; set; }
    public string ts { get; set; }
    public string team { get; set; }
    public Bot_Profile bot_profile { get; set; }
}

public class Bot_Profile
{
    public string id { get; set; }
    public bool deleted { get; set; }
    public string name { get; set; }
    public int updated { get; set; }
    public string app_id { get; set; }
    public Icons icons { get; set; }
    public string team_id { get; set; }
}

public class Icons
{
    public string image_36 { get; set; }
    public string image_48 { get; set; }
    public string image_72 { get; set; }
}

スレッドに返信するためには

チャンネルに投稿したメッセージの戻り値のtsをスレッドに投稿したいメッセージのthread_tsに入れることによってスレッドの投稿を可能にしています。

できたらデバッグしてみましょう。(F5実行)

・デバッグ実行

|image.png
:|

・無事に投稿できスレッドに投稿もできました。

|image.png
:|

小ネタ

作成したSlackAPIをウェブ上でテストできます。

chat.postMessage/test

項目 内容
token Bot User OAuth Token
channel 投稿したいチャンネル
text 投稿内容

|image.png
:|

visualstudio上でjsonクラスを自動で生成

・SlackAPIをやり取りするときにjsonで情報が返ってきますがjsonを手動で定義するのが面倒です。
上記のメッセージのテストが成功すると下記のようなjsonが返ってくるのでコピーしてください。

|image.png
:|

・貼り付けたい行で編集>形式を選択して貼り付け>JSONをクラスとして貼り付ける
コードにも書かれているRootobjectクラス以下が自動で生成されます。

|image.png
:|

おわりに

c#なのでUnityなどを使ってもよかったですがコンソールアプリで行っています。(最終的にはWindowsサービスを作りたかったので)
SlackのAPIは様々なことができるので他の設定にした場合どのようなことができるのかいろいろ試すといいかもしれません。
次回はリモートデスクトップ接続を検知してこちらで作成したSlackAPIを使ってメッセージを投稿する記事を書ければと思っています。

参考

Slack APIを使用してメッセージを送信する
VisualStudio コピペ JSONをClassとして貼り付けられるtips

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?