API連携するSlackアプリの作り方【楽天市場ランキングAPIで解説】

API連携するSlackアプリの作り方
  • ブラウザのタブを開きすぎて迷子になる
  • どのサービスに情報があるのか分からなくなる
  • Slackと連携して情報を集約したい

このようなお悩みはありませんか?

当社でもいろんなサービスを使っており、情報がどこにあるのか分からなくなることがあります。大量のブラウザのタブを行き来して検索し、時間を浪費していることもあります。

実はSlackはビジネスチャット機能だけでなく、API連携に強いという特徴があります。

Slackと外部サービスを連携させることで情報集約し、タブやアプリの往復作業を軽減させることができます。

この記事ではSlackと外部サービスをAPI連携する方法を解説します。この記事を読めばサービス連携するアプリの作り方が分かり、業務効率をアップする仕組みが作れますよ。

今回は”楽天市場ランキングAPI”を例にアプリの作り方を解説します。
他のサービスとの連携は”楽天市場ランキングAPI”の部分を置き換えると応用できます。

当社では外部サービス連携したSlackアプリ開発のご相談を受け付けております。
Slackアプリ開発でお困りのかたは、こちらよりお問い合わせください。

API連携するSlackアプリの仕組み

楽天市場ランキング取得アーキテクチャ

楽天が無料で提供しているRakuten Webserviceから楽天市場ランキングAPIを使用して、その日の楽天市場の売り上げランキングをCSVファイルで返却するアプリを実装していきます。

利用サービス

以下を使用して作成していきます。

プラットフォームAWS
AWSサービスLambda、API Gateway
フレームワークBolt ※Node.js
外部サービス楽天市場ランキングAPI

この記事ではAWSの環境構築は既に完了していることを前提に進めていきます。

AWS環境構築方法は、以下の記事で詳しく解説しています。
≫ AWSを利用したSlackアプリの作り方

楽天市場ランキングAPIと連携したアプリ開発の事前準備

事前に以下の2点を準備します。

  • Rakuten WebserviceでアプリIDを発行
  • Slackアプリを用意

それぞれの手順を解説します。

Rakuten WebserviceでアプリIDを発行

楽天のAPIを利用するためにRakuten WebserviceでアプリIDを発行してください。

RakutenWebserviceアプリIDの確認画面

ここで発行したアプリIDは後ほど使用します。

※Rakuten Webserviceの使い方がわからない方はヘルプページをご確認ください。

Slackアプリを用意

1. Slackアプリ作成

Slack APIよりアプリを新規作成します。

SlackAPIを新規作成

2. OAuth & Permissionsでアプリに権限を追加

OAuth & PermissionsにてBot Token Scopesに”files:write”と”chat:write”権限を付与します。

OAuthPermissionsの選択画面
BotTokenScopesに権限を付与

これらの権限を付与することで、アプリがSlackのメッセージにファイルを送信することができるようになります。

3. Display NameとDefault Nameを設定

App HomeでDisplay NameとDefault Nameに任意の値を設定します。

DisplayNameとDefaultNameの設定

4. ショートカットを作成

Interactivity & ShortcutsからCreate New Shortcutを押下します。

CreateNewShortcutを押下

Globalを選択し、Nextを押下します。

Globalを選択しNextを押下

ショートカットの内容を入力して、Createを押下します。

ショートカットを入力しCreateを押下

NameとShort Descriptionは任意、Callback IDは”get_rakuten_ranking”を入力します。ここで設定したCallBack IDはSlackからのイベントを受け取る際に使用します。

API Gatewayで発行したURLの末尾に「slack/events」をつけてRequestURLを設定し、保存します。

RequestURLを設定

アプリをインストールし、BotUserOauthTokenを発行します。

BotUserOauthTokenを発行

発行したトークンは後で使用します。

楽天市場ランキングAPIと連携したアプリ開発の実装

以下の手順4ステップで実装を進めます。

  1. index.jsを外部サービスから情報取得するプログラムを書く
  2. 環境変数を設定
  3. 必要なモジュールの追加
  4. 参照レイヤーを最新バージョンに変更

それぞれのステップを解説します。

index.jsで外部サービスから情報取得するプログラムを書く

Lambdaのindex.jsファイルを以下の内容に変更します。

const https = require("https");
const querystring = require('querystring');
const csv = require('csv-string');
const iconv = require('iconv-lite');
const { App, AwsLambdaReceiver } = require('@slack/bolt');
 
// レシーバー初期化処理
const awsLambdaReceiver = new AwsLambdaReceiver({
  signingSecret: process.env.SLACK_SIGNING_SECRET,
});
 
// アプリ初期化処理
const app = new App({
  token: process.env.SLACK_BOT_TOKEN,
  receiver: awsLambdaReceiver,
});
 
// Lambda関数で最初に呼ばれる処理
module.exports.handler = async (event, context, callback) => {
  const handler = await awsLambdaReceiver.start();
  return handler(event, context, callback);
}


// ショートカットのリスナー
app.shortcut(‘get_rakuten_ranking’, async ({ ack, shortcut }) => {
    await ack();
    const rakutenIchibaRank = await getRakutenIchibaRank();
    const items = rakutenIchibaRank.Items;
    const csvData = createCsvData(items);
 const today = new Date();
    const year = today.getFullYear();
    const month = today.getMonth() + 1;
    const day = today.getDate();

    await app.client.files.upload({
        "channels": shortcut.user.id,
        "content":  csv.stringify(csvData),
        "filename":`${year}年${month}月${day}日の楽天市場ランキング.csv`
    });
})

// 楽天市場ランキング取得
async function getRakutenIchibaRank() {
    return new Promise((resolve, reject) => {
        let body = "";
        const query = querystring.stringify({
            applicationId:process.env.RAKUTEN_AUTH_KEY
        });
  // pathに20170628が入っていますが、本日の売上ランキングを取得することができます。
        const options = {
            host: 'app.rakuten.co.jp',
            path: '/services/api/IchibaItem/Ranking/20170628' + '?' + query,
            method: 'GET'
        };
    
        const req = https.request(options, (res) => {
            res.on('data', (chunk) => {
                body += chunk;
            });

            res.on('end', () => {
                resolve(JSON.parse(body));
            });
        })
    
        req.on('error', (e) => {
            reject(e.message);
        });
    
        req.end();
    });
}

// CSVファイル作成
function createCsvData(items) {
    const header = ["ランキング","商品名","価格","商品URL","ショップ名"];
    const csvData = [header];
    for(let item of items){
        const row = []
        const itemDetail = item.Item;
        const rank = itemDetail.rank;
        const itemName = itemDetail.itemName;
        const itemPrice = itemDetail.itemPrice;
        const itemUrl = itemDetail.itemUrl;
        const shopName = itemDetail.shopName;
        row.push(rank, itemName, itemPrice, itemUrl, shopName);
        csvData.push(row);
    }
    return csvData;
}

Tips

app.shortcutの引数には、事前準備にて設定したCallback IDを指定します。
Callback IDでどのショートカットイベントを受け取るかを制御することができます。

環境変数を設定

コード内でprocess.env.~を使って値を指定しているものは、すべて環境変数に設定する必要があります。

環境変数の編集画面

各値に設定する内容は以下の通りです。

「RAKUTEN_AUTH_KEY」の設定

RAKUTEN_AUTH_KEYに設定するRakutenアプリID

「SLACK_SIGING_SECRET」の設定

SLACK_SIGING_SECRETに設定するSigningSecret

「SLACK_BOT_TOKEN」の設定

SLACK_BOT_TOKENに設定するBotUserOAuthToken

必要なモジュールの追加

index.jsで読み込み(require)する以下のモジュールを利用できるようにします。

  • querystring
  • csv-string
  • iconv-lite

標準モジュールではないのでnode_modulesフォルダに追加していきます。

1. コマンドプロンプトを開く

環境構築で用意したnode_modulesフォルダを開きます。

node_modulesフォルダ

アドレスバーに「cmd」と入力し、Enterを押下します。

コマンドプロンプトの起動

コマンドプロンプトが開き、node_modulesフォルダが現在のフォルダになっていることを確認します。

2. モジュールのインストール

開いたコマンドプロンプトで以下3つのコマンドを実行します。

npm install querystring
npm install csv-string
npm install iconv-lite

これで必要なモジュールのインストールができました。

3. nodejsフォルダをzip化

node_modulesの親である、nodejsフォルダをzip化します。

nodejsフォルダをzip化

4. AWS Lambdaのレイヤーで「バージョンを作成」を押下

AWSに戻り、作成したLambdaのレイヤーを選択し、「バージョンの作成」を押下します。

バージョンの作成

5. nodejs.zipをアップロードしてバージョンを作成

先ほどzip化したnodejs.zipをアップロードし、ランタイムはNode.js18.xを選択したら作成ボタン押下します。

nodejszipをアップロードしランタイムはNode.js18xを選択

「正常に作成されました」のメッセージが表示されていれば、モジュールの追加は完了です。

正常に作成されました、のメッセージ画像

参照レイヤーを最新バージョンに変更

手順通りに作業するとLambdaが古いバージョンを参照しています。参照先レイヤーを最新バージョンに変更します。

1. レイヤーを編集ボタンを押下

コードに戻り、コード下部にあるレイヤーの編集ボタンを押下します。

コード下部にあるレイヤーの編集ボタン

2. 最新のレイヤーで保存

最新のレイヤーを選択し、保存ボタン押下します。

レイヤーバージョンの選択画面

画面上部に「正常に更新されました」のメッセージが表示されていれば、レイヤーの変更作業は完了です。

正常に更新されました、のメッセージ表示

作ったアプリを動かしてみよう!

任意のチャンネルから、ショートカットを起動します。

チャンネルからショートカット起動

アプリからのダイレクトメッセージにCSVファイルが送られてきます。

ダイレクトメッセージにCSVファイルが連携

連携されたファイルを開くと、ランキングデータの情報が確認できます。

連携されたファイルを開く

Excelで文字化けしている場合は、メモ帳で開いてみてください。

CSVファイルに今日の売り上げランキングが記載されていることを、確認できました!

まとめ:API連携アプリで業務を効率化しよう

今回は楽天が提供しているAPIで実装しましたが、普段利用しているサービスのAPIの連携もお試しください。SlackでAPI連携のアプリが作れると利便性が向上し、業務効率化に繋がります。

実際に当社で利用しているクラウドサービスとSlackアプリがAPI連携し、Slackに情報が集約されるようになったことで、とても便利になりました。

いつか、Slackだけで仕事が完結できるようになると最高です…!

これからも当社の取り組みやSlackに関する発見など発信していくのでチェックしてくださいね。

また、Slack導入や運用でお悩みの方は、こちらよりお気軽にご相談ください。