無料で技術が学べるconnpassのイベント情報自動取得LINEbotを作ってみました！

#やりたかった事
LINE botとwebAPIを接続する練習。
connpassのwebAPIが扱いやすかったのと、connpassのイベントに普段から参加しているので自分のLINE botとconnpassのwebAPIを接続してみる事にしました。

#環境
* LINE Messaging API
* Heroku
* node.js

#connpassのwebAPIから情報を取り出す
Pythonというキーワードに関する情報を取り出します。
ブラウザに
https://connpass.com/api/v1/event/?keyword=python
と入力するとjsonが見れます。
出力されたjsonから欲しい情報だけを出力するようにしました。
今回は簡単にtitleだけを5件取得。


```javascript

const axios = require("axios");

async function main() {
    let response = await axios.get("https://connpass.com/api/v1/event/?keyword=python");
    for(i=0; i<5; i++){
        console.log(i+1 + ":" + response.data.events[i].title);
    }
}

main();
```


#LINE botで出力するように

```javascript

 return client.replyMessage(event.replyToken, {
            type: 'text',
            text: "1:" + response.data.events[0].title + "\n2:" + response.data.events[1].title + "\n3:" + response.data.events[2].title + "\n4:" + response.data.events[3].title + "\n5:" + response.data.events[4].title
        });
```

LINEのメッセージでキーワードを入力してもらい、そのキーワードに関する答えを返すように、compassのwebAPIから情報を取り出す時に書いたコードを若干修正。


```javascript

let response = await axios.get("https://connpass.com/api/v1/event/?keyword=" + event.message.text );
    for(var i=0; i<5; i++){
        console.log(i+1 + ":" + response.data.events[i].title);
    }
```

#Herokuへ上げてデモを体験できるようにしました！
LINEお友達追加していただくと、今回私の作ったbotの動きを見れます。
とてもシャイなbotなので、自分からどんどん話しかけてあげてください！
connpassでヒットするキーワード以外は無反応ですが。。。機嫌が悪いわけでもないです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820683/b7ba873c-cee4-d1f4-bbad-ca5ca3c0f8a5.png)


#課題
LINE botで出力する部分ですが、for文で回したかったのですがエラーが出てしまい、時間も無かったので0~4まで配列が手書きという事に。。。泣

また、botのスタートは
「connpassで調べてたいイベントのキーワードをメッセージに入れて下さい」
など、もっと丁寧にしたかったです。

ヒットするキーワード以外のメッセージを受け取った時も
「キーワードではイベントが見つかりません」
とか、もっともっと丁寧なbot作りたかったです。。。

#続編
LINEbotでのメッセージのやり取りについて

1.リッチメニューをクリックすると【イベント教えて】とテキストを出力
2.botより【調べたいキーワードをにゅうりょくしてください】とメッセージを送信
3.【キーワード】メッセージへ入力
4.イベント情報が最大5件出力される

まで実装させる事が出来ました！

LINE Messageingでの改行方法について以下の記事のお世話になりました。
https://qiita.com/naoki110529/items/66b010de0e6db8211b0f

#コード

```javascript

'use strict'; // おまじない

// ########################################
//               初期設定など
// ########################################

// パッケージを使用します
const axios = require("axios");
const express = require('express');
const line = require('@line/bot-sdk');

// ローカル（自分のPC）でサーバーを公開するときのポート番号です
const PORT = process.env.PORT || 3000;

// Messaging APIで利用するクレデンシャル（秘匿情報）です。
const config = {
    channelSecret: 'シークレットキーを入力',
    channelAccessToken: 'アクセストークンを入力'
};

// ########################################
//  LINEサーバーからのWebhookデータを処理する部分
// ########################################

// LINE SDKを初期化します
const client = new line.Client(config);

// LINEサーバーからWebhookがあると「サーバー部分」から以下の "handleEvent" という関数が呼び出されます
async function handleEvent(event) {
    // 受信したWebhookが「テキストメッセージ以外」であればnullを返すことで無視します
    if (event.type !== 'message' || event.message.type !== 'text') {
        return Promise.resolve(null);
    }

    //リッチメニューをクリックすると【イベント教えて】とメッセージ送信するように設定
    if (event.message.text == "イベントを教えて") {
        return client.replyMessage(event.replyToken, {
            type: 'text',
            text: "調べたいキーワードを入力してください" //← ここに入れた言葉が実際に返信されます
        });

    }

    //入力してもらったメッセージをキーワードに設定
    let response = await axios.get("https://connpass.com/api/v1/event/?keyword=" + event.message.text);
    let judge = response.data.events.length;


    //6件以上あった場合は5件まで。0件の場合はメッセージを出力
    if (judge > 6) {
        judge = 5;
    } else if (judge == 0) {
        return client.replyMessage(event.replyToken, {
            type: 'text',
            text: "キーワードに該当するイベントが見つかりませんでした。もう一度キーワードを入力してください。" //← ここに入れた言葉が実際に返信されます
        });
    }

    //複数件のイベント情報をmesに代入
    let mes = "";
    for (var i = 0; i < judge; i++) {
        console.log(i + 1 + ":" + response.data.events[i].title);
        mes += i + 1 + ":" + response.data.events[i].title + "\n";
    }
    // 最後にイベント情報を出力
    return client.replyMessage(event.replyToken, {
        type: 'text',
        text: mes //← ここに入れた言葉が実際に返信されます
    });
}

// ########################################
//          Expressによるサーバー部分
// ########################################

// expressを初期化します
const app = express();

// HTTP GETによって '/' のパスにアクセスがあったときに 'Hello LINE BOT! (HTTP GET)' と返事します
// これはMessaging APIとは関係のない確認用のものです
app.get('/', (req, res) => res.send('<h1>Hello LINE BOT! (HTTP GET)</h1>'));

// HTTP POSTによって '/webhook' のパスにアクセスがあったら、POSTされた内容に応じて様々な処理をします
app.post('/webhook', line.middleware(config), (req, res) => {
    // Webhookの中身を確認用にターミナルに表示します
    console.log(req.body.events);

    // 空っぽの場合、検証ボタンをクリックしたときに飛んできた"接続確認"用
    // 削除しても問題ありません
    if (req.body.events.length == 0) {
        res.send('Hello LINE BOT! (HTTP POST)'); // LINEサーバーに返答します
        console.log('検証イベントを受信しました！'); // ターミナルに表示します
        return; // これより下は実行されません
    }

    // あらかじめ宣言しておいた "handleEvent" 関数にWebhookの中身を渡して処理してもらい、
    // 関数から戻ってきたデータをそのままLINEサーバーに「レスポンス」として返します
    Promise.all(req.body.events.map(handleEvent)).then((result) => res.json(result));
});

// 最初に決めたポート番号でサーバーをPC内だけに公開します
// （環境によってはローカルネットワーク内にも公開されます）
app.listen(PORT);
console.log(`ポート${PORT}番でExpressサーバーを実行中です…`);

```

#終わりに
今回使ったconnpassのwebAPIはわかりやすく使い方の解説までついていました。
細かな解説が無くても自分で想像してwebAPIが扱えるように色々なwebAPIにチャレンジしていきます！

LINEドキュメントの内容が少し把握できるようになって、プチ成長を感じました！

#connpass webAPIリファレンス一覧
[connpass webAPIリファレンス](https://connpass.com/about/api/)