Open18
LINE Bot、Visual Studio Code、obnizの連携について(入門メモ)
【Visual Studio Code】
インストール
まずは、インストール実施
VSCodeの基本操作
下記基本操作ページを参照しながら、進める
1時間でLINE BOTを作るハンズオン
@n0bisukeさんの下記LINE BOTのQiita記事を参考にして、環境を構築
友達全員にメッセージを送るシンプルな送信専用LINE BOTを作る
@n0bisukeさんの下記LINE BOTのQiita記事を参考にする。
ソースコード
$ mkdir mylinebot
$ cd mylinebot
Node.jsでWebのAPIにアクセスし、様々な情報を取得!
設定~QiitaのAPIを試してみる。
ソースコード参照
ターミナル
npm i axios
共通テンプレート
'use strict';
// ########################################
// 初期設定など
// ########################################
// パッケージを使用します
const express = require('express');
const line = require('@line/bot-sdk');
const axios = require('axios');
// ローカル(自分のPC)でサーバーを公開するときのポート番号です
const PORT = process.env.PORT || 3000;
// Messaging APIで利用するクレデンシャル(秘匿情報)です。
const config = {
channelSecret: '作成したBotのチャネルシークレット',
channelAccessToken: '作成したBotのチャネルアクセストークン'
};
// ########## ▼▼▼ サンプル関数 ▼▼▼ ##########
(この行をサンプル関数丸ごと全部と置き換えてね)
// ########## ▲▲▲ サンプル関数 ▲▲▲ ##########
// ########################################
// 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);
}
// サンプル関数を実行します
return sampleFunction(event);
}
// ########################################
// Expressによるサーバー部分
// ########################################
// expressを初期化します
const app = express();
// HTTP POSTによって '/webhook' のパスにアクセスがあったら、POSTされた内容に応じて様々な処理をします
app.post('/webhook', line.middleware(config), (req, res) => {
// 検証ボタンをクリックしたときに飛んできたWebhookを受信したときのみ以下のif文内を実行
if (req.body.events.length === 0) {
res.send('Hello LINE BOT! (HTTP POST)'); // LINEサーバーに返答します(なくてもよい)
console.log('検証イベントを受信しました!'); // ターミナルに表示します
return; // これより下は実行されません
} else {
// 通常のメッセージなど … Webhookの中身を確認用にターミナルに表示します
console.log('受信しました:', req.body.events);
}
// あらかじめ宣言しておいた "handleEvent" 関数にWebhookの中身を渡して処理してもらい、
// 関数から戻ってきたデータをそのままLINEサーバーに「レスポンス」として返します
Promise.all(req.body.events.map(handleEvent)).then((result) => res.json(result));
});
// 最初に決めたポート番号でサーバーをPC内だけに公開します
// (環境によってはローカルネットワーク内にも公開されます)
app.listen(PORT);
console.log(`ポート${PORT}番でExpressサーバーを実行中です…`);
この「サンプル関数」の全体を、丸ごと書き換えし、 Node.jsサーバーを再起動
QiitaAPI連携参考
ソースコード
const getQiitaTag = async (userId, tag) => {
let result = '';
try {
// axiosでQiitaのAPIを叩きます
const res = await axios.get('https://qiita.com/api/v2/tags/' + encodeURIComponent(tag));
const item = res.data;
result = 'Qiitaのタグ「' + tag + '」の記事数は、' + item.items_count + '件です!';
// ターミナルにも検索結果を出しておきます
console.log(`「${tag}」の検索結果:${item.items_count}件`);
// 正常に取得できればここで終了
} catch (error) {
// HTTPステータスコードが404ならタグが見つからない、それ以外は別のHTTPエラーです
const { status, statusText } = error.response;
if (status == 404) {
result = 'Qiitaのタグ「' + tag + '」の記事はありませんでした';
} else {
result = `エラー: ${status} ${statusText}`;
}
}
// リプライではなく「プッシュ」を送ります
// Botからユーザーへ一方的に通知を送ることができる機能です
await client.pushMessage(userId, {
type: 'text',
text: result,
});
}
const sampleFunction = async (event) => {
// ユーザーIDとメッセージ文字列を関数に渡します
// メッセージ文字列でQiitaタグを検索し、結果をQiitaから受け取ったらユーザーIDに対して「プッシュ」送信します
// 検索には少し時間がかかるので、これの結果は後でユーザーに送られます
getQiitaTag(event.source.userId, event.message.text);
// こちらが先に返事を返します
// ユーザーからのメッセージに対する「リプライ」です
// リプライは、受信したメッセージ1つにつき1回しか使えません
return client.replyMessage(event.replyToken, {
type: 'text',
text: '検索しています……'
});
};
!
実際のLINE画像
@mikan_the_thirdさんのお勧めAPI参考にする。
obniz活用し、LEDランプオン!
led.jsを新規作成して、以下のソースコード貼り付け。Node.jsで実行
ソースコード
const Obniz = require('obniz');
const obniz = new Obniz('Obniz_ID'); // Obniz_IDに自分のIDを入れます
obniz.onconnect = async function () {
const led = obniz.wired("LED", {anode:0, cathode:1});
led.on();
}
obnizのディスプレイとスイッチ連携(コード偏)
VSCodeで、新規ファイルを作成し、ソースコード貼り付け、Node.js実行
ソースコード
const Obniz = require('obniz');
const obniz = new Obniz('Obniz_ID'); // Obniz_IDに自分のIDを入れてください
// obnizがオンラインであることが確認されたら、以下の関数内が自動で実行されます
obniz.onconnect = async function () {
obniz.display.clear(); // 画面を消去
obniz.display.print('Hello obniz!'); // Hello obniz! と画面に表示
// スイッチの反応を常時監視、変化があれば実行します
obniz.switch.onchange = function (state) {
if (state === 'push') {
// 押されたとき
console.log('pushed');
obniz.display.clear(); // 画面を消去
obniz.display.print('pushed'); // pushed と画面に表示
} else if (state === 'right') {
// 右にスイッチを倒したとき(やさしく)
console.log('pressed right');
obniz.display.clear(); // 画面を消去
obniz.display.print('pressed right'); // pressed right と画面に表示
} else if (state === 'left') {
// 左にスイッチを倒したとき(やさしく)
console.log('pressed left');
obniz.display.clear(); // 画面を消去
obniz.display.print('pressed left'); // pressed left と画面に表示
}
}
}
obnizとスピーカー
公式ドキュメント
曲作り参考(音階周波数)
時報
ソースコード
const Obniz = require('obniz');
const { exit } = require('process');
const obniz = new Obniz('Obniz_ID'); // Obniz_IDに自分のIDを入れます
// 任意の秒数待つことができる関数
// 参考: https://qiita.com/suin/items/99aa8641d06b5f819656
const sleep = (msec) => new Promise(res => setTimeout(res, msec));
// obnizが接続済み
obniz.onconnect = async function () {
// スピーカーを利用
const speaker = obniz.wired('Speaker', { signal: 0, gnd: 1 });
// ポッ↓
speaker.play(500); await sleep(300); speaker.stop(); await sleep(700);
// ポッ↓
speaker.play(500); await sleep(300); speaker.stop(); await sleep(700);
// ポッ↓
speaker.play(500); await sleep(300); speaker.stop(); await sleep(700);
// ポ~~~ン↑
speaker.play(1000); await sleep(1000); speaker.stop();
// Ctrl+C を打たなくても自動で終了します
exit();
}
応用編 参考ページ集
公式製作例
参考になりそうなサイト(Qiita質問に対する回答)
Google App Scripts(GAS)が活用できそう。
GASのトリガー機能
ポストのobniz(赤外線センサ)→ GAS → スプレッドシートX
スプレッドシートX → GAS → LineBot
スプレッドシートX → GAS → 室内のobniz(音と光による通知)
Qiita質問時、@bizzpaperさんが教えてくれたサイト