やりたかった事
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でヒットするキーワード以外は無反応ですが。。。機嫌が悪いわけでもないです。
課題
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ドキュメントの内容が少し把握できるようになって、プチ成長を感じました!