15 สัญญาณจาก Webhook Events ที่จะปลุกให้ LINE Bot ของคุณตื่นจากภวังค์

Jirawatee
LINE Developers Thailand
8 min readJan 11, 2019

--

Webhook Events คือ event ต่างๆที่เกิดขึ้นกับ LINE Bot(Event trigger) โดยเมื่อ event เกิดขึ้นแล้วจะมีสัญญาณพร้อมกับข้อมูลในรูปแบบที่เป็น JSON วิ่งมาที่ Webhook API ที่เราผูกไว้ใน LINE Developers Console ซึ่ง ณ วันที่ผมเขียนบทความนี้ LINE Bot สามารถรับ Webhook Events ได้ทั้งหมด 15 สัญญาณด้วยกัน

แต่สำหรับนักพัฒนาท่านใดที่หลงเข้ามาอ่านบทความนี้ และยังไม่เคยสร้าง Webhook API สำหรับ LINE Bot มาก่อน แนะนำให้อ่านบทความด้านล่าง โดยเฉพาะหัวข้อที่ 3 เรื่องการ Reply จะได้เห็นภาพว่า Webhook ทำงานอย่างไร

Common Properties

ก่อนอื่นเรามารู้จักข้อมูลพื้นฐานที่จะแนบมาให้เสมอตอนที่ event เกิดขึ้น ซึ่งประกอบไปด้วย properties 3 ตัวนี้

  • type: ประเภทของ event ได้แก่ message, follow, unfollow, join, leave, memberJoined, memberLeft, postback, beacon, accountLink และ things
  • timestamp: เวลาที่ event เกิดขึ้น หน่วยเป็น milliseconds เช่น 1462629479859
  • source: แหล่งที่มาอยู่ในรูปแบบ object ได้แก่ user, group และ room

จาก source ด้านบน เรามาแจกแจงรายละเอียดกันหน่อย ว่าแต่ละตัวแตกต่างกันอย่างไร อะเริ่ม!

source user: บ่งบอกว่ามาจากผู้ใช้สื่อสารกับ Bot แบบ 1:1 ซึ่งเราจะได้ userId ของผู้ใช้คนนั้นๆมา

"source": {
"type": "user",
"userId": "U4af4980629..."
}

source group: บ่งบอกว่ามาจากผู้ใช้สื่อสารกับ Bot ในกลุ่ม ซึ่งเราจะได้ทั้ง groupId และ userId(เฉพาะกรณีผู้ใช้คนนั้นเพิ่ม Bot เป็นเพื่อนแล้ว)

"source": {
"type": "group",
"groupId": "Ca56f94637c...",
"userId": "U4af4980629..." //เฉพาะกรณีผู้ใช้คนนั้นเพิ่ม Bot เป็นเพื่อนแล้ว
}

source room: บ่งบอกว่ามาจากผู้ใช้สื่อสารกับ Bot ในห้อง ซึ่งกรณีนี้เราจะได้ทั้ง roomId และ userId(เฉพาะกรณีผู้ใช้คนนั้นเพิ่ม Bot เราเป็นเพื่อน)

"source": {
"type": "room",
"roomId": "Ra8dbf4673c...",
"userId": "U4af4980629..." //เฉพาะกรณีผู้ใช้คนนั้นเพิ่ม Bot เป็นเพื่อนแล้ว
}

โครงสร้างของ Payload

นี่เป็นโครงสร้างของ payload ที่จะส่งมากับทุก event ซึ่งสังเกตุว่า properties ชั้นนอกสุดจะมี 2 ตัวคือ

  • events: ข้อมูลสัญญาณทั้ง 15 แบบ
  • destination: UID ของ Bot

UID ของ Bot จะบอกที่มาว่าผู้ใช้สนทนากับ Bot ตัวไหนอยู่ ทำให้เราสามารถรองรับ Multi-Bot ด้วย API เดียวได้ สะด๊วกสะดวก

{
"events": [{
"type": "[message, follow, unfollow, join, leave, memberJoined, memberLeft, postback, beacon, accountLink, things]",
"source": {
"type": "[user, group, room]",
...
},
"timestamp": 1546848285013,
...
}],
"destination": "U820116ffcbe3f3ca7..."
}

Webhook Events

ก่อนที่จะไปรู้จัก Webhook Events ทั้ง 15 สัญญาณ มาว่ากันถึงส่วนของ programming ที่ผมจะใช้ในการพ่น payload ออกมาให้ดูกัน โดยต่อจากบทความด้านบนที่แปะไว้ ผมจะใช้ Cloud Functions for Firebase ซึ่งเป็น Node.js ตามโค้ดด้านล่างนี้

ใคร deploy เรียบร้อยแล้ว ก็มาเริ่มกันเลย

1. Message Event

สัญญาณประเภทนี้เกิดจากที่ผู้ใช้ส่งข้อความมา โดย properties ใน payload จะประกอบไปด้วย

  • type:message
  • replyToken: Token ที่ใช้ในการส่งข้อความกลับ
  • message: เป็น object ที่บรรจุข้อความประเภทต่างๆที่ผู้ใช้ส่งมา ได้แก่ Text, Image, Video, Audio, File, Location และ Sticker

จาก Message object ด้านบน เรามาดูรายละเอียดและตัวอย่างของแต่ละประเภทกัน

1.1 Text

ข้อความประเภท text จะมี properties ประกอบไปด้วย

  • id: id ของข้อความ
  • type: text
  • text: ข้อความที่ส่งมาเป็นตัวหนังสือ
{
"events": [{
"type": "message",
"replyToken": "50781340b00541cc...",
"source": {
"userId": "U3c28a70ed7c5e7ce2...",
"type": "user"
},
"timestamp": 1546848285013,
"message": {
"type": "text",
"id": "9141452766858",
"text": "Hello, world!"
}
}],
"destination": "U820116ffcbe3f3ca7..."
}

1.2 Image

ข้อความประเภทรูปภาพจะมี properties ประกอบไปด้วย

  • id: id ของข้อความ
  • type: image
  • contentProvider.type: provider ของรูป แบ่งออกเป็น
    -lineกรณีส่งจากผู้ใช้โดยตรง
    -external กรณีส่งจาก LIFF
  • contentProvider.originalContentUrl: URL ของรูป เฉพาะที่ contentProvider.type เป็น external
  • contentProvider.previewImageUrl: URL ของรูปพรีวิว เฉพาะที่ contentProvider.type เป็น external
{
"events": [{
"type": "message",
"replyToken": "2fad91d0e9424bb5...",
"source": {
"userId": "U3c28a70ed7c5e7ce2...",
"type": "user"
},
"timestamp": 1546854929833,
"message": {
"type": "image",
"id": "9141988397354",
"contentProvider": { "type": "line" }
}
}],
"destination": "U820116ffcbe3f3ca71b..."
}

1.3 Video

ข้อความประเภทวิดีโอจะมี properties ประกอบไปด้วย

  • id: id ของข้อความ
  • type: video
  • duration: ความยาวของวิดีโอ หน่วยเป็น milliseconds
  • contentProvider.type: provider ของวิดีโอ แบ่งออกเป็น
    -lineกรณีส่งจากผู้ใช้โดยตรง
    -external กรณีส่งจาก LIFF
  • contentProvider.originalContentUrl: URL ของวิดีโอ เฉพาะที่ contentProvider.type เป็น external
  • contentProvider.previewImageUrl: URL ของรูปพรีวิว เฉพาะที่ contentProvider.type เป็น external
{
"events": [{
"type": "message",
"replyToken": "b8585e2d55ac4d92b...",
"source": {
"userId": "U3c28a70ed7c5e7ce2c...",
"type": "user"
},
"timestamp": 1546859261191,
"message": {
"type": "video",
"id": "9142349548909",
"contentProvider": { "type": "line" },
"duration": 3071
}
}],
"destination": "U820116ffcbe3f3ca71b..."
}

1.4 Audio

ข้อความประเภทเสียง(ที่ได้จากการกด push to talk) จะมี properties ประกอบไปด้วย

  • id: id ของข้อความ
  • type: audio
  • duration: ความยาวของไฟล์เสียง หน่วยเป็น milliseconds
  • contentProvider.type: provider ของไฟล์เสียง แบ่งออกเป็น
    -lineกรณีส่งจากผู้ใช้โดยตรง
    -external กรณีส่งจาก LIFF
  • contentProvider.originalContentUrl: URL ของไฟล์เสียง เฉพาะที่ contentProvider.type เป็น external
{
"events": [{
"type": "message",
"replyToken": "5aa27b4b6299486...",
"source": {
"userId": "U3c28a70ed7c5e7ce...",
"type": "user"
},
"timestamp": 1547094872285,
"message": {
"type": "audio",
"id": "9157571757912",
"contentProvider": { "type": "line" },
"duration": 1590
}
}],
"destination": "U820116ffcbe3f3ca71..."
}

1.5 File

ข้อความประเภทไฟล์ ซึ่งเราสามารถส่งให้ Bot ผ่าน group และ room แต่ไม่สามารถส่งให้ Bot แบบ 1:1 ได้ จะมี properties ประกอบไปด้วย

  • id: id ของข้อความ
  • type: file
  • fileName: ชื่อไฟล์
  • fileSize: ขนาดของไฟล์ในหน่วย byte
{
"events": [{
"type": "message",
"replyToken": "b62969124db74697...",
"source": {
"groupId": "C728f1ee876d403e4...",
"userId": "U3c28a70ed7c5e7ce2...",
"type": "group"
},
"timestamp": 1547096682306,
"message": {
"type": "file",
"id": "9157693274393",
"contentProvider": { "type": "line" },
"fileName": "Rub Kwan By Sri",
"fileSize": 841856
}
}],
"destination": "U820116ffcbe3f3ca71..."
}

1.6 Location

ข้อความประเภทพิกัด จะมี properties ประกอบไปด้วย

  • id: id ของข้อความ
  • type: location
  • title: ชื่อสถานที่
  • address: ที่อยู่
  • latitude: ละติจูด หน่วยเป็นทศนิยม
  • longitude: ลองจิจูด หน่วยเป็นทศนิยม
{
"events": [{
"type": "message",
"replyToken": "baed6d778bb04a24...",
"source": {
"userId": "U3c28a70ed7c5e7ce2...",
"type": "user"
},
"timestamp": 1547102567952,
"message": {
"type": "location",
"id": "9158079495874",
"title": "LINE Thailand",
"address": "Gaysorn Tower Pathum Wan Bangkok 10330 Thailand",
"latitude": 13.745984,
"longitude": 100.540779
}
}],
"destination": "U820116ffcbe3f3ca71..."
}

1.7 Sticker

ข้อความประเภทสติ๊กเกอร์ จะมี properties ประกอบไปด้วย

  • id: id ของข้อความ
  • type: sticker
  • packageId: id ของแพ๊คเกจ
  • stickerId: id ของสติ๊กเกอร์
  • stickerResourceType: ประเภทของสติ๊กเกอร์ (STATIC, ANIMATION, SOUND, ANIMATION_SOUND, POPUP, POPUP_SOUND, NAME_TEXT)
  • keywords: เป็น Array ของกลุ่มคำที่แสดงความหมายของสติ๊กเกอร์ตัวนั้นๆ
{
"events": [{
"type": "message",
"replyToken": "20c0fb718a564...",
"source": {
"userId": "U3c28a70ed7c5e7...",
"type": "user"
},
"timestamp": 1547103403077,
"message": {
"type": "sticker",
"id": "9158135798213",
"stickerId": "30505571",
"packageId": "10597",
"stickerResourceType": "STATIC",
"keywords": ["sally","hi","whatsup","HEY","Hello"]
}
}],
"destination": "U820116ffcbe3f3ca71..."
}

Event ประเภท image, video, audio และ file เราสามารถไปดึง binary ออกมาได้โดยใช้ Get Content API และ ID ของ Message ตามรายละเอียดด้านล่างนี้

Endpoint: https://api.line.me/v2/bot/message/{messageId}/contentMethod: GETHeaders:
- Authorization: Bearer <access_token ที่ได้มา>

2. Follow Event

สัญญาณประเภทนี้เกิดจากที่ผู้ใช้เพิ่ม Bot เราเป็นเพื่อน หรือ unblock โดย properties ใน payload จะประกอบไปด้วย

  • type:follow
  • replyToken: Token ที่ใช้ในการส่งข้อความกลับ
{
"events": [{
"type": "follow",
"replyToken": "31476556789a4365...",
"source": {
"userId": "U3c28a70ed7c5e7ce2...",
"type": "user"
},
"timestamp": 1547104557739
}],
"destination": "U820116ffcbe3f3ca71..."
}

3. Unfollow Event

สัญญาณประเภทนี้เกิดจากที่ผู้ใช้ block Bot เรา โดย properties ใน payload จะประกอบไปด้วย

  • type:unfollow
{
"events": [{
"type": "unfollow",
"source": {
"userId": "U3c28a70ed7c5e7ce2...",
"type": "user"
},
"timestamp": 1547106290376
}],
"destination": "U820116ffcbe3f3ca71..."
}

unfollow payload จะไม่มี replyToken แนบมา(ก็เค้า unfollow แล้ว อย่าไปยิงเค้าเลย) แต่จะมีประโยชน์กับเราตรงที่ ถ้าเราเก็บ userId ใน database เราสามารถ flag ได้ว่า userId ไหน ไม่ active แล้ว เพื่อที่ต้อง push หรือ multicast จะได้เลือกเฉพาะผู้ใช้ที่ยัง active อยู่

4. Join Event

สัญญาณประเภทนี้เกิดจากที่ Bot ถูกเชิญเข้า group หรือ room โดย properties ใน payload จะประกอบไปด้วย

  • type:join
  • replyToken: Token ที่ใช้ในการส่งข้อความกลับ
{
"events": [{
"type": "join",
"replyToken": "3d41b964299c48efb...",
"source": {
"groupId": "C728f1ee876d403e46...",
"type": "group"
},
"timestamp": 1547108059564
}],
"destination": "U820116ffcbe3f3ca71..."
}

5. Leave Event

สัญญาณประเภทนี้เกิดจากที่ Bot ถูกเชิญออกจาก group หรือ room โดย properties ใน payload จะประกอบไปด้วย

  • type:leave
{
"events": [{
"type": "leave",
"source": {
"groupId": "C728f1ee876d403e46...",
"type": "group"
},
"timestamp": 1547108059564
}],
"destination": "U820116ffcbe3f3ca71..."
}

leave payload จะไม่มี replyToken แนบมา(ก็เค้าเตะ Bot ออกจากกลุ่มแล้ว) แต่จะมีประโยชน์กับเราตรงที่ ถ้าเราเก็บ groupId ใน database เราสามารถ flag ได้ว่า groupId ไหน ไม่ active แล้ว เพื่อที่ต้อง push หรือ multicast จะได้เลือกเฉพาะ group หรือ room ที่ยัง active อยู่

6. Member Join Event

สัญญาณประเภทนี้เกิดจากที่มีผู้ใช้ใหม่เข้า group หรือ room ซึ่งใน group หรือ room นั้นๆมี Bot สถิตอยู่ที่นั่นแล้ว(ได้ userId ด้วยนะ) โดย properties ใน payload จะประกอบไปด้วย

  • type:memberJoined
  • replyToken: Token ที่ใช้ในการส่งข้อความกลับ
  • joined.members: object ข้อมูลของผู้ใช้ใหม่ที่เพิ่งเข้าร่วม group หรือ room
{
"events": [{
"type": "memberJoined",
"replyToken": "342e5baf6d2342...",
"source": {
"groupId": "C728f1ee876d403...",
"type": "group"
},
"timestamp": 1547117737398,
"joined": {
"members": [{
"userId": "Ua0e8dd654eeb567...",
"type": "user"
}]
}
}],
"destination": "U820116ffcbe3f3ca71..."
}

7. Member Leave Event

สัญญาณประเภทนี้เกิดจากที่ผู้ใช้ออกจาก group หรือ room โดย properties ใน payload จะประกอบไปด้วย

  • type:memberLeft
  • left.members: object ข้อมูลของผู้ใช้ที่ออกจาก group หรือ room
{
"events": [{
"type": "memberLeft",
"source": {
"groupId": "C728f1ee876d403e4...",
"type": "group"
},
"timestamp": 1547129903218,
"left": {
"members": [{
"userId": "Ua0e8dd654eeb5...",
"type": "user"
}]
}
}],
"destination": "U820116ffcbe3f3ca71..."
}

8. Postback Event

สัญญาณประเภทนี้เกิดจากที่มีการส่ง postback action โดย properties ใน payload จะประกอบไปด้วย

  • type:postback
  • replyToken: Token ที่ใช้ในการส่งข้อความกลับ
  • postback.data: ข้อมูลที่ผู้ใช้แนบมา
  • postback.params: ข้อมูลวันเวลา ซึ่งมีได้ 3 รูปแบบ
    - date วันที่ที่ผู้ใช้เลือก
    - time เวลาที่ผู้ใช้เลือก
    - datetime วันและเวลาที่ผู้ใช้เลือก
    ทั้งนี้ขึ้นอยู่กับการตั้งค่าใน datetime picker action ซึ่ง property ตัวนี้จะมีเฉพาะกรณีที่มาจาก datetime picker action
{
"events": [{
"type": "postback",
"replyToken": "8ae8a2f124134d3db1...",
"source": {
"userId": "U3c28a70ed7c5e7ce2c9...",
"type": "user"
},
"timestamp": 1547131234426,
"postback": {
"data": "action=buy&itemid=123"
}
}],
"destination": "U820116ffcbe3f3ca71..."
}

9. Beacon Event

สัญญาณประเภทนี้เกิดจากที่ผู้ใช้เดินเข้าหรือออกรัศมีการทำงานของ LINE Beacon โดย properties ใน payload จะประกอบไปด้วย

  • type:beacon
  • replyToken: Token ที่ใช้ในการส่งข้อความกลับ
  • beacon.hwid: Hardware ID ของตัว beacon
  • beacon.type: ประเภทของสัญญาณ beacon ซึ่งมี 3 รูปแบบ
    - enter เข้าสู่ระยะทำการ
    - leave ออกจากระยะทำการ
    - banner เมื่อตัว beacon สามารถ detect ผู้ใช้ในบริเวณได้
  • beacon.dm: ข้อความซึ่งสามารถตั้งค่ามากับ beacon
{
"events": [{
"type": "beacon",
"replyToken": "d6274364652f4543a9...",
"source": {
"userId": "U3c28a70ed7c5e7ce2c9...",
"type": "user"
},
"timestamp": 1547133415314,
"beacon": {
"hwid": "011ee00bf4",
"dm": "00000000000000",
"type": "enter"
}
}],
"destination": "U820116ffcbe3f3ca71..."
}

10. Device Link Event

สัญญาณประเภทนี้เกิดจากที่ LINE Things ได้ถูกเชื่อมต่อกับ LINE ของผู้ใช้ โดย properties ใน payload จะประกอบไปด้วย

  • type:things
  • replyToken: Token ที่ใช้ในการส่งข้อความกลับ
  • things.deviceId: Device ID ของ LINE Things device
  • things.type: link
{
"events": [{
"type": "things",
"replyToken": "d6274364652f4543a9...",
"timestamp": 1462629479859,
"source": {
"type": "user",
"userId": "U3c28a70ed7c5e7ce2c9..."
},
"things": {
"deviceId": "t2c449c9d1...",
"type": "link"
}
}],
"destination": "U820116ffcbe3f3ca71..."
}

11. Device Unlink Event

สัญญาณประเภทนี้เกิดจากที่ LINE Things ได้ถูกตัดสายสัมพันธ์กับ LINE ของผู้ใช้ โดย properties ใน payload จะประกอบไปด้วย

  • type:things
  • replyToken: Token ที่ใช้ในการส่งข้อความกลับ
  • things.deviceId: Device ID ของ LINE Things device
  • things.type: unlink
{
"events": [{
"type": "things",
"replyToken": "d6274364652f4543a9...",
"timestamp": 1462629479859,
"source": {
"type": "user",
"userId": "U3c28a70ed7c5e7ce2c9..."
},
"things": {
"deviceId": "t2c449c9d1...",
"type": "unlink"
}
}],
"destination": "U820116ffcbe3f3ca71..."
}

12. Scenario Execution Event

สัญญาณประเภทนี้เกิดจากที่ LINE Things ได้ถูก execute ตัว scenario set ที่ได้ register ไว้ โดย properties ใน payload จะประกอบไปด้วย

  • type:things
  • replyToken: Token ที่ใช้ในการส่งข้อความกลับ
  • things.deviceId: Device ID ของ LINE Things device
  • things.type: scenarioResult
  • things.result.scenarioId: ID ของ Scenario ที่ถูก execute
  • things.result.revision: เลข Revision ใน Scenario set
  • things.result.startTime: Timestamp ที่เริ่ม execute
  • things.result.endTime: Timestamp เมื่อ execute ตัว Scenario เสร็จ
  • things.result.resultCode: Status หลังการ execute ตัว Scenario (success, gatt_error, runtime_error)
  • things.result.bleNotificationPayload: ข้อมูล binary ที่เข้ารหัสด้วย Base64 ซึ่งสามารถแนบมาจาก device กรณีที่ register ตัว Scenario set เป็นแบบ trigger.type = BLE_NOTIFICATION
  • things.result.actionResults: Array ของผลลัพธ์จาก action หากเราได้ระบุให้ device ทำงาน ซึ่งอยู่ในขั้นตอน register ตัว scenario set
  • things.result.actionResults[].type: void, binary
  • things.result.actionResults[].data: ข้อมูล binary ที่เข้ารหัสด้วย Base64 ซึ่งจะมาเฉพาะกรณีที่ type ด้านบนเป็น binary เท่านั้น
  • things.result.errorReason: ข้อความ error กรณีที่ status เป็น gatt_error หรือ runtime_error
{
"events": [{
"type": "things",
"replyToken": "d6274364652f4543a9...",
"source": {
"userId": "U3c28a70ed7c5e7ce2c9...",
"type": "user"
},
"timestamp": 1547817848122,
"things": {
"type": "scenarioResult",
"deviceId": "t2c449c9d1...",
"result": {
"scenarioId": "XXX",
"revision": 2,
"startTime": 1547817845950,
"endTime": 1547817845952,
"resultCode": "success",
"bleNotificationPayload": "AQ==",
"actionResults": [{
"type": "binary",
"data": "/w=="
}]
}
}
}],
"destination": "U820116ffcbe3f3ca71..."
}

13. Acount Link Event

สัญญาณประเภทนี้เกิดจากที่ผู้ใช้เชื่อมต่อ LINE account กับ provider service

  • type:accountLink
  • replyToken: Token ที่ใช้ในการส่งข้อความกลับ
  • link: object ที่มีผลลัพธ์ของการเชื่อมต่อ และ nonce
{
"events": [{
"type": "accountLink",
"replyToken": "b60d432864f44d079s...",
"source": {
"userId": "U3c28a70ed7c5e7ce2c9...",
"type": "user"
},
"timestamp": 1513669370317,
"link": {
"result": "ok",
"nonce": "xxxxxxxxxxxxxxx"
}
}],
"destination": "U820116ffcbe3f3ca71..."
}

ส่วนตัวผมยังไม่ได้ลองพัฒนาบริการให้เกิด Account Link Event หากใครลองแล้วก็มาเล่าสู่กันฟังหน่อยนะครับ

14. Unsend Event

สัญญาณประเภทนี้เกิดจากที่ผู้ใช้ใน Group หรือ Room(ที่มี Chatbot อยู่) ทำการ unsend ข้อความ

  • type:unsend
  • unsend.messageId: ID ของข้อความที่ได้ unsend ไป
{
"events": [{
"type": "unsend",
"source": {
"roomId": "R1617be0278fc47",
"userId": "U3c28a70ed7c5e7",
"type": "room"
},
"timestamp": 1596596494039,
"mode": "active",
"unsend": {
"messageId": "12443473790308"
}
}],
"destination": "U8543d6cbe9c23e"
}

15. Video Viewing Complete Event

สัญญาณประเภทนี้เกิดจากที่ผู้ใช้ดูวิดีโอ(ที่แนบ trackingId มาใน Video)จบ

  • type:videoPlayComplete
  • replyToken: Token ที่ใช้ในการส่งข้อความกลับ
  • videoPlayComplete.trackingId: ID ที่ผู้ใช้แนบมาใน payload ของข้อความประเภท Video
{
"events": [{
"type": "videoPlayComplete",
"replyToken": "afae59425b8c4",
"source": {
"userId": "U3c28a70ed7c5e7",
"type": "user"
},
"timestamp": 1596598625356,
"mode": "active",
"videoPlayComplete": {
"trackingId": "12345"
}
}],
"destination": "U8543d6cbe9c23e5"
}

สัญญานประเภทนี้สามารถเกิดขึ้นซ้ำๆได้ หากผู้ใช้ออกจากห้องแชทแล้วกลับมาดูวิดีโออีกครั้ง

สรุป

บทความนี้น่าจะช่วยให้นักพัฒนาได้เข้าใจเรื่องของ Webhook Events ใน LINE Messaging API กันมากขึ้น ได้รู้จัก trigger ทั้ง 15 แบบ ทั้งในเรื่องของโครงสร้างของ payload ที่ได้จาก webhook, properties ต่างๆใน payload ทั้งแบบ common ที่มีมาแน่ๆ และแบบที่อิงตาม event ที่เกิดขึ้น รวมถึงข้อมูลที่เป็นประโยชน์ที่เราได้รับจาก webhook

และจากการที่ผมเขียนบทความนี้ ก็ทำให้ผมเพิ่งรู้ว่า LIFF มันส่ง message ได้มากกว่า text แล้วนะ ตอนนี้เราสามารถส่ง text, image, video, audio, location และ template message กลับเข้าไปในห้องแชทได้แล้ว สามารถสังเกตุได้จาก property ที่ชื่อ contentProvider.type ซึ่งถ้าค่าเป็น external แล้ว นั่นหละมาจาก LIFF เลย

สุดท้ายนี้ ก็หวังว่านักพัฒนาจะเกิดไอเดียในการพัฒนา LINE Bot ให้ตอบสนองกับ event ต่างๆ และทำให้ประสบการณ์การใช้งาน LINE Bot ของคุณดีมากขึ้น สนุกขึ้น สำหรับวันนี้ขอตัวลาไปก่อน แล้วพบกันใหม่บทความหน้าครับชาว #LINEDEVTH

--

--

Jirawatee
LINE Developers Thailand

Technology Evangelist at LINE Thailand / Google Developer Expert in Firebase