搜圖助理 - 聊天機器人

Chatbot學習筆記-Day2

Jason Tsai
Aug 25, 2021

Day1我們成功作出可以自動回覆相同內容的對話機器人了,但Messaging API提供的功能如此豐富,若止步於此就太可惜了對吧!

Message types

Line Messaging API總共有9種訊息格式可以傳送:

我們今天則是選擇了 "Image message",目標是使用者在輸入訊息後,Linebot可以自動回傳相關的圖片,如下圖所示:

圖一 預期成果

擷取網頁資訊

在正式撰寫Linebot程式碼之前,必須先了解如何從網路上擷取圖片位置,在Google搜尋"Linebot"會出現類似以下的結果:

圖二 Google搜尋圖片

若將圖二的網址用Python的split函數以 "&" 分隔,可以得到以下結果:

圖三 網址的細分

可以發現,Google的圖片搜尋是利用 "q=搜尋內容" 以及 "tbm=isch(圖片)" 兩個key作為導引。因此,我們如果試著將網址改成:

"https://www.google.com/search?q=line+bot&tbm=isch"

應該可以得到與圖二相同的結果,那就趕快來試一下吧!

圖四 縮短網址後的結果

得知這樣的資訊後,我們就可以透過更改網址的查詢方式來改變網頁顯示的內容。但問題來了,如果碰到中文怎麼辦呢?

這個問題可以透過Python的urllib模組來解決,用 "parse.urlencode" 函數,輕鬆得到編碼後的結果。

圖五 中文編碼

再加上Google的根網址,就成功還原搜尋囉。

圖六 還原搜尋網址
圖七 搜尋結果

知道搜尋的網址後,也該來思考如何取得每張照片的位置了對吧?

這時就可以再次利用Python的urllib模組取得網頁的原始碼

圖八 取得網頁原始碼

進一步觀察網頁原始碼發現,

大部分的圖片都以 "https://encrypted-tbn0.gstatic.com" 為開頭。

圖九 圖片的位置

我們可以利用Regex(正規表達式)來取得每張圖片的位置,程式碼如下:

圖十 找出圖片位置

因為有些圖片的位置實在太過冗長,我在這邊只取長度在150以下的連結加入list當中。

到這邊,基本上就只剩下與Linebot程式碼的整合了,我們希望使用者輸入訊息後,Linebot可以傳送相關的圖片給使用者。

因此,今天會用到 "Image message" 的格式來傳送訊息。

Image Message

Linebot Image Message的寫法如下:

圖十一 ImageSendMessage寫法

所以只要將我們剛剛爬梳下來的圖片位置貼入,就可以讓Linebot回傳圖片訊息給使用者囉。當然,在圖五的部分 "q" 可以改成使用者輸入的訊息。

因此,整理後的程式碼會像是:

圖十二 完整程式碼

最後再上傳至Heroku更新app就會有圖一的效果囉,

程式碼的部分整理在這邊,那今天的部分就大功告成啦!

--

--

Jason Tsai

Data Analyst in financial industry with experience as Tableau consultant and DA at Martech field.