Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9707

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

$
0
0
概要 c#からSlackにメッセージを投稿したかったのでやってみました。 Incoming WebHooksを使って投稿するなどの記事が多く見かけますがこれだとスレッドに返信できないので。 今回ではchat.postMessageを使用します。 なぜ今回c#でのSlackに投稿したかったなのですが Windowsサービスアプリでリモート接続検知→PCが接続した(切断した)かをSlackに通知 をやりたかったからです。 また頻繁に接続するとチャンネルが接続通知であふれかえるのでスレッドに返信できるようにして見た目をすっきりしたい目的もあります。 開発環境 ・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アプリでもいいですがボタンを作ったり面倒なので簡単な確認ではいつもコンソールアプリを選択しているだけです。) 項目 内容 プロジェクト名 好きな名前 場所 好きな保存先にしましょう 実際に通知コンソールから通知してみる コンソールアプリで作成したプロジェクトをこのようにします。 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実行) ・デバッグ実行 ・無事に投稿できスレッドに投稿もできました。 小ネタ 作成したSlackAPIをウェブ上でテストできます。 chat.postMessage/test 項目 内容 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

Viewing all articles
Browse latest Browse all 9707

Trending Articles