IM@SparqlをSlackのコマンドで叩くやつを作る

2019年10月19日

こんにちは。、 .ごっちです。

これはアイマスもくもく会 003 のアウトプットです。

IM@Sparql をいろいろな手段を使ってたたいているのは去年からやっていました。 im@sparql を TypeScript でたたいてみる *こんにちは、.ごっちです。*medium.com 今日誕生日のアイドルを出力する CircleCI orb をつくったお話 *こんにちは、 .ごっちです。*medium.com

今回は Slack の /コマンドを使います。

準備

Slack アプリを用意します。このあたりは公式のチュートリアルがとても参考になります。 Slack | Bolt *このガイドでは、Bolt を使用して Slack アプリを起動し実行する方法について説明します。その過程で、新しい Slack アプリを作成し、ローカル環境を設定し、Slack…*slack.dev

チュートリアルに則って言語は Nodejs を使います。あとは SlackApp を新規で作成したり開発用の環境変数を用意したり作業用の Slack のワークスペースを用意したりします。

実装

ざっくりコード ↓

const fetch = require('node-fetch');
const { App } = require('@slack/bolt');

const app = new App({
  token: process.env.SLACK_BOT_TOKEN,
  signingSecret: process.env.SLACK_SIGNING_SECRET
});

app.command('/imasparql', async ({ command, ack, say }) => {
  ack();

  const url = "https://sparql.crssnky.xyz/spql/imas/query?query=" + encodeURIComponent(command.text.replace("`", "").replace("`", ""));

  fetch(url).then(function(response) {
    return response.json();
  })
  .then(function(imasJson) {
    say(JSON.stringify(imasJson));
  })

});

(async () => {
  await app.start(process.env.PORT || 3000);
  console.log('⚡️ Bolt app is running!');
})();

実際の動き

ちょっとだけコード解説

/imasparql の入力があったら、反応するようになっています。

command.text で /以降のテキストを取得できるので、その文字列をエンコードして get パラメータとして渡しています。

ここで不具合っぽいのが、そのまま渡すと ‘が全角の状態でエンコードされてリクエストに失敗するという地味なものがあります。。なので、Sparql のクエリとして投げるときは `を始めと終わりにたさなければいけません(直したい

のこりは実際に fetch リクエストを送って、返却された JSON をテキスト化して Slack に投げているだけです。

今後

RT などの反応をみたところ、需要がありそうななさそうな状態だったけども自分には需要があるので、もうちょっと作り込もうかと思います。

作りきったらサーバーなりに乗っけて Slack にアプリ申請でも出そうかと思います。

ちなみに Twitter の動画にあったこれは

PREFIX schema: <http://schema.org/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX imas: <https://sparql.crssnky.xyz/imasrdf/URIs/imas-schema.ttl#>
SELECT (sample(?n) as ?name)
WHERE {
  ?s rdf:type imas:Idol;
     schema:name|imas:nameKana ?on;
     schema:name ?n;
  FILTER(CONTAINS(str(?on), 'あまみ')).
}group by(?n)

で取得できます。

ProfilePicture

Yuta Goto

フリーランスのソフトウェアエンジニアです。現在はReact.jsを使用したWebフロントエンドの開発やRuby on Railsを使用したサーバサイドの開発を行っています。