line-api-webhook

LINE API – Webhook

จากใน บทที่ 1 ที่เราติดตั้ง ทำ LINE Bot ไปแล้ว จะเห็นว่าได้มีการ configure URL https ของเราลงไป เพื่อใช้ในการรับ notification ที่เกิดกับ account LINE ของเราแบบ realtime โดยทาง LINE เองจะส่ง https POST มาให้กับ server ของเรา หลักการของ LINE API หรือ Messaging API ที่ได้แนะนำไปในบทที่ 2 และ บทที่ 3

 

ต่อไปนี้เราจะมาทำความเข้าใจกับโครงสร้างของ request ที่ส่งมาด้วย webhook

Request headers

หลักการของ LINE API Webhook  ภายในส่วนของ header จะมี tag X-Line-Signature เป็นรหัสไว้ตรวจสอบ เทียบกับ Channel Secret ว่าตรงกันไหม เพื่อยืนยันว่าส่งมาจาก LINE Server จริง

Request header Description
X-Line-Signature Used for signature validation

Request body

เป็น JSON format ภายในเป็น array เก็บของในรูปแบบของ webhooks event objects

Field Type Description
events Array of webhook event objects Information about the event

ตัวอย่างเช่น

{
   "events": [
        {
            "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
            "type": "message",
            "timestamp": 1462629479859,
            "source": {
                  "type": "user",
                  "userId": "U206d25c2ea6bd87c17655609a1c37cb8"
             },
             "message": {
                  "id": "325708",
                  "type": "text",
                  "text": "Hello, world"
             }
         }
    ]
}

Response

Server ของเราต้องตอบ https status code 200 สำหรับ HTTP POST ที่มาจาก Webhooks กลับไปให้ LINE Server แต่ต่อให้เรา return  fail ทาง LINE Server ก็ไม่ resent transactions นั้นลงมาอีกอยู่ดี (- 0 -)

 

Webhook event object

ส่วนนี้คือข้อมูลที่เราต้องการจริงๆ เพราะคือรายละเอียดของ message ที่ถูกเก็บอยู่ในรูป JSON object เรามาดูกันว่ามีโครงสร้างอย่างไร

{
   "events": [
      {
         "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
         "type": "message",
         "timestamp": 1462629479859,
         "source": {
             "type": "user",
             "userId": "U206d25c2ea6bd87c17655609a1c37cb8"
         },
         "message": {
               "id": "325708",
               "type": "text",
               "text": "Hello, world"
         }
     },
     {
         "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
         "type": "follow",
         "timestamp": 1462629479859,
         "source": {
              "type": "user",
              "userId": "U206d25c2ea6bd87c17655609a1c37cb8"
          }
      }
   ]
}

จะเห็นว่าภายใต้ events จะเป็น array ของ messages ซึ่งแต่ละ message เองก็จะมี file ดังนี้

  • Common fields  คือ field ที่ต้องมีทุกๆ event
Field Type Description
replyToken String  เป็น token id ที่ทาง LINE generate ขึ้นมา สำหรับใช้ในการ reply message กลับไป
type String  ชนิดของ event เช่น message, follow, unfollo, join, leave, postback
timestamp Number  เวลาที่เกิด event (milliseconds)
source User
Group
Room
 เป็น JSON object ที่มีข้อมูลผู้ส่ง ว่ามาจากไหน และ id อะไร 

  • type : user = userId
  • type : group = groupid
  • type : room = roomid
         "source": {
             "type": "user",
             "userId": "U206d25c2ea6bd87c17655609a1c37cb8"
         },
  • Message event  เป็น event object ที่มีข้อมูล messages หลายแบบ เช่น text, image, video, audio, location, sticker

Text

  "message": {
        "id": "325708",
        "type": "text",
        "text": "Hello, world"
  }
Field Type Description
id String Message ID
type String text
text String Message text

Image, Video, Audio

สำหรับการ download ข้อมูล content จะใช้ message id ในนี้ไปดึงจากอีก end point ในหัวข้อ content

  "message": {
        "id": "325708",
        "type": "image"
  }
Field Type Description
id String Message ID
type String image, video, audio

Location

   "message": {
        "id": "325708",
        "type": "location",
        "title": "my location",
        "address": "Bangkok Thailand",
        "latitude": 35.65910807942215,
        "longitude": 139.70372892916203
    }
Field Type Description
id String Message ID
type String location
title String Title
address String Address
latitude Decimal Latitude
longitude Decimal Longitude

Sticker message

   "message": {
        "id": "325708",
        "type": "sticker",
        "packageId": "1",
        "stickerId": "1"
   }
Field Type Description
id String Message ID
type String sticker
packageId String Package ID
stickerId String Sticker ID
  • Follow event การขอ add friend หรือ unblock
     {
         "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
         "type": "follow",
         "timestamp": 1462629479859,
         "source": {
              "type": "user",
              "userId": "U206d25c2ea6bd87c17655609a1c37cb8"
          }
      }
Field Type Description
type String follow
replyToken String Token for replying to this event
  • Unfollow event  มีการ block account เรา
     {
         "type": "unfollow",
         "timestamp": 1462629479859,
         "source": {
              "type": "user",
              "userId": "U206d25c2ea6bd87c17655609a1c37cb8"
          }
      }
Field Type Description
type String unfollow
  • Join event  มีการชวน account เราเข้า group/room
     {
         "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
        "type": "join",
         "timestamp": 1462629479859,
         "source": {
              "type": "group",
              "groupId": "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
          }
      }
Field Type Description
type String join
replyToken String Token for replying to this event
  • Leave event  โดนเตะออกจาก group/room
     {
         "type": "leave",
         "timestamp": 1462629479859,
         "source": {
              "type": "group",
              "groupId": "cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
          }
      }
Field Type Description
type String leave

 

สรุป Webhook ก็คือส่วนของ message notification ที่ทาง LINE Server ส่งมาให้เรา ให้รับทราบถึง event trigger ที่เกิดขึ้น realtime ซึ่งในเราสามารถนำเอามาเป็น input ให้ LINE Bot เราใช้ทำงานได้

 

บทความต่อไปคือ วิธีส่งข้อความผ่าน LINE API จาก server ของเราไปยัง LINE Server เพื่อ notify user ที่เป็นเพื่อนของ account เรา

 

Reference:

 

Author: Suphakit Annoppornchai

Credit: https://saixiii.com,https://devdocs.line.me

5 Thoughts to “บทที่4 Webhook หลักการของ LINE API ที่เอาไว้ ทำ LINE Bot”

  1. […] ในบทต่อเราจะมาดูกันว่า Webhook คืออะไร […]

  2. […] บทที่4 Webhook หลักการของ LINE API ที่เอาไว้ ทำ … […]

  3. […] บทที่4 Webhook หลักการของ LINE API ที่เอาไว้ ทำ … […]

  4. […] บทที่4 Webhook หลักการของ LINE API ที่เอาไว้ ทำ … […]

Leave a Reply