Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 8883

LINEBOTとCOTOHA APIで自分を励ましてみた。

$
0
0
最初に LINE BOTの勉強がてら、NTTコミュニケーションズのCOTOHA APIを使ってみたので、やった事メモを残しておく。 環境 MacOS Catalina 10.15.7 Node.js 16.0.0 android 11 LINE設定 まず、LINEです。LINEアカウントを取得し、LINEデベロッパーに登録。 プロバイダーを作成 MessagingAPIの新規チャネルを作成 アンケートと規約に合意する。 webhook設定で、ngrokで作られる自分のPCの公開用URL+/webhookを指定する。 参考 COTOHA設定 COTOHA apiのデベロッパー登録を行う。 これでclientIdとClientSecretを取得できる。 さらにアクセストークンが必要なので、curlで行った。 アクセストークンの有効時間は24時間。 24時間経ったら取り直し。 curl -X POST -H "Content-Type:application/json" -d '{ "grantType": "client_credentials", "clientId": "[clientId]", "clientSecret": "[clientSecret]" }' https://api.ce-cotoha.com/v1/oauth/accesstokens 参考 本家 https://api.ce-cotoha.com/contents/index.html NGROK設定 LINEのWeb-hookを自分のPCに通すためNGROKを使用した。 以下インストールと起動。 nom i g ngrok ngrok http 3000 参考 https://qiita.com/Marusoccer/items/7033c1bb9c85bf6789bd Node.js アプリ 作ったアプリはこんな感じ。 server.js 'use strict'; // ######################################## // 初期設定など // ######################################## // パッケージを使用します const express = require('express'); const line = require('@line/bot-sdk'); const axios = require('axios'); const { message } = require('statuses'); const { response } = require('express'); // ローカル(自分のPC)でサーバーを公開するときのポート番号です const PORT = process.env.PORT || 3000; // Messaging APIで利用するクレデンシャル(秘匿情報)です。 const config = { channelSecret: 'foo', channelAccessToken: 'foo' }; // ########## ▼▼▼ サンプル関数 ▼▼▼ ########## const sampleFunction = async (event) => { let postconfig = { headers: { 'Content-Type' : 'application/json;charset=UTF-8', 'Authorization' : 'curlで取得したCOTOHAのアクセストークン', } }; let postdata = { "sentence" : event.message.text }; let URL="https://api.ce-cotoha.com/api/dev/nlp/v1/sentiment"; try { await axios  .post(URL, postdata, postconfig)  .then(response =>{ const a = JSON.parse(JSON.stringify(response.data.result)); console.log(a); switch (a.sentiment){ case 'Negative': pushtext = "頑張ろー"; break; case 'Positive': pushtext = "ノリノリですね" break; default: pushtext = "何か面白い事はないのですか。" } }); } catch (error) { pushtext = '検索中にエラーが発生しました。ごめんね。'; // APIからエラーが返ってきたらターミナルに表示する console.log(error); } return client.pushMessage(event.source.userId, { type: 'text', text: pushtext }); }; // ######################################## // LINEサーバーからのWebhookデータを処理する部分 // ######################################## // LINE SDKを初期化します const client = new line.Client(config); let pushtext=""; // 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サーバーを実行中です…`); 結果 会話するとこんな感じ。 cotohaの感情分析APIは文章をNegative、Positive、Neutralの3つに分類する。 今回は、Positiveなら、「ノリノリですね。」、Negativeなら「頑張ろー」、Neutralなら「何か面白い事はないのですか。」と返してみた。 「今日は彼女ができた。」はNeutralと判定されている。どうも、好きとか最高とかの形容詞がないとPositive判定されないようだ。 今回どハマりしたのは、COTOHAのレスポンスを解釈するところ。 結局下記URLの対処で切り抜けた。 もう一工夫欲しいかもだけど、今日はここまで。

Viewing all articles
Browse latest Browse all 8883

Trending Articles