LINE botを勉強会の受付に導入してみたい！　～connpass APIの紹介～

#導入

　仕事は別に勉強会を開いているのですが、有志による運営のため手が回らないこところが多いです。その中でも受付業務にフォーカスして手助けになるシステムのプロトタイピングを行っています。

[Noodlで受付嬢を創った](https://speakerdeck.com/maepu/noodldeshou-fu-niang-wochuang-tuta)

　私と同じくユーザコミュニティの運営やイベントの開催をされている方に読んでいただいて、少しでも負担が軽くなるシステム例としていただけたら嬉しいです。

　勉強会といえば、IT関連の勉強会支援サービス**connpass**ですね。
と、いうことでconnpassのAPIを利用してLINE botと連携してみようと思いました。
この記事ではconnpass APIの紹介と簡単な使い方を書いています。

#connpass APIについて
　こちらの[connpass API](https://connpass.com/about/api/)からURLと検索クエリ、レスポンスについて解説されています。開催日時や場所だけでなく、サイトのHTMLまで入手できるとは....。

#実際にconnpass APIを使ってみる
　それでは試しにconnpass APIを使用し、どんなデータが返ってくるのか確かめてみようと思います。

　実行環境はノートPC上とし、ngrokでトンネリングしてLINEサーバと通信します。今回の動きとしては、LINE botにテキストを投げかけるとイベント名「Noodl」で検索し、そのレスポンスに含まれるイベントURLを返します。

 LINE botにテキストを投げるとこのように返答が来ます。

![LINE bot.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183282/e95f503b-9e89-9c16-6b75-88c3cc8555d5.jpeg)


##準備
　使用するjsライブラリは次の通りです。npmコマンドでインストールしましょう。

- axios
- express
- @line/bot-sdk

　npm initを行ったパスで次のコマンドを実行すると、必要なパッケージがインストールされます。

```
npm i axios express @line/bot-sdk
```

##実装
　LINE botの準備とNode.jsはネットに沢山情報があるため割愛します。最終的に次のコードとなりました。

```javascript
'use strict';

const axios = require('axios');         
const express = require('express');
const line = require('@line/bot-sdk');    // LINE
const PORT = process.env.PORT || 3000;

const config = {
    channelSecret: 'LINE MessagingAPIのチャンネルシークレット',
    channelAccessToken: 'LINE Messaging APIのアクセストークン'
};

const app = express();

app.get('/', (req, res) => res.send('Hello LINE BOT!(GET)')); //ブラウザ確認用(無くても問題ない)
app.post('/webhook', line.middleware(config), (req, res) => {
    console.log(req.body.events);

    //ここのif文はdeveloper consoleの"接続確認"用なので後で削除して問題ないです。
    if(req.body.events[0].replyToken === '00000000000000000000000000000000' && req.body.events[1].replyToken === 'ffffffffffffffffffffffffffffffff'){
        res.send('Hello LINE BOT!(POST)');
        console.log('疎通確認用');
        return; 
    }

    Promise
      .all(req.body.events.map(handleEvent))
      .then((result) => res.json(result));
});

const client = new line.Client(config);

function handleEvent(event) {
  var event_url;

  if (event.type !== 'message' || event.message.type !== 'text') {
    return Promise.resolve(null);
  }

  // connpass APIにアクセス
  // このURLがconnpass APIにアクセスするURL
  axios.get('https://connpass.com/api/v1/event/?keyword_or=Noodl')
  .then(function (response) {
    // handle success
    // イベントURLを
    event_url = response.data.events[0].event_url;
  })
  .catch(function (error) {
    // handle error
    console.log(error);
  })
  .finally(function () {
    // always executed
    console.log(event_url);
    console.log( typeof event_url );

    return client.replyMessage(event.replyToken, {
      type: 'text',
      text: event_url //実際に返信の言葉を入れる箇所
    });
  });
}

app.listen(PORT);
console.log(`Server running at ${PORT}`);
```

　重要なところだけ解説します。

### URL指定
　クエリの”keyword_or”が検索ワードを挿入する部分です。

```
https://connpass.com/api/v1/event/?keyword_or=Noodl
```

###URLを抜き出す
　次の処理で、大量にあるデータの中からイベントURLを抜き出しています。

```
event_url = response.data.events[0].event_url;
```

###LINE botで返答
 次の処理でイベントURLをユーザに送信しています。タイプはtextで問題ないです。

```
    return client.replyMessage(event.replyToken, {
      type: 'text',
      text: event_url //実際に返信の言葉を入れる箇所
    });
```


#おわりに
　今回はconnpass APIを使用し、LINE botと連携してイベントURLを返すデモとなりました。他にも面白そうなデータ（イベント開催場所の緯度経度、日時等）があるので拡張していきたいと思います。

　例えば、
 - Google スプレッドシートと連携して参加者の出欠確認。
 - GPSを拾って会場にいるときだけ受付可能にしたり。
 - イベント開催場所の最寄りのラーメン屋さんを紹介してくれたり...。

考えれば考えるほど面白いのがAPIの醍醐味ですね（笑）