LoginSignup
11
2

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-11-09

やりたかった事

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件取得。


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で出力するように


 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から情報を取り出す時に書いたコードを若干修正。


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

課題

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

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

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

続編

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

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

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

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

コード


'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リファレンス

11
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
2