概要
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の管理サイトへ行き
・ビルド
を選択します
・Create New App
から
・今回はゼロからアプリの設定をしていきます。
項目 | 内容 |
---|---|
App Name | アプリ名なので好きな名前にする |
Pick a workspace to develop your app in: | アプリを開発するワークスペースを選択します |
ワークスペースは後で変更できないので注意してください。 |
作成したAPIの設定
・Slackの通知でよく見かけるIncoming WebHooks
今回は使いません。
・OAuth&Premissions
からScopes
を設定します。
・メッセージを投稿したいのでchat:write
に設定します。
項目 | 内容 |
---|---|
Bot Token Scopes | chat:write |
User Token Scopes | chat:write |
ワークスペースにインストール
・ここまで設定するとワークスペースにインストールできるようになるのでインストールします。
・リクエスト権限を聞かれた場合は許可しましょう。
・今回はbotとして投稿したいのでBot User OAuth Token
のxoxb-・・・
を使用します。
投稿したいチャンネルにアプリを追加
・投稿したいチャンネル
に対して詳細
>その他
>"アプリを追加する"
・先ほど作成したアプリを追加します。
Windowsコンソールアプリのプロジェクト作成
・Slackに投稿するための準備はできましたのでWindowsコンソールアプリから投稿してみましょう。
新しいプロジェクトを作成
を選択して。
・コンソールアプリ
を選択
(Windowsアプリでもいいですがボタンを作ったり面倒なので簡単な確認ではいつもコンソールアプリを選択しているだけです。)
項目 | 内容 |
---|---|
プロジェクト名 | 好きな名前 |
場所 | 好きな保存先にしましょう |
実際に通知コンソールから通知してみる
コンソールアプリで作成したプロジェクトをこのようにします。
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実行)
・デバッグ実行
・無事に投稿できスレッドに投稿もできました。
小ネタ
作成したSlackAPIをウェブ上でテストできます。
項目 | 内容 |
---|---|
token | Bot User OAuth Token |
channel | 投稿したいチャンネル |
text | 投稿内容 |
visualstudio上でjsonクラスを自動で生成
・SlackAPIをやり取りするときにjsonで情報が返ってきますがjsonを手動で定義するのが面倒です。
上記のメッセージのテストが成功すると下記のようなjsonが返ってくるのでコピーしてください。
・貼り付けたい行で編集
>形式を選択して貼り付け
>JSONをクラスとして貼り付ける
と
コードにも書かれているRootobjectクラス以下が自動で生成されます。
おわりに
c#
なのでUnity
などを使ってもよかったですがコンソールアプリで行っています。(最終的にはWindowsサービスを作りたかったので)
SlackのAPIは様々なことができるので他の設定にした場合どのようなことができるのかいろいろ試すといいかもしれません。
次回はリモートデスクトップ接続を検知してこちらで作成したSlackAPIを使ってメッセージを投稿する記事を書ければと思っています。
参考
Slack APIを使用してメッセージを送信する
VisualStudio コピペ JSONをClassとして貼り付けられるtips