前回つまって諦めたnowに再挑戦した記録。
ngrokで作った時の記事:
WikipediaのAPIを使ってLINEbotに調べてもらう
はじめに
前回同様、課題感とテーマとしては「ngrokだと使いたいときに使えない!だから常時使えるようにしたい!」です。
目次としては、
- now でだいぶハマる
- さらに now にハマる
- 対応したこと
です。
nowでだいぶハマる
nowを正しく動かすところでまずハマりました。
いくつかハマった気がして、だいたいはいじったりnow自体を消してやり直したりしたらできた印象だが、うっかりでハマったのがこの記事参照。
https://qiita.com/shima-07/items/64c051c9982ac0899b21
さらにnowにハマる
無事、ngrokを卒業して、nowを使ってLINE botができました。
が、、
なんか挙動がおかしい。ソースコードはngrokの時と何も変えてないのに。
botなのになんだか頭が悪い人間っぽさが出てきた・・・。
具体的には、
1. 初めて検索するキーワードにはwikipediaからの返り値を返してくれない。 (「初めてなので・・・」とかウブさはbotに求めてない)
2. 前回の回答を返してくる。(質問をちゃんと聞いて)
今回は「カラス?」と聞いているのに、「くま」について説明し始めた、、
3. 自動応答したいreplayMessageとWikipedia APIのpushMessageの順番がバラバラ(落ち着いてほしい…)
本当は「カラスの説明:」が上にきて、その下にwikipediaからの返答をのせたいのだけど、ずれる時がある。
nowにしたことで、何やら処理の順番とかが変わるようだ。。
対応したこと
https://qiita.com/n0bisuke/items/fb19ed3cd0138135ae69
この記事を見て、
asyncとawaitを使い、replyとpushの場所も変えてみた
変更前↓
.
省略
.
.
.
function handleEvent(event) {
if (event.type !== 'message' || event.message.type !== 'text') {
return Promise.resolve(null);
}
let mes = ''
// console.log(event.message.text);
if(event.message.text.indexOf('?') > -1){
// ?を含んでいる場合にはwikiで検索したものを出して、含んでない場合はurlを返す
var str = event.message.text;
var result = str.split( '?' ).join( '' ); //?を取り除く処理
mes = result + 'の説明:'; //wikiのbodyの前の一言
getBody(event.source.userId,result); //wiki APIで取得できたらプッシュメッセージ
}else{
var result = event.message.text;
mes = result + 'のURL:'; //wikiのurlの前の一言
getUrl(event.source.userId,result); //wiki APIで取得できたらプッシュメッセージ
}
return client.replyMessage(event.replyToken, {
type: 'text',
// text: event.message.text //実際に返信の言葉を入れる箇所
text : mes
});
}
const getBody = async (userId,word) => {
const res = await axios.get('http://wikipedia.simpleapi.net/api?keyword='+ encodeURIComponent(word) + '&output=json');
const item = res.data;
// console.log(item);
await client.pushMessage(userId, {
type: 'text',
text: item[0].body,
});
}
const getUrl = async (userId,word) => {
const res = await axios.get('http://wikipedia.simpleapi.net/api?keyword='+ encodeURIComponent(word) + '&output=json');
const item = res.data;
// console.log(item);
await client.pushMessage(userId, {
type: 'text',
text: item[0].url,
});
}
(process.env.NOW_REGION) ? module.exports = app : app.listen(PORT);
console.log(`Server running at ${PORT}`);
変更後↓(replyMessageをasyncとawaitを使って書き換え、場所も変えてみた。)
※?がある場合の分岐の抜粋。
async function handleEvent(event) {
if (event.type !== 'message' || event.message.type !== 'text') {
return Promise.resolve(null);
}
let mes = ''
// console.log(event.message.text);
if(event.message.text.indexOf('?') > -1){
// ?を含んでいる場合にはwikiで検索したものを出して、含んでない場合はurlを返す
var str = event.message.text;
var result = str.split( '?' ).join( '' ); //?を取り除く処理
mes = result + 'の説明:'; //wikiのbodyの前の一言
await client.replyMessage(event.replyToken, {
type: 'text',
// text: event.message.text //実際に返信の言葉を入れる箇所
text : mes
});
getBody(event.source.userId,result,mes); //wiki APIで取得できたらプッシュメッセージ
}
こういう対応ではダメだった?
これにしても直らず。
上記3つのおとぼけbotさんのままでした。。
次に、
いっそwikiの内容をとってくる関数の中にreplyMessage入れたらいいんじゃない?
と思い、やってみた。(完全に素人の悪あがき感。。)
const getBody = async (userId,word,message) => {
await client.replyMessage(event.replyToken, {
type: 'text',
// text: event.message.text //実際に返信の言葉を入れる箇所
text : message
});
const res = await axios.get('http://wikipedia.simpleapi.net/api?keyword='+ encodeURIComponent(word) + '&output=json');
const item = res.data;
console.log(item);
await client.pushMessage(userId, {
type: 'text',
text: item[0].body,
});
}
これでも、相変わらずおとぼけbotは治らず。。
今回も失敗…
前回の諦めポイントのnow自体からは進んだのですが、結果botがおとぼけさんになってしまった。
(もっと人間的な振る舞いをしたら可愛げがあって多少のミスも許せるが、、まだ十分な人間味もない。)
時間的にもきついので、しばらくはこれ以上深掘らず、いったんここまで。