LV. 18
GP 70

巴哈聊天機器人 簡單範例

樓主 梯太 asdfgh419
GP17 BP-

作者標示-非商業性

本授權條款允許使用者重製、散布、傳輸以及修改著作,但不得為商業目的之使用。使用時必須按照著作人指定的方式表彰其姓名。

小屋有篇一模一樣的文章 轉過來讓大家方便找到了

一步一步來
首先創建自己的BOT
圖片部分比較機車,要完全符合指定的規範,錯了不讓你送出。
png 300x300 跟 png 600x400
創好就可以照圖點擊看到Token
跟可以輸入Webhook網址的地方,晚點會用到

Token跟 app secret 處理過了,這兩個只有開發者知道就好,不用告訴別人。
Secret是驗證訊息來源用的,這篇不會用到這功能

接著參考官方教學
整體寫的比較陽春,懂得人可以參考,
不懂的照著下面步驟操作就可以。
正常來講要製作聊天機器人需要一台伺服器,這裡用Google的Apps script來代替
右上點Start Scripting,需要登入google帳號
登入完帳號後應該是這頁面,左上角點選新增指令碼

照著圖做 部屬為網路應用程式
如果有修改要重新操作一次上面的步驟,且每次都要在專案版本那再新增一個版本才會更新,
網址我個人是沒發現到它改變,應該是不用改了。
權限調成: 任何人,甚至匿名使用者

部屬後會有網址,將網址貼到巴哈的後台Webhook那欄就大功告成了
如果完全照著我的程式碼 有三個指令:

還沒做訊息來源驗證,只能娛樂用,不要用機器人回覆敏感資料
驗證待高手或官方補上範例吧。
17
-
LV. 20
GP 77
2 樓 龍小歐 a800627
GP0 BP-
我按下偵錯的時候,它跑出:
TypeError: 無法讀取 undefined 的「postData」屬性。 (第 6 行,檔案名稱:testbot)


梯太,你有沒有辦法解決嗎?
0
-
LV. 22
GP 41
3 樓 Hayate k0783237
GP4 BP-

作者標示-非商業性

本授權條款允許使用者重製、散布、傳輸以及修改著作,但不得為商業目的之使用。使用時必須按照著作人指定的方式表彰其姓名。

※ 引述《a800627 (龍小歐)》之銘言
> 我按下偵錯的時候,它跑出:
> TypeError: 無法讀取 undefined 的「postData」屬性。 (第 6 行,檔案名稱:testbot)
> 在新視窗開啟圖片
> 梯太,你有沒有辦法解決嗎?

龍小歐 Hayate不好意思,我不懂您的意思,能詳細一點嗎?
昨天 21:56

不好意思,不知道有沒有偏離主題,
因為留言有字數限制實在不好詳細解釋,只好直接回覆了。

先釐清下面幾個東西~
1. 部署的網路應用程式:
    按照上面的教學步驟做完的話,我們會在Google 上面部署一個自己的網路應用程式。
    可以理解成我們寫的bot。

2. POST 請求(request):
    Post 請求我覺得很難白話解釋XD 看看有沒有高手能幫我解釋一下...
    但是只要知道,HTTP 有很多種請求方法(request methods):GET ,POST,PUT,DELETE...

    哈哈姆特不EY,它會即時的把:哪個巴哈ID對bot講話、他發出什麼訊息...
    這些內容使用 POST 請求 丟給我們寫的bot機器人
看這裡

3. Google Apps Script  的 doPost函式 (function) 有什麼用途?
    在Google Apps Script
    doPost函式 (function) :
    doPost(e){
    }
    也就是可以看到範例的程式碼中第5行開始到第20行結束這一段,
    在Google Apps Script 它有一個特別的作用:
    當有外部服務對你的應用程式進行 POST 請求(request)的時候,
    會自動跑這一段函式,執行函式裡面寫好的程式碼。

4. e.postData.contents 這段程式碼是指什麼,在做什麼的?
    它是指:抓出 e (event) 裡面POST請求的中帶的資料內容。
    以哈哈姆特不EY當例子,當有人跟我們的bot發訊息, 流程可能是這樣

    SENDER_ID : Hello~  ->
    哈哈姆特不EY 伺服器 ->
    丟POST請求給我們的bot ->
    程式執行doPost(e) {  ->
    var msg = JSON.parse(e.postData.contents); ->
    .....
    }


    msg 會抓到長得像這樣的東西
    {
      "botid":<BOT_ID>,
       "time":1512353744843,
      "messaging":[{
       "sender_id":<SENDER_ID>,
       "message":{
         "text":"Hello~"
        }
       }]
    }

    這時候我們寫的bot可以去解析這個資料,並且知道:SENDER_ID 跟我說Hello~  
   
都釐清之後,接者來看一下我們的問題點:
> 我按下偵錯的時候,它跑出:
> TypeError: 無法讀取 undefined 的「postData」屬性。 (第 6 行,檔案名稱:testbot) [bgcolor=transparent !important]


從圖片上看到,我們針對了 doPost這個函式 進行了偵錯
偵錯的流程可能是這樣:

按下偵錯 ->
程式執行doPost(e) {  ->
var msg = JSON.parse(e.postData.contents); ->
錯誤!沒有data!!

當偵錯程式跑到這一行的時候:
var msg = JSON.parse(e.postData.contents);
這裡會抓出POST請求的中帶的資料內容 (看上面第3,4點),
但是實際上,根本沒有人(外部的服務) 發出POST請求過來,沒有event,
所以偵錯程式找不到資料內容,報出了錯誤,回了我們一個undefined postData


解決方法:
1. 無視他。這是正常的,因為其實我們的網路應用程式(bot)根本沒有收到別人發來的資料。

這時候可能會想問
Q:無視他的話,那如果實際上有人發POST請求過來,會發生什麼事?也是會抓不到資料嗎?
A:實際試試看吧,自己用其他軟體例如postman丟個POST請求給自己的bot看看,然後再看看有沒有哪裡出錯,要怎麼改寫自己的程式。

但是換個方向想,如果對方丟個POST請求而沒有帶資料,其實bot好像也不能做什麼事情?
要不要改寫這段程式碼,就看看有沒有這個需求了。

2. 謹慎一點,把自己的code寫個更完善

先說一下我覺得您的觀念很棒,會先執行偵錯並且完善自己的程式碼,處理各種例外狀況
我自己也忽落了這一塊。

我自己提供一個簡單的寫法針對沒有event的情況:
if ( typeof e !== 'undefined')
{
  //這裡面放原本 var msg= JSON.parse(e.postData.contents); 之後所有在doPost裡面的程式碼
}
這樣偵錯就會過囉~ 因為使用偵錯本來就沒有真實的event發給我們bot,也就不會去抓postData了
4
-
LV. 37
GP 2k
4 樓 敵會跪 jack12345520
GP1 BP-
※ 引述《a800627 (龍小歐)》之銘言
> 我按下偵錯的時候,它跑出:
> TypeError: 無法讀取 undefined 的「postData」屬性。 (第 6 行,檔案名稱:testbot)
> 在新視窗開啟圖片
> 梯太,你有沒有辦法解決嗎?

以這個為例
我們透過視窗發訊息是這樣跑
也就是說我們傳了訊息才會觸發doPost()這個函式
我們的ID.傳的訊息都在「e」這個參數了


但是如果你直接手動執行doPost()
沒有人傳訊息(發送POST請求)   GAS不知道是誰傳的
更不知道傳了什麼訊息




例如有一個叫做蘋果的物件
我們想要Logger.log印出來

var obj_fruit = {name:"apple"};

function get_name(obj){
  Logger.log(obj.name)
}

外面傳進obj  我們才能讀到obj的東西
正常應該是要 get_name(obj_fruit);
如果直接執行get_name()便會出現你那種錯誤
如上樓Hayte所說  這錯誤是正常的
1
-
未登入的勇者,要加入 5 樓的討論嗎?
板務人員:

0 筆精華,吸收日月精華中
一個月內新增 0
歡迎加入共同維護。


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】