延續上一篇的內容,在index.js檔,加入指定使用ejs樣板引擎處理首頁請求的相關敘述,筆者把篩選AQI空氣指標回應內容的程式單獨寫在readAQI()自訂函式:
ejs引擎的相關說明請參閱《超圖解物聯網IoT實作入門》第八章「認識樣版引擎」單元。將此程式上傳到heroku平台(參閱下文),在瀏覽器中開啟這個應用程式首頁,將能看到樣版引擎整合空氣指標數據的結果:
接收與處理Line文字訊息
linebot套件的Github載點裡的demo.js檔,包含所有事件類型以及不同訊息內容的處理示範程式。底下是收到訊息後,處理各種訊息類型的程式架構:
本程式只需處理並回應文字訊息。假設用戶輸入「空氣」文字,這個Line聊天機器人將查詢空氣品質並回應(reply)給使用者,這部份的程式碼如下:
底下是本單元的完整index.js原始碼:
const linebot = require('linebot'); const express = require('express'); const rp = require('request-promise'); const bodyParser = require('body-parser'); const SITE_NAME = '西屯'; const aqiOpt = { uri: "http://opendata2.epa.gov.tw/AQI.json", json: true }; const bot = linebot({ channelId: process.env.CHANNEL_ID, channelSecret: process.env.CHANNEL_SECRET, channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN }); function readAQI(repos){ let data; for (i in repos) { if (repos[i].SiteName == SITE_NAME) { data = repos[i]; break; } } return data; } const app = express(); app.set('view engine', 'ejs'); const linebotParser = bot.parser(); app.get('/',function(req,res){ rp(aqiOpt) .then(function (repos) { res.render('index', {AQI:readAQI(repos)}); }) .catch(function (err) { res.send("無法取得空氣品質資料~"); }); }); app.post('/linewebhook', linebotParser); bot.on('message', function (event) { switch (event.message.type) { case 'text': switch (event.message.text) { case '空氣': let data; rp(aqiOpt) .then(function (repos) { data = readAQI(repos); event.reply(data.County + data.SiteName + '\n\nPM2.5指數:'+ data["PM2.5_AVG"] + '\n狀態:' + data.Status); }) .catch(function (err) { event.reply('無法取得空氣品質資料~'); }); break; case 'Me': event.source.profile().then(function (profile) { return event.reply('Hello ' + profile.displayName + ' ' + profile.userId); }); break; } break; case 'sticker': event.reply({ type: 'sticker', packageId: 1, stickerId: 1 }); break; default: event.reply('Unknow message: ' + JSON.stringify(event)); break; } }); app.listen(process.env.PORT || 80, function () { console.log('LineBot is running.'); });
上傳更新檔到Heroku平台
修改好index.js之後,開啟「命令提示字元」或「終端機」,進入linebot的根目錄,執行heroku login命令並輸入你的e-mail和密碼登入heroku,再執行git commit和git push指令,把更動過的檔案上傳到heroku平台(請參閱「佈署與測試Echo Bot」):
最後,在Line App裡面對你的LineBot輸入「空氣」,它將回應最新的空氣品質指數:
老师,在您的《完美图解IOT》书中第六章的示例程序当中,影像侦测控制文件夹里的html文件打开后是一个空白的网页,并没有任何显示,而影像侦测基础的可以打开并且能够完成人脸识别。我怀疑需要的npm包已经安装好,是不是基本库文件缺失?只有tracking-min.js和face-min.js这两个文件,还是我的npm包没有下载全?但是我确认了,书中要求的三种express、socket.io、johnny全都有,实在不知道问题在哪里,打开就是个空白页面什么也没有。
hi harry:
人脸识别示例采用socket.io通信,所以express、socket.io、johnny这三个包就够了,请问你有通过node server的地址开启网页吗?
此node server默认运行在5438端口,所以你需要在通过这个位址浏览本机服务器的网页:127.0.0.1:5438
另外,www/路径里的index.html里面有代码,请用文本编辑器开启确认,谢谢!
thanks,
jeffrey
老師你好,我想輸入關鍵字來取得資訊,我的關鍵字必須使option裡的值改變。
類似 https://github.com/simonhsu/line-bot-with-imgur-image-reply-example/blob/master/index.js
請問該如何做呢?
我是為新手,因您的格式較為清楚,連結裡作者使用方式我還不太清楚…謝謝
我不清楚你的目的,但原作者的說明頁有提到,把程式裡的幾個關鍵值,像
_KEYWORD1_, _LINE_CHANNEL_ACCESS_TOKEN_,.. 換成你的參數,就能測試了。
have fun!
jeffrey
谢谢 老师,这次程序已经可以使用了,还是问老师一个问题,Arduino电源智能供给一个舵机的使用?老师有电路图么?
如果只连接一个舵机,直接用Arduino的5V电源即可。
舵机的电源也能连接到外部电源,但外部电源的接地、舵机的接地和Arduino的接地要相连。
thanks,
jeffrey
谢谢 老师!已经能够正常运转了。感谢你的书还有这个网站,我对IOT的启蒙全仰仗于老师,谢谢。
老师 ,我还想问下,大陆不能使用LINE ,您觉得QQ也好、微信也好这类大陆使用的软件有没有也可以这么使用的。
微信的平台很强大,有支持第三方程序,只是我没用过,你可以参考微信官方的「微信开放平台」说明。
thanks,
jeffrey
老師您好,操作完上述後出現”Internal Server Error”,請問是哪裡出了問題?
老師您好,在herokuapp.com可以跑出來資訊了,但是在linebot對話打”空氣”卻無法出現對應的PM2.5回應?
我剛剛在Line還有Heroku的首頁測試讀取空氣品質資料都沒問題。
thanks,
jeffrey
你好我沒學過程式
我直接照著複製他說19行錯誤,請問怎麼修改😂
老師您好 , 照著教學上的 ,
git init > heroku git:remote -a XXX帳號 >
git add . >
git commit -am “make it better” >
git push heroku master >
heroku open >
出現網頁 “Hello World” ,
到目前為止都沒問題 , 但複製 上面的 空氣品質的 index.js 文件 置換 原本的 hello world 的 index.js 文件後 ,
git commit -am “make it better” >
git push heroku master >
heroku open >
網頁上出現的是 “Internal Server Error”
反覆做了幾天 , 還是沒能找出正確的做法 , 不知道老師有沒有遇到這相關的問題~
“Internal Server Error” 代表你的伺服器程式設定有問題,請問你有設定Heroku平台的應用程式環境變數嗎?
thanks,
jeffrey
老師你好,請問有辦法讓聊天機器人從ifttt信息讀取字串並由聊天機器人送出嗎?ifttt 會把消息透過Line notify傳給使用者,但我希望是聊天機器人能有辦法讀取那個字串再由機器人傳出
謝謝老師
老師你好, 以下有個問題想請教:
昨天練習此單元時能正常執行, 機器人能在我輸入空氣後, 回傳臺中市西屯的空氣品質,
但今日練習第七章單元時, 輸入heroku open 後網站會出現”Application error”錯誤,
原本以為是我在第七章單元的資料輸入錯誤, 因此先將程式還原成第六章的程式,
但還原後再執行heroku open 後還是會出現”Application error”錯誤,
查詢heroku logs –tail –app goround-coman後看到有以下錯誤訊息
2020-04-21T03:05:51.013973+00:00 heroku[router]: at=error code=H10 desc=”App crashed” method=GET path=”/” host=goround-coman.herokuapp.com request_id=a239b929-ec98-42d3-870a-ae8e48c62c86 fwd=”118.163.56.205″ dyno= connect= service= status=503 bytes= protocol=https
網路上資料寫說H10是應用程式當機, 請問這有甚麼解決方法嗎?
試過heroku restart還是有一樣錯誤.
關於Heroku平台的H10-App Crash(應用程式當掉)錯誤,Lawrence Eagles先生總結了一篇貼文:Causes of Heroku H10-App Crashed Error And How To Solve Them
重點摘譯:
Heroku平台的錯誤代碼範圍:
1 .H10至H99
2. R10至R99
3. L10至L15
官方的完整錯誤代碼列表與簡述:Complete Heroku Error Codes
幾個導致H10-App Crash(應用程式當掉)錯誤的因素和解決方式:
1. Procfile內容有誤
例如,應用程式名稱寫錯了;多餘的空白也會引發錯誤:
錯誤寫法:web : node index.js
正確寫法:web:node index.js
2. 在Heroku的環境變數中設定PORT變數
Heroku會自動設定埠號,應用程式可透過process.env.PORT環境變數取得此數值。自行設定此參數,應用程式會當掉。執行這個命令可列舉Heroku App的環境變數:
3. 遺漏必要的環境變數
沒有設定應用程式所需的環境變數
4. 遺漏必要的程式檔
以Node.js環境來說,若沒有指定”start”(啟動)的程式檔,應用程式會當掉。
5. 設定執行環境版本
若上面的方法無效,請嘗試在package.json檔案中指定Node.js版本(此例為12.11.1):
thanks,
jeffrey
老師您好 想請問這個方式能取得氣象局最新的降雨機率和溫度嗎?
只要是能從網路取得的資料都可以。
thanks,
jeffrey