講者:王婕瑜

日期:2021/5/27

展覽報報機器人

掃我看Demo

OUTLINE

  • 前言
  • 寫爬蟲
  • 修改 Line bot
  • 發佈至 Heroku
  • Reference

前言

由於疫情關係,對外課程停課。

上週課程,我們已經開發最簡單的 Line 回聲機器人,這週將結合爬蟲,寫出能告訴你展覽資訊的機器人,且會將機器人發布至 Heroku,不用電腦運行專案就可以使用喔。

Stay safe! ヽ(✿゚▽゚)ノ

Demo

輸入有展覽、旅遊字眼的訊息後,可得到最新展覽、旅遊資訊,取自輕旅行、非池中藝術

未來增加功能

  • 使用 Heroku 所提供的資料庫 Heroku Postgres,增加紀錄及查詢資料的功能
  • 使用Flex Message美化

流程說明

我們會修改上週做好的回聲機器人,還沒有寫過的同學請點選這裡看詳細教學。

首先會使用對外課程中寫過的爬蟲來取得展覽資訊,修改程式碼後,將機器人發佈到 Heroku

開始囉!

寫爬蟲

這次爬取展覽資訊的程式,在之前的對外課程有詳細的教學,這邊就不介紹細節了

安裝套件

感謝上一堂課的講師,我們可以直接用他們寫的爬蟲,首先來安裝需要的套件,請開啟專案的資料夾,輸入:

# 上一份教材是使用pipenv,由於講者在實作過程遇到困難,所以這邊改用pip
pip -m venv venv # 創造虛擬環境
venv\Scripts\activate # 進入虛擬環境
pip install requests
pip install beautifulsoup4
pip install flask
pip install line-bot-sdk

修改 app.py

import requests
from bs4 import BeautifulSoup

在 app.py 的開頭新增以下兩行

# 解說以註解的方式寫在裡面
@handler.add(MessageEvent, message = TextMessage)
def handle_message(event):
#   使用者傳送"展覽報報"給機器人時會觸發事件
    if event.message.text == '展覽':
    	user_agent = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36'}
        r = requests.get('https://artemperor.tw/tidbits', headers = user_agent)
        r.encoding = 'utf-8' # UTF-8 格式的編碼方式,建議使用怕亂碼
        soup = BeautifulSoup(r.text, 'html.parser')
        content = [] # 存展覽資料的陣列
        exhibitions = soup.select('h2', limit = 3) # 展覽名稱
        date = soup.select('div.list_box p', limit = 3) # 展覽時間
        locations = soup.select('h3', limit = 3) # 展覽地點
        href = soup.select('div.list_box figure.tag a', limit = 3) # 連結
        for i in range(3):
            content.append(exhibitions[i].text + "\n" + date[i].text + "\n" + '地點:' + href[i].h3.text + "\n" + '詳情:'+ href[i]['href'] + "\n")
        
        line_bot_api.reply_message(
            event.reply_token,
            TextSendMessage(text=' '.join(content))
        )

修改 Message Handler

測試

測試的方法見上一份教材,如此就完成本機端測試了。

但每次想使用機器人都必須運行app.py,使用 Ngrok 產生新網址,為了節省時間,接下來要開始將機器人發布至 Heroku。

發佈至 Heroku - 設定

a.k.a. 幫我們管理伺服器的地方

先前運行機器人的方法就是將伺服器建立在自己的電腦,為了隨時隨地都可以使用,我們會將伺服器架設在 Heroku 這個平台上,並且學習用 Git 來做版本控制。

Git 簡介

Git 是一個版本控制系統,當我們在開發專案時,隨著時間修改會有不同的版本,為了有效管理這些檔案、紀錄更新狀況,則需要使用 Git。

首先,點擊連結來安裝Git,不斷點擊 Next 即可。

設定

git config --global user.name "yourName"

1. 使用者名稱

2. 電子信箱

git config --global user.email "yourEmail@gmail.com"

開啟終端機,輸入以下指令來設定:

這樣就完成Git的設定了!接下來介紹Heroku。

  • Heroku 提供用戶佈屬網站的服務
  • 免費、操作簡單,不用煩惱管理機器或硬體維護,適合網路流量小的專案
  • 在 30 分鐘內沒有使用則自動進入睡眠狀態,需約 20 秒啟動系統

接下來開始註冊。

點擊標題的超連結到官網,填寫資料註冊。

除了信箱之外,其他的可以隨意填。

收到電子郵件後點進連結,設定密碼即可。

點擊標題的超連結來安裝 Heroku CLI。

Heroku CLI 是一個用來管理、創建、提交等命令的工具。

找到適合的版本後下載。

一直點 next,最後按 close 即可。

可以在終端機中輸入:

 

 

確認是否安裝完成,安裝完成則會呈現以下畫面:

heroku

設定

首先登入Heroku,輸入:

heroku login

輸入信箱和密碼

設定

打開終端機,輸入:

 

 

新增 Heroku App。

heroku create APP的名字

APP 的名字可以自己設定,

也可以空著, Heroku 會自動產生一個名稱

完成所有設定後,接下來將機器人發布至 Heroku。

發佈至 Heroku

開始使用 Git 指令將展覽機器人發佈到 Heroku 上

首先建立.gitignore,這個檔案沒有副檔名,內容放較為機密、不想讓它被 Git 紀錄的檔案:

建立檔案

.env
venv
.gitignore
pip freeze > requirements.txt

為了讓 Heroku 知道該下載什麼套件,在終端機中輸入:

設定環境變數

到 Heroku 的控制台點擊 Setting,設定 CHANNEL_ACCESS_TOKEN 及 CHANNEL_SECRET,在 Line Developer 裡的 Messanging API 跟 Basic Settings 裡可以找到

建立 Procfile

新增一個檔案 Procfile,注意也沒有副檔名,這是為了讓 Heroku 知道要用什麼指令把我們送上去的程式跑起來

web: gunicorn your_flask_module_or_package_name:app

安裝 gunicorn

pip install gunicorn
web: gunicorn app:app

我們要執行的是 app.py 這個檔案,所以應該寫成:

Git 它

git init

開啟終端機,切到專案目錄下後,輸入以下指令﹑初始化這個專案

heroku git:remote -a app_name

app_name 請更換成自己的 APP 名字

上傳至 Heroku

git push heroku master
git add . 
git commit -m  "message" 

未來如果有更改檔案,也是依照這個順序輸入指令!

設定 Webhook URL

開啟 Heroku 的 後台,點右上角的 Open app
會出現一個網頁,請將該網頁的網址複製下來

通常是 https://APP名字.herokuapp.com/

開啟 Line Developers 的 Messaging API

將得到的網址複製到 Webhook URL 的位置,並打開下面的 Use Webhook

記得在網址後加上 /callback

完成

heroku run python app.py

這樣就完成一隻展覽資訊機器人啦!

如果在部屬過程有問題,可以使用下面的指令 debug,如果沒問題會出現在本機端運行時的畫面。

為了表示在本機端跟發布到 Heroku 的區別,這邊用來觸發事件的文字不同喔,請記得改

REFERENCE

THANKS FOR LISTENING

展覽報報機器人

By juliewah

展覽報報機器人

SIRLA 109-2 對外課程

  • 147