Webhook 資料格式
看到這邊,應該會好奇,當使用者每次和機器人聊天的時候,LINE 也會打到我們提供的 webhook URL ,那 LINE 究竟給了我們什麼呢?
我們先試著在上一篇建立的 app\Http\Controller\LineController
中修改一些東西,印出來看看
try { $events = $bot->parseEventRequest($body, $signature); Log::info($events); // 增加這個 Log,將收到的訊息印出來 } catch (\Exception $e) { Log::error($e->getMessage()); }
然後對著聊天機器人傳送一則訊息看看,就可以看到這個 $events
裡面到底放了什麼?
array ( 0 => LINE\LINEBot\Event\MessageEvent\TextMessage::__set_state( array( 'message' => array ( 'type' => 'text', 'id' => '10629983864837', 'text' => '這是一段文字', ), 'event' => array ( 'type' => 'message', 'replyToken' => '773xxxxxx10044c9b52ac0b185145023', 'source' => array ( 'userId' => 'Ubefxxxxxxbdc59b024344f4ce81e7911', 'type' => 'user', ) ) 'timestamp' => 1569403340191 ) ), )
此時 LINE 收到使用者的文字訊息後,會把這則文字訊息傳到我們剛剛給的 webhook 位址。我們把它印出來後,可以看到這個 JSON 是一個 webhook event object,此物件(events)包含 1 ~ n 個 event。先拿一個 event 來說明,從第一個先看:
'message' => array ( 'type' => 'text', 'id' => '10629983864837', 'text' => '這是一段文字', ),
message
這個區塊主要是描述使用者傳來的訊息,我們可以從 type
看出這段訊息的類型; id
可以看出這則訊息的唯一識別碼; text
會有使用者傳過來的訊息。
接著是第二個區塊:
'event' => array ( 'type' => 'message', 'replyToken' => '773xxxxxx10044c9b52ac0b185145023', 'source' => array ( 'userId' => 'Ubefxxxxxxbdc59b024344f4ce81e7911', 'type' => 'user', ), )
這裡描述著使用者傳過來的事件資訊。 type
是這則訊息的類型。 replyToken
則是在回應此訊息使用,當程式要回應此訊息時須使用此 token,這個 token 的有效時間不一定,但是相當的短,所以要回覆的話要儘快。
再來是, source
的這個部分。這裡會描述 哪種人?
和 誰?
傳過來的訊息。 type
可以得知是群組傳的訊息?還是使用者傳的訊息?所以可能是 user
或者是 group
; userId
則是傳過來的使用者的 id
,假設是群組傳過來的話,將會是 groupId
(若使用者有同意 official accounts terms of use ,則會再多一個屬性 userId
)。
最後一個 :
'timestamp' => 1569403340191
這個很單純就是這則訊息的時間戳,採用 UNIX 時間,也就是從 UTC 1970 年 1 月 1 日 0 時 0 分 0 秒起到現在不考慮閏秒的總秒數。