用 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 官方帳號,關注最新創業、科技、網路、工作訊息

好友人數

人機合一新型態微創手術,外科醫師的第3隻手——精準持鏡機器手臂,穩定內視鏡影像提升手術品質

隨著科技進步,微創手術已成為一般外科治療的趨勢,「精準微創」更是現階段的目標。新型的「內視鏡持鏡機器手臂」彷彿是外科醫師的第3隻手,可以模擬人手多角度操作持鏡,提供穩定的影像畫面,輔助主刀醫師精準切割、縫合患部,提升手術品質、縮短術後恢復時間。
評論
評論

談到開刀房、手術室,你腦中浮現的第一個畫面是什麼?小小的手術台旁擠滿多名醫護人員,手上持著不同的器械各自忙碌?

沒錯,一台成功的手術是由一整個醫療團隊,每個人各司其職,並保持良好的節奏與共同合作的默契,才能確保病人獲得妥善治療。

看懂傳統腹腔鏡/內視鏡手術,開刀房人員配置

以傳統腹腔鏡/內視鏡手術來說,手術房內會有主刀醫師與第一助手來完成主要的手術內容,同時還會有兩位分別協助操作內視鏡的「扶鏡助手」與協助遞交手術器械的「第一助手」。

▲手術房內除了主刀醫師與第一助手完成主要的手術內容之外,還有協助操作內視鏡的「扶鏡助手」,以及遞交手術器械的「第一助手」。

扶鏡助手扮演了手術過程中相當重要的「眼睛」角色,因為扶鏡助手操作的內視鏡,便是將極細長內含光纖、鏡片的鏡頭放入體內,再利用影像傳輸,將體內畫面傳導至螢幕上。由於內視鏡可以深入腹腔,傳回人眼無法透視皮膚所看到的手術部位,加上具有影像放大的作用,協助醫師更仔細觀察病兆、找對下刀位置。

傳統腹腔鏡/內視鏡手術,「人工持鏡」考驗醫護體力、耐力

然而,內視鏡的操作,並非想像中的簡單。除了操作過程十分考驗「扶鏡助手」和主刀醫師之間的默契外,一場腹腔鏡手術動輒三、四個小時以上,要保持長時間穩定地「人工持鏡」,相當考驗醫護的體力與耐力。

大千醫院一般外科劉信誠主任坦言,「對於長時間的腹腔鏡手術來說,鏡頭畫面的穩定度非常重要。但是,當手術時間超過一個小時以上或步驟、位置較複雜,持鏡助手就容易感到疲憊、集中度下降,開始跟不上醫師的手術工作速度。」

再者,持鏡助手長時間維持持鏡姿勢,也容易因疲勞而產生手持內視鏡影像晃動,造成手術畫面模糊,增加主刀醫師及開刀團隊產生視覺暈眩的可能性,進而拉長手術時間,提升手術困難度。

▲大千醫院一般外科劉信誠主任。

外科醫師的第3隻手:內視鏡持鏡機器手臂CP值高

為了滿足不斷上升的內視鏡手術需求,醫界也追尋更佳的手術方式。於是,內視鏡結合機器手臂的「內視鏡持鏡機器手臂」由此產生。

其中最知名的「機器手臂」就是大名鼎鼎的「達文西機器手臂」,但達文西手臂的體積龐大、造價昂貴、維修費驚人,每次使用的開機與耗材費高達20-30萬。對於一般民眾來說,是一筆相當高額的支出,不是人人都負擔得起。

為解決醫師臨床手術的多元與便捷需求,友信醫療集團代理引進由德國開發的「新型內視鏡持鏡機器手臂」,有兩種不同型號,滿足不同的臨床需求,打破對機器手臂的既定印象,不僅體積輕巧、操作容易,關節活動角度靈活,更可直接架於開刀床邊軌上,手臂移動範圍能完全涵蓋整個病人,彷彿是外科醫師的第3隻手;且大部分的配件可以重複滅菌使用,每次開機約1-2萬元,導入成本低、CP值高,對於醫院及病人來說負擔降低許多。

除了費用門檻較低,劉信誠主任分享到,與傳統人工持鏡相比,機器手臂持鏡的畫面較穩定,還可以由醫師主動控制畫面,提升手術的流暢度。

另外,在執行微創手術的縫合等精細動作時,穩定、不晃動的畫面也能讓主刀醫師在視覺上較舒適且不易感到疲倦,增加手術的準確度,達到「精準微創」的目的。

▲持鏡助手長時間維持持鏡姿勢,容易因疲勞而產生手持內視鏡影像晃動,「新型內視鏡持鏡機器手臂」則可以提供流暢且穩定的影像。

胸腔鏡手術應用範疇多!日本研究揭「人手持鏡」與「機器手臂持鏡」的差異

劉信誠主任指出,近年來微創手術已是目前臨床上的主流。根據統計,在醫院開刀房所進行的手術中,傳統開腹手術對比腹腔鏡微創手術的比例,已經將近1:9。

如同微創手術的主要目的,在於縮小患者的手術傷口、降低出血量及術後疼痛的發生,因此在進行手術時間較長的微創手術,機器手臂持鏡更顯重要。

根據日本研究發現,機器手臂相較於傳統人手持鏡,不會增加手術準備時間,熟悉持鏡手臂操作的醫師更可以降低18%的腹腔鏡手術時間;且因內視鏡影像穩定,手術下刀、縫合位置更精準,在減少內視鏡穿刺套管拉扯傷口下,患者的出血量也會降低、術後恢復速度也更快,大幅降低住院天數。

以新型持鏡機器手臂來說,便是針對消化系統、婦產、泌尿等外科手術需求所設計。透過內視鏡穿刺套管(Trocar)註冊點作為移動與旋轉的中心點,記憶套管虛擬位置,讓持鏡手臂以定位點為軸心進行移動,並自動運算最佳移動方式,在術中提供穩定內視鏡影像的同時,也能避免內視鏡拉扯擴大手術傷口,對外科醫師提升微創手術精準度,保有穩定支撐和靈活定位能力有所助益。

▲新型持鏡機器手臂,透過電腦登記Trocar穿刺套管作為移動/旋轉的中心點,記憶腹腔鏡套管虛擬位置,讓持鏡手臂以定位點為軸心進行移動,並自動運算最佳移動方式,避免拉扯手術傷口擴大。

小腔室也能輕鬆進入,新型持鏡機器手臂體積更輕巧、角度更靈活

相較腹腔、胸腔等部位,對於耳鼻喉科與顱底手術,醫師要面對更小的腔室,為避免觸碰重要的神經組織及血管,更需要仰賴內視鏡精準的移動與角度。另一款新型持鏡機器手臂具有6個關節的機器手臂、模擬人手進行多角度移動,可以提供360度橫向移動視角,及垂直90度的視覺角度,輔助醫師更精準深入手術部位,穩定提供內視鏡影像輔助醫師進行手術。 

▲具有6個關節的另一款新型機器持鏡手臂,能夠模擬人手進行多角度移動,輔助醫師更精準深入手術部位。

除了上述提到的持鏡機器手臂與傳統人工持鏡之間的差異,對醫院及醫師來說,持鏡機器手臂在人力調度上更有彈性,可以減輕醫護的視覺疲勞與持鏡姿勢疲勞。

對患者而言,持鏡機器手臂提供的穩定手術影像畫面,有助於提升手術品質,減少手術時間及併發症,讓患者安全快速地回到工作崗位或生活上。

資訊來源:友信醫療集團、大千醫院一般外科劉信誠主任;文:關鍵評論網媒體集團廣編企劃。