การส่งข้อมูลแจ้งเตือนจาก Office 365 Services ผ่าน LINE Notify แบบ low-code ด้วย Power Automate

Narisorn Limpaswadpaisarn
EchoO365
Published in
6 min readMay 11, 2022

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/

Line Notify

จากนั้นมาที่ My Page และไปที่ Generate token

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 ก็นำหลักการนี้ไปประยุกต์ใช้เป็นเหตุแจ้งงานที่เกี่ยวกับระบบภายในก็ได้

Copy token เอาไว้
สร้าง Trigger เป็น RSS Feed หรือ สิ่งที่เราอยากจะให้เริ่ม flow แล้วก็สร้างตัวแปร จาก Initialized variable จาก Token ที่เรา copy มา ในนี้ตั้งชื่อว่า ChannelAccessToken

จากนั้นใน 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

HTTP Action ยิงเข้า Line notify
ConvertTimeZone expression
เมื่อทำครั้งแรกจะมีข้อความต้อนรับ

พอยิง flow สำเร็จก็จะมี message ใน format

ชื่อ token ที่เราตั้ง: message ที่เราดึงมาจาก flow

เวลามี Blog ตอนใหม่ ส่งข้อความใน 1-on-1 chat with LINE Notify

ถ้าไม่ใช้แล้วสามารถ disconnect ได้

Disconnect ตัว token ไม่ให้เอาไปใช้ได้อีก
การสร้าง token หรือการ Disconnect ก็จะมีมาแจ้งเสมอ
ทดลองยิงเข้า Line Group โดยต้องมีการ add ตัว LINE Notify เข้า Group ก่อน (add โดย search ชื่อ LINE Notify ได้เลยเหมือน add เพื่อนเข้า LINE Group)

จากตัวอย่าง RSS ก็สามารถประยุกต์การ Triggered โดย Office 365 Services ได้เช่นกัน เช่น จาก Microsoft Form

ตัวอย่างการส่ง Response จาก Microsoft Form เข้า LINE Notify เพื่อระบุคนกรอก Form
ส่งเข้า LINE เรียบร้อย

ตัวอย่างเพิ่มเติมสำหรับตัว 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

เช่นเราเลือก stickerPackageId เบอร์ 789 และ stickerId เบอร์ 10859

Content-Type เป็น application/x-www-form-urlencoded ซึ่งตรง Body จะใช้ = แทน : และ & แทน , ในกรณีใน parameter ที่ Body หลายอัน

ในตัวอย่างนี้เพื่อความง่ายในการทดลองขอเป็นการ Trigger แบบ manual โดยใส่เป็น Text Input นะครับ

ตัวอย่างนี้ใส่ trigger แบบ manual โดยต้องมี Input เป็น text (ตัวอย่างนี้ขอเปลี่ยนชื่อตัวแปรเป็น varBearer)
ตัวอย่างแบบการใช้ Dynamic Content ใส่ใน message และ ใส่ค่า stickerPackageId และ stickerId โดยคั่นด้วย & และทุกอันอยู่บรรทัดเดียวกัน (action นี้ต่อจาก Initialized variable)
พอ test run แล้วใส่ text input ก็จะส่ง Text ตาม Dynamic content และ sticker ที่เราเลือก

หรือสามารถส่งเป็นรูปโดยใส่ค่าของ imageFullsize (max 2048x2048px JPEG) และ imageThumbnail (max 240x240px JPEG) โดยใส่ link ของ รูปใน internet

imageFullsize และ imageThumbnail

ทดลองแบบ multipart/form-data

อันนี้เอามาช่วยในกรณีเราจะ upload file ไปที่ LINE Server เองแล้ว ส่งรูปนั้นผ่าน LINE Notify ซึ่งปกติในถ้าเราทำใน Postman ก็จะยิงง่ายกว่า

ทดลอง upload รูปแล้วยิงผ่าน Tool อย่าง Postman เช่น จะส่งข้อความว่า Here’s your file และ ส่งรูป logo.jpg
ก็จะได้รูปมาใน Line Notify

พอมาดู code snippet ที่เป็นแบบ HTTP request ได้ประมาณนี้

Code snippet ของ multipath/form-data ก็จะเห็นข้อมูล ของ Message และ รูปจาก File path

ส่วน 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 ได้

https://docs.microsoft.com/en-us/power-platform/admin/onpremises-data-gateway-management#manage-gateway-installers

โดยเลือกชื่อ Action ว่า Get file metadata แล้วก็ ใส่ข้อมูล ตั้งชื่อ connection นี้เป็นอะไรก็ได้, การ Sign in ไปที่ Local AD ของเราในกรณีเครื่อง PC เรา join domain กับ Active Directory และ เลือกชื่อ On premise gateway ชื่อที่เรา install ลงไป เพื่อให้ Service ลงไป connect กับ PC เราได้

File System Connection

พอ Connect สำเร็จก็สามารถให้ File path ไปหา folder และ ไปถึง file นั้นๆเพื่อเอาข้อมูลต่างๆ เพิ่มเติมนอกเหนือจาก content เช่น ชื่อไฟล์, file size และอื่นๆ

จากนั้นเพิ่มอีก action ของ File system ชื่อ Get file content เพื่อเอา Binary Content ของ Image File นั้น โดยเราเอา Path จาก Dynamics content มาจาก action ที่แล้วได้เลย

สมมุติ source ตัว image ไว้ที่ Desktop

จากนั้นเราค่อยมาเพิ่มตัว HTTP action โดยต้องทำเป็น form-data ตามนี้ (ผมแกะมาจาก code snippet ใน Postman แล้วเอามา modify ได้ตามด้านล่าง) ซึ่งค่อนข้างซับซ้อนซักหน่อย

Header เหลือบรรทัดเดียว
ในส่วนของ Body เทียบกับ code snippet และ เรามีการ add dynamic content จาก Trigger input เป็น message และ content จาก file path

ตัวอย่างตามด้านล่างโดย “ เป็นฟันหนูตรง

{
“$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

Flow วิ่งผ่านสำเร็จและก็มีแจ้งทั้ง message และ รูปจาก LINE Notify

ในกรณีถ้า File เราอยู่บน OneDrive for Business ก็สามารถทำได้เช่นกัน ไม่ต้องตั้ง On-premise data gateway แต่อย่างใด โดยเปลี่ยน จาก File System action ทั้ง 2 อันเป็นของ OneDrive for Business

OneDrive for Business Action
modify ตัว dynamic content ให้จาก File System เป็น OneDrive
Trigger run ผ่านได้เช่นเดียวกัน
ส่งข้อมูลสำเร็จ

--

--

Narisorn Limpaswadpaisarn
EchoO365

Office 365 and Modern Workplaces: Please follow my publication https://medium.com/echoo365 for Microsoft 365 & Power Platform Blog (In Thai)