iT邦幫忙

2019 iT 邦幫忙鐵人賽

10
Modern Web

人人可作卡米狗,連載再開系列 第 2

卡米哥教你做 Line 鬧鐘

大家好,我是卡米哥

本系列文中的每篇文章,都將會是從頭開始製作的聊天機器人。

第零步:環境安裝

第一步:建立專案

首先你要找到一個放專案的資料夾,然後開啟對應的小黑框,輸入以下指令:

rails new alarm_demo

然後進入專案:

cd alarm_demo

第二步:安裝套件

在 rails 中,可以透過修改 Gemfile 來安裝套件,也可以使用指令來幫我們修改 Gemfile,這次教怎麼用指令安裝套件。

bundle add line-bot-api

第三步:製作 Service

請在 app 資料夾下新增 services 資料夾,然後在 services 資料夾下新增 alarm_service.rb 檔案。

https://ithelp.ithome.com.tw/upload/images/20181209/20107309MymGdk95S2.png

然後輸入以下程式碼:

require 'line/bot'

class AlarmService
  def client
    @client ||= Line::Bot::Client.new do |config|
      config.channel_secret = '你的 line channel secret'
      config.channel_token = '你的 line channel token'
    end
  end

  def run
    message = {
      type: "text",
      text: "現在時間:#{Time.current} 趕快起床吧"
    }
    client.push_message('你的 line user id', message)
  end
end

如果你還沒有註冊 line bot,你可以到 line developer 後台 註冊一個,你可以在 line developer 後台找到以下資訊:

  • 你的 line channel secret
  • 你的 line channel token
  • 你的 line user id (通常在頁面的最下方)

然後填入程式碼中。

第四步:測試 Service

在你的小黑框(需在專案資料夾下)輸入以下指令:

rails c

進入 rails console 後,輸入以下程式碼:

AlarmService.new.run

如果你看到的是以下回應,那麼你應該會在 line bot 那邊收到訊息了。

 => #<Net::HTTPOK 200 OK readbody=true>

如果你看到的是以下回應,那代表你的 line channel token 或者 line channel secret 打錯了。

#<Net::HTTPUnauthorized 401 Unauthorized readbody=true>

如果你發現你打錯了,在你修改程式碼之後,你可能會需要輸入 exit 離開後再重新 rails c 進入 rails console,否則你的修改可能無法正確載入。

如果你看到的是以下回應,那代表你的 line user id 或者 message 打錯了。

#<Net::HTTPBadRequest 400 Bad Request readbody=true>

請詳加檢查。

第五步:建立 Task

回到小黑框,輸入以下指令建立 rake task

rails g task line alarm

建立好了之後你會發現在你的專案資料夾下的 lib/tasks 下多了一個檔案 line.rake,其內容如下:

namespace :line do
  desc "TODO"
  task alarm: :environment do
      
  end
end

我們將他修改成這樣:

namespace :line do
  task alarm: :environment do
    AlarmService.new.run
  end

end

其實這就是把我們剛剛寫好的程式填進去而已。

第六步:測試 Task

回到小黑框,輸入以下指令:

rails line:alarm

或者輸入

rake line:alarm

這就是 rake task,他的功能其實就是幫我們打開 rails c 之後再執行我們想要執行的程式。

有了 rake task 之後就能夠使用排程去觸發 line bot 了。

第七步:發布到 Heroku

在發布之前,因為 Gemfile 沒有 sqlite3,所以我們需要調整一下 Gemfile,請將以下程式:

# Use sqlite3 as the database for Active Record
gem 'sqlite3'

改為

# Use sqlite3 as the database for Active Record
group :development, :test do
  gem 'sqlite3'
end
group :production do
  gem 'pg'
end

建立一個 heroku 新專案:

heroku create 你的專案名稱

其中,專案名稱只能用英文、數字和減號。好了之後上傳程式碼:

git add .
git commit -m "line alarm"
git push heroku master

第八步:測試 Heroku

上傳完成後使用以下指令來測試:

heroku run rails line:alarm

如果有收到來自 line bot 的訊息就表示成功了

第九步:安裝 Heroku 排程器

在 Heroku 上要定期執行程式的話,需要安裝 addons,我們需要的 addons 叫做 scheduler,他是免費的,所以可以安心使用。

在專案資料夾下使用以下指令進行安裝:

heroku addons:create scheduler:standard

可以輸入以下指令查看說明文件(全英文):

heroku addons:docs scheduler

第十步:設定 Heroku 排程

安裝好了之後我們需要設定排程,Heroku 其實有做讓我們設定排程的後台,輸入以下指令開啟後台。

heroku addons:open scheduler

你應該會看到下面這個畫面:

https://ithelp.ithome.com.tw/upload/images/20181209/20107309Yzp4RJs23T.png

點擊Add new job 之後會看到這個畫面:

https://ithelp.ithome.com.tw/upload/images/20181209/20107309GMXWzaQYiR.png

$ 號後面就是要填上我們想要執行的指令,其實就是我們做好的 rake task,這裡就填入:

rails line:alarm

然後先選擇每 10 分鐘觸發一次,就可以按下 Save 了。Save 之後,應該會看到以下畫面:

https://ithelp.ithome.com.tw/upload/images/20181209/20107309Nqf2pJbpTc.png

接著就是等 10 分鐘了。

完成

以下開放許願,下一篇大家想看什麼內容?


上一篇
Fix 無法發文的問題
系列文
人人可作卡米狗,連載再開2
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
3

卡米姐?
/images/emoticon/emoticon39.gif

叫我哥 謝了

名字太像姐~/images/emoticon/emoticon10.gif

1
julianwang422
iT邦新手 5 級 ‧ 2018-12-11 19:35:01

卡米大我希望能夠有發歌的BOT
或是計算機還有貼圖回復的功能
謝謝!

1
julianwang422
iT邦新手 5 級 ‧ 2018-12-11 19:43:43

https://ithelp.ithome.com.tw/upload/images/20181211/20113803g5VqUdwlb3.png
卡米大請問一下如果我用我之前做的卡米狗的LINE BOT
要加上鬧鐘的功能是不是不能呢
以上是我用之前做出來的LINE BOT的帳號
他會出現403FORBIDDEN
請問一下該怎麼把鬧鐘功能加到卡米狗裡面呢?
還是只能分成兩個不同的帳號?

可以做在同一個專案也可以分開

2
lee98064
iT邦新手 5 級 ‧ 2018-12-16 20:41:16

卡米哥請問一下
如果用了Heroku Scheduler這個功能的話,伺服器是不是會一直醒著不會休息呀?
然後他要求要用Heroku Scheduler綁信用卡驗證,這樣用超過時數會不會被扣款啊?

即使有綁信用卡,還是可以繼續用0元方案,如果真的用完會倒站,不會扣款

lee98064 iT邦新手 5 級 ‧ 2018-12-18 22:54:11 檢舉

好,謝謝卡米大/images/emoticon/emoticon41.gif

0
kevin1004
iT邦新手 5 級 ‧ 2018-12-27 12:21:18

卡米哥想請問您,之前把功能都放在
class KamigoController < ApplicationController裡面,
但隨著功能越來越多之後,尤其 Line Messaging API 訊息格式都很長,
程式變得很雜亂,請問有甚麼方法可以將部分功能寫到別的檔案裏呢?

看更多先前的回應...收起先前的回應...

有的,之前本來想寫如何重構整理程式碼,但投票後大家比較想看更多的新功能

kevin1004 iT邦新手 5 級 ‧ 2018-12-27 13:20:00 檢舉

了解,那您之後有機會會寫,如何重構整理程式碼嗎?
/images/emoticon/emoticon41.gif

會考慮的,不過最近比較忙

kevin1004 iT邦新手 5 級 ‧ 2018-12-28 09:53:27 檢舉

感恩卡米,讚嘆卡米

1
yeehenchen
iT邦新手 5 級 ‧ 2018-12-27 15:18:29

卡米大安安

想學習如何重構程式碼和製作井字遊戲~

感恩卡米,讚嘆卡米

好哦~好哦~

1
andy132324
iT邦新手 5 級 ‧ 2019-04-04 02:56:09

卡米大 想請問您可以做一篇教學在 heroku的資料庫之類的嗎

因為現在資料庫被聊天內容塞爆了 所以不能用 我想把他清掉或轉移 但不知道怎麼用

最近比較忙喔 比較沒空無法寫文

請參考這篇文章:https://devcenter.heroku.com/articles/updating-heroku-postgres-databases

1
hm5829
iT邦新手 5 級 ‧ 2019-04-10 09:28:37

請問卡米哥,如果要做使用者以固定格式說出時間,機器人根據時間做鬧鐘提醒,這篇文章的heroku排程可以做到嗎,如果不行
https://ithelp.ithome.com.tw/upload/images/20190410/20112033cubwkthcKy.jpg
研究這兩個網站能做到嗎,還是免費版只能在後台提早設定時間去跑主動訊息

如果要做使用者以固定格式說出時間,機器人根據時間做鬧鐘提醒,這篇文章的heroku排程可以做到嗎?

可以,但是你要將 user 指定的時間儲存起來。

研究這兩個網站能做到嗎?

也可以做到,這跟上面那個方法不是同一個作法。

hm5829 iT邦新手 5 級 ‧ 2019-04-10 20:15:07 檢舉

了解感恩/images/emoticon/emoticon02.gif

0
Surfer Alex
iT邦新手 5 級 ‧ 2019-08-19 16:12:10

求米大大教學一個固定選單能讓使用者點選圖示,並回傳資料的功能~拜託惹超想學的

請問你說的是像跟這隻聊天機器人說「目錄」之後看到的東西嗎?

對喔~沒錯~~~~就是這個

關於這個部分 這個是使用 flex message 製作的。

上面的那隻是我使用 kamigo聊天機器人框架 所製作而成的聊天機器人,這隻聊天機器人也是開放原始碼,你可以參考這段生成 flex message 的程式

如果有問題可以在此留言,我有空就會回來回留言

我要留言

立即登入留言