Slack Web APIを用いてプロキシ接続下でSlackに投稿する方法

Node.jsアプリでは、Slack Web APIを利用することで、特定のSlackチャンネルにアプリからメッセージを送信することができます。

ただ、社内で利用する場合などPCがプロキシに接続した状態でメッセージを送るとき、きちんと設定をしないとうまく送信されません。

今回は、どのような設定をすればプロキシ接続下でもアプリからSlackチャンネルへメッセージを送信することができるのかを紹介します。

Slack Web APIとは

Slack Web APIは、Slackのワークスペース上の情報を照会したり、変更を加えたりするためのインターフェイスです。

具体的には、Slackワークスペースのユーザ情報へのアクセスや自作のアプリからチャンネルへメッセージを送信することができます。

今回は、自作のNode.jsベースのアプリからSlackチャンネルへメッセージを送信するケースを対象にします。

前提条件

以下の準備がされていることを前提として説明します。

Slack appが作成済みである

メッセージを送信する主体となるSlack app(ボット)を作成していることが必要です。

Slack appの作成は、以下の記事の「Slack Web APIでSlack appを作成する」を参考に行なってください。

必要なパッケージがインストール済みである

Node.jsベースのアプリからSlack Web APIを呼び出すには、@slack/web-apiパッケージが便利です。

@slack/web-apiパッケージを用いることで、HTTP Webクライアントを作成してSlack Web APIにリクエストを送ることができます。

インストールには、以下のコマンドを実行します。

npm i @slack/web-api

HTTPクライアントの初期化をしている

@slack/web-apiパッケージのWebClientクラスをインスタンス化し、Webクライアントを初期化します。

以下のように初期化をします。

const { WebClient } = require('@slack/web-api');

// 環境変数からトークンを設定する
const token = process.env.SLACK_TOKEN;

// WebClientの初期化
const web = new WebClient(token);

プロキシ下でメッセージを送信する方法

特にプロキシに対応した設定なしに、PCのプロキシ接続下でメッセージを送信しようとすると、以下のような警告が出力されてうまくいきません。

[WARN]  web-api:WebClient:0 http request failed getaddrinfo ENOTFOUND slack.com

解決のためには、WebクライアントのSlack Web APIへのリクエストを全てプロキシ経由で行うように設定してあげる必要があります。

必要な設定は3つのステップで実施できます。

  1. https-proxy-agentパッケージをインストールする
  2. https-proxy-agentパッケージを用いて、プロキシ認証情報を持たせたHTTPエージェントを作成する
  3. Webクライアントのagentオプションに作成したHTTP Agentを設定する

各ステップを具体的に見ていきましょう。

1. https-proxy-agentパッケージをインストールする

プロキシ認証情報を持つHTTPエージェントを作成するために、npmパッケージのhttps-proxy-agentパッケージを利用します。

以下のコマンドを実行し、インストールします。

npm install https-proxy-agent

2. https-proxy-agentパッケージを用いて、プロキシ認証情報を持たせたHTTP Agentを作成する

HttpsProxyAgentクラスをインポートし、WebClientのagentオプションで使用できるようなHTTPプロキシエージェントを作成します。

HTTPプロキシエージェントの引数には、プロキシサーバのURLを指定します。

const web_api = require("@slack/web-api");

// HttpsProxyAgentクラスをインポート
const HttpsProxyAgent = require('https-proxy-agent');

// HttpsProxyAgentクラスインスタンスを作成する
const proxy = new HttpsProxyAgent("http://username:password@proxy.example.com:8080");

3. Webクライアントのagentオプションに作成したHTTP Agentを設定する

WebClientインスタンスのagentオプションに、2で作成したエージェントを指定します。

const web = new WebClient(token, { agent: proxy });

以上の方法で、WebClientがプロキシサーバ経由でメッセージを送信できるようになります。

まとめ

PCがプロキシに接続している場合に、アプリからSlackチャンネルへメッセージを送信する方法について解説しました。

アプリからSlackへメッセージを送信するための、Slack Web APIを元にしたパッケージは様々ありますが、今回紹介した方法を用いればうまく対応できるでしょう。

コメント

タイトルとURLをコピーしました