ก่อนหน้านี้ผมได้เคยเขียนบทความวิธีใช้ Power Query ดึงข้อมูลจาก Web API ไปแล้ว 3 ตอน ถ้าใครยังไม่เคยเข้าไปอ่านก็สามารถเข้าไปอ่านดูก่อนได้นะครับ (ไม่อ่านก็ยังสามารถทำตามในบทความนี้ได้อยู่)
- https://www.thepexcel.com/power-query-web-api-1/
- https://www.thepexcel.com/power-query-web-api-2/
- https://www.thepexcel.com/power-query-web-api-3/
ซึ่งบทความในวันนี้เนื้อหาจะคล้ายกับตอนที่ 2 ของเดิมมากๆ คือเป็น Web API แบบ Post แต่จะเป็นกรณีตัวอย่างการใช้กับ EMS Tracking ของไปรษณีย์ไทยโดยเฉพาะ ซึ่งหลายๆ คนน่าจะอยากใช้งานอยู่ ซึ่งวิธีทำนี้จะใช้ใน Excel หรือ Power BI ก็ได้นะครับ (พอดีมีลูกค้าที่เรียน Power BI กับผมถามมา เลยเอามาเขียนเป็นบทความเผื่อเพื่อนๆ คนอื่นด้วยเลยดีกว่า)
เพื่อไม่ให้เสียเวลา เรามาเริ่มดูขั้นตอนกันเลยละกัน
สมัครสมาชิกแล้วเอา Token มาก่อน
ขั้นตอนแรกที่จำเป็นเลยคือเข้าไปในเว็บ https://track.thailandpost.co.th/ จากนั้นสมัครสมาชิกแล้วเข้าสู่ระบบให้เรียบร้อย (ขอไม่ลงรายละเอียดวิธีสมัครนะ)
จากนั้นให้เข้าหน้า Dashboard ในส่วนของ <>สำหรับนักพัฒนา แล้วกด Create Token จากนั้น Copy Token ปัจจุบันออกมาซะ
ศึกษาคู่มือซักหน่อย
ผมเองก็ดูข้อมูลตามที่บอกในคู่มือ ในส่วนของ API REST แล้วก็ทำตามได้ดังนี้ (คู่มือมีจุดที่เขียนแล้วสับสนตรง Token ให้ดูตัวอย่างผมแทนได้)
GetToken สำหรับการรับส่งข้อมูล
โดย Token รับส่งข้อมูลนี้เป้นคนละตัวกับ Token จากการสมัครสมาชิกนะ… และจะมีการกำหนดวันหมดอายุ 1 เดือน
ให้เรา Get Data from Web แบบ Advanced แล้วใส่ดังนี้
- URL Parts : https://trackapi.thailandpost.co.th/post/api/v1/authenticate/token
- HTTP Request Header
- Authorization : คำว่า Token ตามด้วยเว้นวรรค 1 ที ตามด้วย Token ในหน้าสมาชิก
- Content-Type : application/json
จากนั้นกด ok แล้วกด Connect
มันก็จะทำการเข้าสู่ Power Query Editor แล้วได้ผลลัพธ์มาเป็น Token รับส่งข้อมูล ซึ่งจะยาวกว่า Token ในหน้าสมาชิกมากๆ ให้เรา Copy เก็บเอาไว้ใช้ได้ (Token รับส่งข้อมูลหมดอายุใน 1 เดือน)
พอเราได้ Token รับส่งข้อมูลแล้ว คราวนี้เราถึงสามารถทำการค้นหาตามพวกรหัส EMS ได้ซักที
สร้าง Query ดึงข้อมูลจากรหัส Tracking
ให้เราสร้าง Blank Query (Get Data -> From Other Source -> Blank Query) ขึ้นมาแล้วเปลี่ยน Code ใน Advanced Editor ให้เป็นดังนี้
let
BarCodeList={"EDXXXXXXXX","RLXXXXXXXX","EDXXXXXXXX"}, //List เก็บรหัส Track
DataToken="xxxxxxx", //Token รับส่งข้อมูลยาวๆ
MyRecord=[status="all",language="TH",barcode=BarCodeList], //Record ที่จะ Post เข้า API
Source = Json.Document(Web.Contents("https://trackapi.thailandpost.co.th/post/api/v1/track",
[
Headers=
[
Authorization="Token "&DataToken,
#"Content-Type"="application/json"
],
Content=Json.FromValue(MyRecord)
]
))
in
Source
จากนั้นเปลี่ยนสิ่งที่ระบุใน BarCodeList และ DataToken ตามต้องการ เช่น
จากนั้นพอ Run Query จะได้ดังนี้ แสดงว่าสำเร็จ
ดูข้อมูลที่ Response กลับมา
จากนั้นเราก็กดเข้าไปใน Record ที่ response กลับมา 1 ที แล้วกด Record ที่ items อีกที แล้วค่อยกด Convert เป็น Table
จากนั้นให้ Expand List ออกมาเป็นหลายๆแถว
จากนั้นค่อย Expand Record ออกมาโดยเลือกเอาเฉพาะคอลัมน์ที่ต้องการได้เลย
แล้วเราก็จะได้ Data ที่ต้องการแบบละเอียดทุกขั้นตอนเลย เย้!
ทำยังไงให้เพิ่ม List รหัสง่ายๆ
ที่นี้ถ้าอยากให้ Dynamic มากขึ้น แทนที่เราจะพิมพ์ List ของรหัส EMS ที่ต้องการ Track เข้าไปเอง เราก็ดึง List นั้นมาจาก Table ของ Excel ได้ เช่น ผมสร้าง Table ชื่อ TrackTable แล้วมีคอลัมน์ TrackNumber เอาไว้ (เอาจริงๆ จะเป็น Data Source อะไรก็ได้อ่ะนะ)
จากนั้น Get Data เข้า Power Query ซะ
จากนั้นคลิ๊กขวาในคอลัมน์ที่ต้องการแล้ว DrillDown เราก็จะได้ List แล้ว
เนี่ยได้ List แล้ว ซึ่ง List นี้ชื่อว่า TrackTable
จากนั้นเราก็แค่เอา TrackTable ไปใส่ใน Code เดิมของเรา ก็จบ ง่ายขึ้นอีกเยอะ!!
let
BarCodeList=TrackTable, //List เก็บรหัส Track
DataToken="xxxxxxx", //Token รับส่งข้อมูลยาวๆ
MyRecord=[status="all",language="TH",barcode=BarCodeList], //Record ที่จะ Post เข้า API
Source = Json.Document(Web.Contents("https://trackapi.thailandpost.co.th/post/api/v1/track",
[
Headers=
[
Authorization="Token "&DataToken,
#"Content-Type"="application/json"
],
Content=Json.FromValue(MyRecord)
]
))
in
Source
เนี่ย ทุกอย่างยังทำงานได้เหมือนเดิม แต่เจ๋งกว่าเดิมตรงแก้รหัสที่จะ Track ได้ง่ายเลย!!
และนี่คือผลลัพธ์ที่เราได้ครับ แจ่มมากๆ
ข้อควรระวัง ที่เขียนไว้ในระบบ คือ สามารถใช้งาน API ได้สูงสุด 1,000 หมายเลขต่อการ Post 1 ครั้ง โดยสามารถใช้งานได้ 15 ครั้ง ต่อ 3 วินาที กรณีมีการใช้งานเกิน 15 ครั้ง ต่อ 3 วินาที ระบบจะทำการปิดกั้นการใช้งานชั่วคราว เป็นระยะเวลา 30 วินาที
ดังนั้นอย่าส่งเยอะและถี่เกินไปนะครับ ^^