การส่งข้อมูลแจ้งเตือนจาก Office 365 Services ผ่าน LINE Notify แบบ low-code ด้วย Power Automate
Content difficulty — moderate
จากตอนที่แล้วได้มีการส่งโดยใช้ LINE Bot จาก Official Account ที่เราต้องสร้างจาก LINE (ดูตอนที่แล้วได้ที่ https://link.medium.com/Q3qqGmaWVpb) โดย triggered ข้อมูลจาก RSS Feed เวลาผม publish ตัว blog ตอนใหม่จาก medium ให้มันส่งเข้า LINE ไปหา users ที่ add ตัว Official Account
มาคราวนี้ในกรณีถ้าเราอยากจะแค่ notify ตัวเอง หรือ LINE Group ที่เราไปเป็นสมาชิกภายใต้ LINE account ของเรา โดยอาจจะ triggered จาก RSS Feed หรือ trigger ส่ง Data จากระบบอื่นจะทำได้อย่างไร?
Concept นี้ใช้ได้กับ Azure Logic Apps ได้เช่นกัน
ใช้ Line Notify
อันนี้จะง่ายกว่ามากในการ Setup สามารถใช้เพื่อ แจ้งส่วนตัวหรือแจ้งเข้ามาใน Line Group ที่ตัวเองอยู่ได้ได้โดย ไม่ต้องไปสร้าง Official Account ไม่ต้องเข้าหน้าของ LINE Dev
ให้เราเข้าไปที่ https://notify-bot.line.me/ แล้วทำการ Sign In ด้วย Account Line ของเรา
อ้างอิงรายละเอียดการ call ตัว API จาก https://notify-bot.line.me/doc/en/
จากนั้นมาที่ My Page และไปที่ Generate token
ตั้งชื่อ Token และเลือก Line Group ที่ต้องการยิง หรือ จะ test คุยกับตัวเองก็เลือกเป็น 1-on-1 chat with LINE Notify
ถ้าเอาเข้า Group chat ไหนต้อง Add ตัว Line Notify เข้า Group นั้นด้วยเพื่อให้มันส่งข้อความเข้ามาได้ แต่ถ้า 1-on-1 chat with LINE Notify ไม่ต้อง add
จากนั้นให้ copy token เอาไว้ แล้วเริ่มสร้าง Flow ที่ Trigger จาก RSS Feed แบบในตอนที่แล้ว https://link.medium.com/Q3qqGmaWVpb
สามารถประยุกต์การ Triggered โดย Office 365 Services ได้เช่นกัน เช่นเปลี่ยน trigger จาก RSS Feed เป็น เมื่อมี alert จาก Office 365 Service ต่างๆ เช่น SharePoint Online มีคน upload/Edit file แล้วก็ส่ง Dynamic content มาที่ LINE Notify ว่ามีข้อมูลอะไรบ้างเกี่ยวกับ file นั้นๆ
ในมุม Office 365 Admin user หรือ Azure user ก็นำหลักการนี้ไปประยุกต์ใช้เป็นเหตุแจ้งงานที่เกี่ยวกับระบบภายในก็ได้
จากนั้นใน HTTP action เราก็สามารถส่งข้อความไปใน Line Group ได้ โดยเป็น POST method และ URI คือ https://notify-api.line.me/api/notify
HTTP เป็น Premium connector ซึ่งต้องมี paid license ซึ่งสามารถสมัคร trial ชั่วคราวได้
ในตัวอย่างข้างล่างจะใช้เป็น Content-Type เป็น application/x-www-form-urlencoded ซึ่งตรง Body จะใช้ = แทน : และ & แทน , ในกรณีใน parameter ที่ Body หลายอัน
โดยจากตัวอย่างด้านล่าง
Publish On: เนื่องจาก Dynamic content ของ RSS ที่ชื่อ Feed publish on จะเป็น TimeStamp แบบ UTC จึงใช้ Expression เป็น format และ Timezone เป็น UTC+7 ซะโดยบ้านเราจะเป็น SE Asia Standard Time ซึ่งจะได้เป็น Expression ตามนี้ convertTimeZone(triggerOutputs()?[‘body/publishDate’],’UTC’,’SE Asia Standard Time’,’dd/MM/yyyy HH:mm’)
ตัว single quote ต้องเปนแบบตรงนะครับ พอได้ค่าทั้งหมดก็เอามาใส่หลัง message=
message สามารถใส่ได้สูงสุดถึง 1000 characters ส่วนถ้าเป็นตัว non-alphanumeric (เช่นตัว [, $, *, ;) ต้องใส่เป็น ค่า Percent Encode แทนเทียบได้จาก https://developer.mozilla.org/en-US/docs/Glossary/percent-encoding
พอยิง flow สำเร็จก็จะมี message ใน format
ชื่อ token ที่เราตั้ง: message ที่เราดึงมาจาก flow
ถ้าไม่ใช้แล้วสามารถ disconnect ได้
จากตัวอย่าง RSS ก็สามารถประยุกต์การ Triggered โดย Office 365 Services ได้เช่นกัน เช่น จาก Microsoft Form
ตัวอย่างเพิ่มเติมสำหรับตัว LINE Notify
เราสามารถส่งได้ด้วย header ใน 2 รูปแบบ application/x-www-form-urlencoded หรือ multipart/form-data
ทดลอง header แบบ application/x-www-form-urlencoded
ตัวอย่างส่งด้วยข้อความและ Stickers โดย sticker จะต้องใส่ตัวเลข stickerPackageId และ stickerId โดยไปดูได้ที่ https://developers.line.biz/en/docs/messaging-api/sticker-list/#specify-sticker-in-message-object
Content-Type เป็น application/x-www-form-urlencoded ซึ่งตรง Body จะใช้ = แทน : และ & แทน , ในกรณีใน parameter ที่ Body หลายอัน
ในตัวอย่างนี้เพื่อความง่ายในการทดลองขอเป็นการ Trigger แบบ manual โดยใส่เป็น Text Input นะครับ
หรือสามารถส่งเป็นรูปโดยใส่ค่าของ imageFullsize (max 2048x2048px JPEG) และ imageThumbnail (max 240x240px JPEG) โดยใส่ link ของ รูปใน internet
ทดลองแบบ multipart/form-data
อันนี้เอามาช่วยในกรณีเราจะ upload file ไปที่ LINE Server เองแล้ว ส่งรูปนั้นผ่าน LINE Notify ซึ่งปกติในถ้าเราทำใน Postman ก็จะยิงง่ายกว่า
พอมาดู code snippet ที่เป็นแบบ HTTP request ได้ประมาณนี้
ส่วน HTTP connector ของ Power Automate จะทำได้ยากสักหน่อยเนื่องจาก tool อย่าง Postman เป็น software ที่ติดตั้งบน PC เราทำให้เห็น Path ของ image file ที่เราจะ upload เข้า LINE แต่ Power Automate เป็น cloud services จะไม่เห็น folder path นั้น เราจึงต้องใช้ action อื่นมาเพิ่มเติมด้วย ในกรณีการไปเอา File จาก Windows Desktop จะเพิ่ม connector ชื่อ File System เข้าไปก่อน HTTP Action
โดยจะต้องมีการตั้ง server ชื่อ On-premise gateway (standard) ลงบนเครื่อง Server กลางที่ network connect กับ PC เราหรือจะให้ง่ายก็ download มาลงที่ PC เราเลยก็ได้ โดย Download มาใช้จาก https://go.microsoft.com/fwlink/?LinkId=2116849&clcid=0x409 และทำการ sign in ตัว Office 365 account ของเราเองซึ่งเราก็จะเป็น Gateway Owner
ทั้งนี้ทั้งนั้นจะลงได้สำเร็จตัว requirement อาจจะติด Corporate Firewall จากทีม security และ Allow policies ของ Office 365 Global Administrator ขององค์กรเราด้วยนะครับ
วิธีการ install ดูที่ https://docs.microsoft.com/en-us/data-integration/gateway/service-gateway-installในส่วนของ Firewall https://docs.microsoft.com/en-us/data-integration/gateway/service-gateway-communication
Admin สามารถ disable ไม่ให้ user ทำการสร้าง Gateway ได้
โดยเลือกชื่อ Action ว่า Get file metadata แล้วก็ ใส่ข้อมูล ตั้งชื่อ connection นี้เป็นอะไรก็ได้, การ Sign in ไปที่ Local AD ของเราในกรณีเครื่อง PC เรา join domain กับ Active Directory และ เลือกชื่อ On premise gateway ชื่อที่เรา install ลงไป เพื่อให้ Service ลงไป connect กับ PC เราได้
พอ Connect สำเร็จก็สามารถให้ File path ไปหา folder และ ไปถึง file นั้นๆเพื่อเอาข้อมูลต่างๆ เพิ่มเติมนอกเหนือจาก content เช่น ชื่อไฟล์, file size และอื่นๆ
จากนั้นเพิ่มอีก action ของ File system ชื่อ Get file content เพื่อเอา Binary Content ของ Image File นั้น โดยเราเอา Path จาก Dynamics content มาจาก action ที่แล้วได้เลย
จากนั้นเราค่อยมาเพิ่มตัว HTTP action โดยต้องทำเป็น form-data ตามนี้ (ผมแกะมาจาก code snippet ใน Postman แล้วเอามา modify ได้ตามด้านล่าง) ซึ่งค่อนข้างซับซ้อนซักหน่อย
ตัวอย่างตามด้านล่างโดย “ เป็นฟันหนูตรง
{
“$content-type”: “multipart/form-data”,
“$multipart”: [
{
“headers”: {
“Content-Disposition”: “form-data; name=\”Message\””
},
“body”: @{triggerBody()[‘text’]}
},
{
“headers”: {
“Content-Disposition”: “form-data; name=\”imageFile\”; filename=\”@{outputs(‘Get_file_metadata’)?[‘body/Name’]}\””
},
“body”: @{body(‘Get_file_content’)}
}
]
}
จากนั้นทดลอง trigger โดยใส่ input text ก็จะทำได้เหมือนกรณี Postman
ในกรณีถ้า File เราอยู่บน OneDrive for Business ก็สามารถทำได้เช่นกัน ไม่ต้องตั้ง On-premise data gateway แต่อย่างใด โดยเปลี่ยน จาก File System action ทั้ง 2 อันเป็นของ OneDrive for Business