用 Python 開發 Facebook Bot

最近聊天機器人 Bot 這股趨勢才慢慢要崛起,之前做了一點觀察紀錄,這次進入實作階段,首先就直接使用 Facebook Message Platform 做為開始。
評論
評論

 

(Photo Credit: Facebook Messenger Platform)

原文刊登於 DualCores Studio,Inside 獲授權轉載。

作者為大白,Co-founder & Developer @DualCores Studio,歡迎對於 Bot 開發、人工智慧、語意分析、機器學習有興趣的朋友一起交流學習,接下來會更專注分享相關的題目。

最近聊天機器人 Bot 這股趨勢才慢慢要崛起,之前做了一點觀察紀錄,這次進入實作階段,首先就直接使用 Facebook Message Platform 做為開始。

其實 Facebook 官方文件寫的也蠻清楚的,只是有一些技巧要注意。

前置作業

  1. 先有一個粉絲團 :粉絲團就是用來當作 Bot 的身份,只支援粉絲團對一般使用者聊天而已,先確定你有一個粉絲團是用來讓 Bot 綁定的,這邊可以選擇你既有的粉絲團或是新建立一個,如果是新建立的,粉絲團新建立完後可以先不發佈,但是如果要開始測試 Bot 的話,就要發佈了。
  2.  準備開發環境和專案 :新建立一個 Python 專案,並且將我們會用到的套件:FlaskRequests 安裝好。
  3. 申請一個 FB 應用程式 :去 facebook for developer 建立或選擇一個應用程式,如果是新建立的話,應用程式類型選擇「網站」即可,建立完之後在主控台左側功能表找到「Messager」點下。

    ▲點選左邊功能表的「Message」,再按下「開始使用」。

    ▲選擇一個粉絲專頁後(可能需要登入),右邊的存取權杖 (Access Token) 會自動產生,這等等會用到。

  4. 為自己的網域名稱申請 SSL:Facebook 要求所有 Messager 呼叫的 API 都是要走 https,所以這步驟是必要的(我也覺得比較麻煩的地方),這邊我用的是 Let's Encrypt 來申請,依照「Installing Client Software」的步驟來進行,先用 git clone 把專案複製下來,然後在終端機使用 certbot-auto 工具來產生憑證,我是用 Apache HTTP Server,所以執行
sudo ./certbot-auto --apache -d YOUR_DOMAIN_NAME.COM

YOUR_DOMAIN_NAME.COM 要換成你自己的網域名稱,不用加 http:// 開頭,接著依照它的指示做即可。

▲我是選擇 Easy,讓 http 和 https 都可以使用,如果選擇 Secure,則所有 API 呼叫都要走 https。

▲成功完成的畫面

憑證產生好後,我們需要將憑證複製到我們的 API 專案內,我這邊是在專案內建立一個 ssl 的資料夾,並且使用終端機切換目錄到 /etc/letsencrypt/live/YOUR_DOMAIN_NAME.COM/(這邊 YOUR_DOMAIN_NAME.COM 記得代換成自己的網域名稱)裡面,將 fullchain.pem 和 privkey.pem 複製到剛剛建立的 ssl 資料夾,這等等會用到,千萬別複製錯檔案,我一開始就是複製到 cert.pem / privkey.pem,然後後面就出錯了(看下圖)。

▲複製錯憑證檔案,在設定 Callback Webhook 就出錯了。

OK,到目前為止,前置步驟算完成,我們可以開始寫程式了。

程式撰寫

程式的部分主要分成三個主要步驟:

  1. 設定 Webhook 做驗證。
  2. 從 Facebook 接收使用者的訊息。
  3. 傳遞訊息到 Facebook。

1. 設定 Webhook

新增一個可以接收驗證碼的 HTTP GET 方法,裡面的 I_AM_VERIFICATION_CODE 要換成自己的,其他 hub. 開頭的都是 Facebook 既定好的,要照著寫。

@app.route(API_ROOT + FB_WEBHOOK, methods=["GET"]) def fb_webhook():     verification_code = 'I_AM_VERIFICIATION_CODE'     verify_token = request.args.get('hub.verify_token')     if verification_code == verify_token:         return request.args.get('hub.challenge')

再回到 Facebook 應用程式主控台,按下 Setup Webhooks 會出現下圖的視窗,要將你的 API 網址 (API_ROOT + FB_WEBHOOK) 和上面的 I_AM_VERIFICATION_CODE 分別輸入進去,然後勾選你要的訊息功能:

勾選訂閱項目如下:

  1. message_deliveries: 訊息傳遞的相關報表。
  2. messages: 最基本的訊息接收和傳遞。(最基本一定要勾選的)
  3. messaging_optins: 允許使用者使用在你網站上的 Send-to-Messager 按鈕,並且可以授權傳遞訊息到這。
  4. messaging_postbacks: 允許你傳遞除了文字之外的訊息種類,例如:按鈕和按鈕按下後的事件。

2. 接收訊息。

從 Facebook 傳遞過來的文字訊息 JSON 格式(如果你是傳圖片或其他非文字的類型,會有點不同)如下:

{     "object": "page",     "entry": [         {             "id": 1719080561637302,             "time": 1463187309603,             "messaging": [                 {                     "sender": {                         "id": 1176454272400076                     },                     "recipient": {                         "id": 1719080561637302                     },                     "timestamp": 1463187309521,                     "message": {                         "mid": "mid.1463187309223:ae45fc642d87298297",                         "seq": 23,                         "text": "嗨,你好。"                     }                 }             ]         }     ] }

可以從 entry → messaging 取得每一則訊息傳送者和內容,取得訊息程式如下,使用 HTTP POST,然後去解 JSON 即可:

@app.route(API_ROOT + FB_WEBHOOK, methods=['POST']) def fb_handle_message():     message_entries = json.loads(request.data.decode('utf8'))['entry']     for entry in message_entries:         messagings = entry['messaging']         for message in messagings:             sender = message['sender']['id']             if message.get('message'):                 text = message['message']['text']                 print("{} says {}".format(sender, text))     return "Hi"

3. 傳遞訊息。

傳遞訊息也很簡單,只需要呼叫 Graph Message API 即可,程式碼如下:

def send_fb_message(to, message):     post_message_url = 'https://graph.facebook.com/v2.6/me/messages?access_token={token}'.format(token=config.FB_TOKEN)     response_message = json.dumps({"recipient":{"id": to},                                     "message":{"text":message}})     req = requests.post(post_message_url,                          headers={"Content-Type": "application/json"},                          data=response_message)     print("[{}] Reply to {}: {}", req.status_code, to, message)

裡面的 config.FB_TOKEN 是我們在前置作業新增的 FB 應用程式所產生的,要去應用程式的主控台去找。

FB_TOKEN 就是從這頁面的粉絲專頁存取權杖複製而得。
再來要綁定這個 FB 應用程式和你 Bot 的粉絲團,開啟終端機執行

curl -ik -X POST "https://graph.facebook.com/v2.6/me/subscribed_apps?access_token=ACCESS_TOKEN"

上面的 ACCESS_TOKEN 要用剛剛的粉絲專頁存取權杖複製代換,執行完成功後會出現 {“success”: true} →

最後一步,我們要啟動我們的 API,加入執行 API 的程式:

if __name__ == '__main__':     context = ('ssl/fullchain.pem', 'ssl/privkey.pem')     app.run(host='0.0.0.0', debug=True, ssl_context=context)

這邊的 context 所用到是我們前置作業所複製出來的兩個憑證,為了是讓我們的 API 是用 https 存取,這也是 Facebook Message Platform 所要求的。
最後執行 API 來讓我們跟 Bot 聊天吧。

▲可以成功跟 Bot 聊天

完成程式碼如 GitHub 連結:請給星星吧,我需要你們的支持~

常見問題可能的解法

  1. Callback 網址有問題?先用工具測試你的 Webhook GET API 是否正常運作,可以呼叫 Webhook API 然後給 hub.verify_token 和 hub.challege 這兩個參數,照我們寫的程式正確會回傳 hub.challege 的值。
    ▲使用 Postman 測試 Webhook API
  2. 訊息沒有收到或傳遞失敗?別忘了要綁定 Facebook 應用程式和粉絲團(執行 curl 那一段)

 

歡迎加入「Inside」Line 官方帳號,關注最新創業、科技、網路、工作訊息

好友人數

以前瞻眼光展開電動化車款轉型,Lexus HEV 油電複合車獨步全球

早從2005年便投入電動化轉型研發的Lexus, 在15年前就推出全球首款豪華油電複合車(HEV, Hybrid Electric Vehicle),透過兼顧油耗環保與優異性能等多重優勢,成為消費者踏入電動化領域最佳首選。
評論
Photo Credit:Lexus
評論

時間回到 2005 年,Lexus 獨步全球豪華車廠,率先推出首款 HEV 油電複合車 RX 400h,不僅成為電動化豪華先驅,經過多年的發展,更奠定在此領域不可撼動的領導地位。在純電車款尚未普及前,Lexus 便已佈局油電複合動力產品線,提供消費者務實且環保的豐富選擇。從這一點就能看出 Lexus 的精準眼光,而在油電複合動力領域耕耘多年的 Lexus,至 2020 年為止已累計減少全球約 1900 萬噸的二氧化碳,成為其他品牌的比較標竿。

以深厚技術為基礎 破除 HEV 為轉性過渡產品迷思

10 幾年下來,Lexus 在油電複合動力領域累積深厚實力,並不斷突破,陸續推出首款後驅油電複合車(HEV, Hybrid Electric Vehicle)-GS450h、首款 V8 引擎 HEV-LS 600h ,現在更打造出業界最為先進的第 4 代 Hybrid 系統。Lexus 針對不同的動力及操駕需求,推出多元的電動化車款。證明了油電複合車 HEV 並非純油轉純電的過渡性產品,而是能夠滿足消費者需求的務實之選。

其關鍵就在於「均衡性」,油電複合動力系統除了可以寧靜行駛,動力輸出同樣飽滿卻較為平穩順暢,因此駕駛無須重新適應過去多年來習慣的動力特性,無痛轉換加上養護方便,又兼顧高油耗經濟性的優勢,Lexus 旗下 HEV 油電複合車款可說是面面俱到。

而目前最先進第 4 代油電技術,最具代表性的產品就屬 LS 與 LC 車系的 500h 車型,採用 3.5 升 V6 引擎為基礎,並首度換上鋰電池,因此綜效馬力輸出比過去更好,且作動效率更佳。另外最關鍵為具備 Multi Stage Hybrid 科技,除了原本 ECVT 變速系統之外,後軸再增加一具 4 速變速箱,提供更強勁的加速感受,並能在高檔位駕駛時有效降低引擎轉速,進一步達到節能目的。

全球屢創佳績 深受台灣市場肯定

Lexus HEV 油電複合車自從推出以來,就一直受到消費者高度支持,不僅在全球市場交出好成績,在台灣同樣也引領著豪華油電市場發展。Lexus 品牌於全球約 90 個國家銷售,截至 2021 年 4 月底為止,電動化車款累積超過 200 萬輛販賣,占比品牌整體銷售量高達 33%,累計減少二氧化碳排放超過 1,900 萬噸,換算約等同 30 萬輛新車的碳排量,可說成果卓著!

而台灣市場方面,1999 年 Lexus 引進 RX 車系,一上市旋即獲得消費者熱愛,打下在豪華 SUV 市場的重要地位,並創下驚人的銷售記錄,2006 年導入油電複合動力車款- RX 400h 以來,便以獨跑之姿持續領導豪華油電市場走向,目前 Lexus 在台灣市場已經達成全車系都有油電複合動力 HEV 動力選擇,遙遙領先其他對手。

堅強產品陣容佈局 顛覆傳統豪華定義

作為第一款在台灣推出油電複合動力車型的產品,RX 的油電複合動力車型受到許多關注,小改款時,除了調整車款外觀特色帶來更為精緻與豪華的風範,內裝配備亦有所提升,觸控式中控螢幕和搭配 remote touch 操作介面,操作體驗直覺便利。另外還新增 6 人座設定,第二排座椅採用 Premium Captain Seat,乘客可在 2、3 排座椅間穿梭,同時大幅提升車室使用便利性。

RX 450h 全面創新 豪華新視野。/Photo Credit:Lexus

RX 450h 亦在先進安全科技上搭載豐富配備,全車系標配全速域 DRCC 雷達感應式車距維持定速系統,支援跟車到停與重新起步,加上 LTA 車道循跡輔助系統、ICS 智慧停車輔助系統,以及 RCTB 後方車流煞車輔助系統等駕駛輔助功能,確保減少長途行車疲勞,並降低因疏忽而產生的事故意外。搭配增加焊點與膠合部位,提升車身剛性,讓駕駛同時擁有安全性和駕馭樂趣。

另外同樣也屬於 Lexus 核心 SUV 產品的 UX,乃是品牌最年輕的成員,採用 GA-C 平台打造,擁有高剛性、低重心、充滿駕馭樂趣的特性。其中 UX 250h 搭載最新第 4 代 Hybrid 系統,擁用更佳的作動效率,以及高達 41% 的熱效率,使得 UX 250h 得以兼顧優異動力輸出、絕佳油耗表現。

UX 250h 油電複合動力車型搭載最新第 4 代 Hybrid 系統,非常吸引年輕人的目光。/Photo Credit:Lexus

Lexus 持續進化的腳步絕不停歇,即便在 HEV 領域獲得了卓著成就,但仍不斷探索各種未來可能與更多元的電動動力組合,Lexus 將持續部署 Lexus Electrified,像是電動車(BEV, Battery Electric Vehicle) UX 300e 不久的將來將於台灣上市,敬請期待。

想要瞭解更多關於 Lexus Electrified 的詳細消息?您可至 Lexus 官方網站獲得詳細資訊。更不能錯過後續即將推出 Lexus Electrifired 概念的動畫報導文章,所有想知道的大小事情,通通一次滿足!