เชื่อมต่อข้อมูลการเงินจากธนาคารแห่งประเทศไทย (BOT) ด้วยโค้ดไพธอนและไมโครซอฟต์เอ็กเซล
ใครที่อยู่สายการเงินหรือสายเศรษฐศาสตร์อาจมีโอกาสได้ต้องใช้ข้อมูลด้านการเงินจากธนาคารแห่งประเทศไทย (Bank of Thailand: BOT) ไม่มากก็น้อย ไม่ว่าจะเป็นอัตราแลกเปลี่ยนเงินตราต่างประเทศ อัตราเงินเฟ้อ ฯลฯ ข้อมูลเหล่านี้มีการประกาศทางหน้าเว็บไซต์ให้เข้าถึงได้โดยสาธารณะ อย่างไรก็ดีนอกจากการประกาศให้ผู้ใช้ข้อมูลเข้าไปตรวจสอบข้อมูลด้วยตัวเองแล้ว ทางธนาคารแห่งประเทศไทยยังได้เปิดบริการ API สำหรับให้ผู้ใช้งานสามารถเขียนโค้ดเข้าไปดึงข้อมูลโดยตรงเพื่ออำนวยความสะดวกในการดึงข้อมูลไปใช้งานอีกด้วย
บทความนี้เราจะมาทดสอบการเรียกใช้ข้อมูลจากเว็บไซต์บริการข้อมูลของธนาคารแห่งประเทศไทย เพื่อนำมาแสดงผล ผ่านสองรูปแบบด้วยกัน ได้แก่ 1) การเขียนโค้ดภาษา Python และ 2) การดึงข้อมูลด้วยโปรแกรมไมโครซอฟต์เอ็กเซลผ่าน Power Query
สมัครใช้บริการ API ของธนาคารแห่งประเทศไทย
การให้บริการข้อมูลโดยธนาคารแห่งประเทศไทยมีการจัดการการเข้าถึงข้อมูลผ่านการจัดการผู้ใช้ ผู้ประสงค์ใช้งานจำเป็นต้องดำเนินการสมัครบัญชีผู้ใช้งาน (account) ก่อน ซึ่งสามารถสมัครใช้งานได้ฟรี โดยคลิกที่ปุ่ม create an account ที่มุมขวาบนของหน้าเว็บไซต์

เมื่อสมัครบัญชีผู้ใช้เรียบร้อยแล้ว ก่อนที่จะสามารถใช้งาน API ได้ การเชื่อมต่อ API จะทำได้ผ่าน “แอปพลิเคชัน” ซึ่งจะเป็นตัวกลางของการเชื่อมต่อข้อมูล หลังจากลงทะเบียน โดยสามารถคลิกได้จากปุ่ม + Create new App หรือที่นี่ แล้วกรอกข้อมูล “แอปพลิเคชัน” ได้แก่ ชื่อแอป (คำอธิบาย และ OAuth Redirect URI ถ้าทราบ) หลังจากนั้น ระบบจะพาไปสู่หน้าต่างแจ้งว่าแอปพลิเคชันถูกลงทะเบียนเสร็จสมบูรณ์ เพื่อใช้งาน API ให้เลื่อนหน้าต่างลงมายังช่อง Client ID แล้ว คัดลอก key ดังกล่าวเก็บไว้

เลือกบริการ API
หลังจากดำเนินการลงทะเบียนแอปพลิเคชันแล้ว ผู้ใช้สามารถเลือกดูบริการ API จากทางธนาคารแห่งประเทศไทยได้จากแถบ API Products โดยในที่นี้เราได้เลือกบริการข้อมูล Exchange Rates 2.0.1 ซึ่งให้บริการอัตราแลกเปลี่ยนเงินบาทต่อเงินดอลลาร์สหรัฐฯ โดยผู้ใช้บริการจะต้องดำเนินการ Subscribe เพื่อแจ้งว่าจะให้แอปพลิเคชันไหน เชื่อมโยงกับบริการ API ดังกล่าว ในที่นี้เราเลือก Subscribe ตัวเลือกดังกล่าว (Exchange Rates 2.0.1) เข้ากับแอป BOT-GBDi ที่เราสร้างไว้ในขั้นตอนก่อนหน้า

เมื่อดำเนินการ Subscribe การใช้งาน API แล้ว ผู้ใช้สามารถเข้าไปพิจารณารายละเอียดบริการ API จากแถบด้านซ้ายมือ โดยในกรณีของบริการ Exchange Rates 2.0.1 นี้ ได้ให้บริการ 2 บริการย่อย ได้แก่ บริการค่าเฉลี่ยถ่วงน้ำหนักอัตราแลกเปลี่ยนเงินบาท/ดอลลาร์สหรัฐ (Weighted-average Interbank Exchange Rate – THB / USD 2.0.0) และบริการค่าเฉลี่ยอัตราแลกเปลี่ยนเงินบาท/เงินตราต่างประเทศอื่น (Average Exchange Rate – THB / Foreign Currency 2.0.1)

เขียนโค้ดไพธอนเพื่อดึงข้อมูลอัตราแลกเปลี่ยน
จากรูปที่ 4 ผู้ใช้สามารถนำโค้ดตัวอย่างมาใช้เพื่อดึงข้อมูลจากบริการ API ได้ โดยจำเป็นต้องระบุ apiKey ในรูปแบบของ headers ของ request โดย headers นี้เป็นตัวแปรประเภท dictionary ซึ่งเก็บคีย์สองตัว ได้แก่ ‘x-ibm-client-id’ และ ‘accept’ สำหรับ Weighted-average Interbank Exchange Rate – THB / USD 2.0.0 API ในส่วนของ GET /DAILY_REF_RATE/ ซึ่งใช้เป็นตัวอย่างในการดึงข้อมูลนี้นั้น นอกจากในเรื่องของการรับรองสิทธิการเข้าถึงข้อมูล (Authentication) แล้วนั้น ผู้ใช้จำเป็นต้องระบุพารามิเตอร์อีกสองตัวเพื่อให้ API ดึงข้อมูลออกมาแสดง ได้แก่ วันที่เริ่มต้น และวันที่สิ้นสุด ทั้งนี้ข้อจำกัดของ API ดังกล่าว ให้เรียกข้อมูลได้ไม่เกิน 31 วัน
headers = {
'x-ibm-client-id': "bdc1fe35-f88c-42ee-b0e2-1c6d3881ad86",
'accept': "application/json"
}
START_PERIOD = "2021-07-01"
END_PERIOD = "2021-07-05"
จากนั้นเราจะทำการใช้ไลบรารี่ http.client เพื่อเชื่อมโค้ดดังกล่าวเข้ากับบริการ API ของธนาคารแห่งประเทศไทย มาเก็บในตัวแปร รูปแบบข้อมูลที่ได้จะอยู่ในโครงสร้างแบบ JSON ซึ่งในที่นี้เราจะใช้ฟังก์ชัน eval เพื่อแปลงข้อมูลดังกล่าว และเลือกเฉพาะในส่วนของคีย์ที่เก็บข้อมูลสำคัญสำหรับใช้งาน ถือเป็นอันสิ้นสุดการเขียนโค้ดภาษาไพธอนเพื่อดึงข้อมูลอัตราแลกเปลี่ยนรายวันจากบริการ API ของธนาคารแห่งประเทศไทย ซึ่งผู้ใช้อาจต่อเติมโค้ดดังกล่าวเพื่อนำข้อมูลไปใช้ประโยชน์ต่อไป
import http.client
conn = http.client.HTTPSConnection("apigw1.bot.or.th")
conn.request("GET", "/bot/public/Stat-ReferenceRate/v2/DAILY_REF_RATE/?start_period=" + START_PERIOD + "&end_period="+END_PERIOD, headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))
print('nn')
print(eval(data.decode("utf-8"))['result']['data']['data_detail'])
ดึงข้อมูลอัตราแลกเปลี่ยนด้วยไมโครซอฟต์เอ็กเซล
สำหรับใครที่ไม่คุ้นชินกับการเขียนโค้ดเพื่อดึงข้อมูลนั้นไม่ต้องเหนื่อยใจไป ในบทความนี้เราขอเสนออีกหนึ่งวิธีเพื่อใช้ดึงข้อมูล API ด้วยโปรแกรมที่หลายคนอาจจะคุ้นชินมากกว่า นั่นก็คือไมโครซอฟต์เอ็กเซล โดยผู้เขียนได้ดัดแปลงจากบทความว่าด้วยเรื่องของ How To Parameterize Your Power Query
ขั้นตอนแรกคือการเชื่อมต่อเอ็กเซลของเราไปยังบริการ API ซึ่งอยู่บนเว็บไซต์ โดยสามารถทำได้จากการเลือกเมนู Data > From Other Sources > From Web
Key | Value |
---|---|
URL part | https://apigw1.bot.or.th/bot/public/Stat-ReferenceRate/v2/DAILY_REF_RATE/ ?start_period= 2021-06-08 &end_period= 2021-06-08 |
accept | application/json |
x-ibm-client-id | <client id จำเพาะกับแอปพลิเคชันซึ่งได้ลงทะเบียนไว้> |
จากนั้นจะปรากฏหน้าต่างสำหรับกรอกรายละเอียดของหน้าเว็บ (API) ที่ต้องการจะเชื่อมต่อ โดยองค์ประกอบที่จำเป็นต้องระบุได้แก่ ตัว URL (ซึ่งรวมพารามิเตอร์ในส่วนของวันเริ่มและวันสุดท้าย) และในส่วนของ headers ซึ่งใช้จัดการการรับรองสิทธิในการเรียกใช้ API ในกรณีนี้ให้เลือกตัวเลือก Advanced และระบุข้อมูล URL และ headers ตามตัวอย่างในภาพ โดยอาจตัดแบ่งส่วนของ API ให้เป็นท่อนให้สามารถอ่านได้ง่าย และระบุพารามิเตอร์ในส่วนของวันเริ่มและวันสุดท้ายที่ต้องการดึงข้อมูลให้เรียบร้อยในรูปแบบ YYYY-MM-DD และสำหรับในส่วนของคีย์ x-ibm-client-id ให้ระบุ apiKey ที่ได้จากการลงทะเบียนแอปพลิเคชันบนหน้าเว็บของธนาคารแห่งประเทศไทย จากนั้นให้กดปุ่ม OK
ในกรณีที่ปรากฏหน้าต่าง Access Web content ขึ้นมาเพิ่มเติมสำหรับจัดการรูปแบบสิทธิ์ในการเข้าถึง ให้เลือกแถบ Anonymous และปรับระดับ (level) การเข้าถึงให้ครอบคุลมสำหรับ https://apigw1.bot.or.th/bot/public แล้วกดปุ่ม connect เพื่อดำเนินการในขั้นตอนถัดไป

จากนั้นโปรแกรมจะเปิดหน้าต่างของ Power Query (ตัวเดียวกับที่เราใช้เตรียมข้อมูลสำหรับทำแดชบอร์ดบน Power BI) ขึ้นมาสำหรับจัดรูปแบบข้อมูลที่ดึงมาได้ให้อยู่ในรูปตารางชุดข้อมูล ในขั้นตอนนี้อาจตรวจสอบการสิทธิ์ในการดึงข้อมูลให้สามารถทำได้ ให้แน่ใจว่า Permission การเข้าถึงหน้าข้อมูลถูกตั้งให้เป็น Anonymous โดยสามารถเข้าถึงหน้า Permission ได้จากเมนู Home > Data source settings จากนั้นเลือก Edit Permissions… เมื่อมั่นใจว่าเป็นสิทธิ์การเข้าถึงแบบ Anonymous แล้ว ให้ปิดหน้าต่างการจัดการ Data source settings

ข้อมูลที่ดึงมาจะอยู่ในลักษณะโครงสร้าง JSON โดยหน้าต่าง Power Query จะแสดงข้อมูลบนระดับชั้นบนสุดของไฟล์ JSON เมื่อต้องการเข้าถึงข้อมูลในชั้นโครงสร้างที่ลึกลงไปในโครงสร้างไฟล์ JSON ที่ดึงมา เราสามารถคลิกที่ Record > Record > List จากนั้นจึงดำเนินการขยายโครงสร้าง JSON ที่ได้ ให้กลายเป็นตารางโดยการคลิกที่เมนู Transform > To Table

จากนั้นจะปรากฏหน้าต่างสำหรับตั้งค่าการสร้างตารางจากไฟล์ JSON ให้กดโอเค จากนั้นจึงคลิกที่ปุ่ม expand ที่มุมขวาบนของตาราง หรือที่เมนู Transform > Expand ทำการคลิกเลือกคอลัมน์ที่ต้องการ (ในที่นี้เลือกทุกคอลัมน์) และคลิกยกเลิก (ไม่เลือก) หน้าคำสั่ง Use original name as prefix จากนั้นตั้งชื่อ Query ตามต้องการ

ปิดโปรแกรม Power Query โดยการคลิกที่ปุ่มเมนู Home > Close & Load ตารางที่ได้จาก Power Query จะถูกสร้างบนชีตใหม่ของไฟล์เอ็กเซลโดยอัตโนมัติ หากตารางดังกล่าวไม่ถูกสร้างบนเวิร์กชีตของเอ็กเซล ผู้ใช้สามารถสร้างตารางบนไมโครซอฟต์เอ็กเซล โดยคลิกขวาที่ Query ที่สร้างขึ้นจาก Power Query > Load To… แล้วเลือกพื้นที่หรือรูปแบบที่ต้องการให้ข้อมูลจากการ Query ไปปรากฏให้เหมาะสม

ปรับพารามิเตอร์ API ผ่านเซลบนไมโครซอฟต์เอ็กเซล
จากหัวข้อก่อนหน้าจะเห็นว่าองค์ประกอบของ API ที่ใช้สำหรับ request ขอข้อมูลจากบริการ API ของธนาคารแห่งประเทศไทยนั้นประกอบด้วย URL, พารามิเตอร์ของ API (วันที่เริ่ม และวันสิ้นสุด) และรายละเอียด Credential หากผู้ใช้ต้องการปรับแก้รายละเอียดบางอย่าง เช่น วันที่เริ่ม หรือวันที่สิ้นสุด ผู้ใช้จำเป็นต้องเข้าไปแก้รายละเอียดการ Query ซึ่งหากผู้ใช้ขาดความคุ้นชินกับ Power Query ก็อาจทำได้ค่อนข้างลำบาก
เพื่อให้ผู้ใช้สามารถปรับแก้พารามิเตอร์หรือองค์ประกอบอื่นสำหรับการ request ขอข้อมูลจากบริการ API ได้สะดวกขึ้นนั้น เราอาจปรับแต่งการ Query ให้ใช้ข้อมูลจากเซลบนเวิร์กชีตของไมโครซอฟต์เอ็กเซลเป็นตัวแปรหนึ่งเพื่อนำไปเรียกใช้บน Power Query ตามขั้นตอนดังต่อไปนี้
สร้างตารางรวบรวมพารามิเตอร์ที่จะต้องใช้
ดำเนินการสร้างตารางรวบรวมพารามิเตอร์ที่จำเป็นสำหรับการเรียกใช้ API ในกรณีนี้ เราอาจสร้างพารามิเตอร์ต่างๆ ดังระบุในตาราง ทั้งนี้ค่าของ URL ที่จะใช้จริงอาจเป็นการคำนวณจากการนำค่า text ใน base_API มาต่อกับ Start และ End ซึ่งเป็นพารามิเตอรที่ใช้สำหรับปรับแต่งค่าที่จะรับกลับมาจากการเรียก API
Index | Parameter | Value |
---|---|---|
1 | base_API | https://apigw1.bot.or.th/bot/public/Stat-ReferenceRate/v2/DAILY_REF_RATE/ |
2 | Start | 2021-06-08 |
3 | End | 2021-07-01 |
4 | URL | https://apigw1.bot.or.th/bot/public/Stat-ReferenceRate/v2/DAILY_REF_RATE/?start_period=2021-06-08&end_period=2021-06-08 |
5 | x-ibm-client-id | bdc1fe35-f88c-42ee-b0e2-1c6d3881ad86 |
6 | accept | application/json |
เพื่อให้การอ้างอิงตารางพารามิเตอร์นี้เป็นไปอย่างเป็นระบบ จำเป็นต้องตั้งค่าให้เอ็กเซลรับรู้ว่าค่าในเซลดังกล่าวเป็นตาราง โดยสามารถ ทำได้โดยเมนู Insert > Table (หรือกด Ctrl+T) แล้วเลือกขอบเขต (Range) ที่ครอบคลุมตารางพารามิเตอร์ดังกล่าว ทั้งนี้อาจตั้งชื่อตารางให้เหมาะสมจากเมนู Table Design > Table Name

สร้าง Query เพื่อใช้เป็นฟังก์ชันบน Power Query สำหรับอ้างถึงค่าบนตารางพารามิเตอร์
สร้าง Blank Query ผ่านการเลือกเมนู Data > From Other Sources > Blank Query จากหน้าต่างโปรแกรม Power Query ผู้ใช้งานสามารถตั้งชื่อ Query ให้เหมาะสม ในที่นี้ใช้ชื่อ fParam จากนั้นจึงเข้าสู่โหมดการแก้ไขขั้นสูงผ่านเมนู Home > Advanced Editor หรือเมนู View > Advanced Editor หรืออาจคลิกขวาที่ Query ที่สร้างขึ้นในแถบ Queries ด้านซ้ายมือ แล้วเลือก Advanced Editor ได้เช่นเดียวกัน

บนหน้าต่าง Advanced Editor ให้แทนค่าโค้ดด้วยโค้ดด้านล่าง
let Parameter=(TABLENAME,ROWNUMBER) =>
let
Source = Excel.CurrentWorkbook(){[Name=TABLENAME]}[Content],
value = Source{ROWNUMBER-1}[Value]
in
value
in Parameter
จากโค้ดข้างต้น Query ที่สร้างขึ้นจะมี 2 inputs ได้แก่ TABLENAME และ ROWNUMBER
- TABLENAME: เป็นชื่อของตัวแปรที่เก็บค่าตารางพารามิเตอร์ ให้แทนที่ค่าดังกล่าวด้วยชื่อของตารางพารามิเตอร์ที่ตั้งชื่อไว้บนไมโครซอฟต์เอ็กเซล สำหรับกรณีของเราคือ “param_table”
- ROWNUMBER: เป็นดัชนีแทนตัวเลขของแถวบนตารางพามิเตอร์สำหรับใช้ชี้ถึงพารามิเตอร์ที่ต้องการเรียกใช้ ในที่นี้เราใส่ ROWNUMBER-1 เนื่องจากดัชนีบน Power Query เริ่มนับจาก 0
เมื่อเสร็จเรียบร้อยผู้ใช้สามารถปิดหน้าต่าง Advanced Editor สำหรับ Query: fParam ได้
ปรับ Query เดิม (BOT_XRATE) ให้รับค่าพารามิเตอร์จาก fParam
เพื่อปรับรายละเอียดพารามิเตอร์ให้มีความยืดหยุ่นมากขึ้น เราจำเป็นต้องแปลงค่าพารามิเตอร์ต่าง ๆ ที่ถูกเรียกใช้ใน Query: BOT_XRATE จากเดิมที่ถูกกำหนดตายตัว ให้สามารถรับค่าจาก Query: fParam ที่สร้างขึ้นในขั้นตอนก่อนหน้าได้ โดยอาจทำได้จากโหมดการแก้ไขขั้นสูงสำหรับ Query: BOT_XRATE ซึ่งสามารถเข้าถึงได้โดยการเลือก Query ดังกล่าว แล้วกดเมนู Home > Advanced Editor หรือเมนู View > Advanced Editor หรืออาจคลิกขวาที่ตัว Query แล้วเลือก Advanced Editor

จากโค้ดบนหน้าต่าง Advanced Editor จะเห็นว่าแต่ละบรรทัดของโค้ดสอดคล้องกับแต่ละขั้นตอนที่แสดงผลในช่อง APPLIED STEPS ภายใต้แถบ Query Settings ด้านขวามือของโปรแกรม Power Query
ในที่นี้ให้ดำเนินการตามขั้นตอนดังต่อไปนี้
- เพิ่มโค้ดต่อไปนี้ในบรรทัดหลังคำว่า let และ ก่อนคำว่า Source (อย่าลืมเครื่องหมายจุลภาค , ท้ายแต่ละบรรทัด) โดยชื่อ fParam นั้นอ้างถึง Query: fParam ที่สร้างไว้ก่อนหน้า ในขณะที่ชื่อ param_table เป็นชื่อตารางพารามิเตอร์บนไมโครซอฟต์เอ็กเซล และตัวเลขด้านหลังแทนตัวเลขในคอลัมน์ index ซึ่งใช้อ้างถึงพารามิเตอร์ตัวนั้นๆ
URL = fParam("param_table", 4),
ACCEPT = fParam("param_table", 6),
API_KEY = fParam("param_table", 5),
- ปรับบรรทัดที่ระบุ Source ซึ่งระบุคำสั่งที่ใช้ในการดึงข้อมูล โดยแทนที่ value เดิมด้วยชื่อตัวแปรในข้อ 1. หรืออาจคัดลอกโค้ดด้านล่างไปแทนที่บรรทัดดังกล่าวในหน้าต่าง Advanced Editor
Source = Json.Document(Web.Contents(URL, [Headers=[accept=ACCEPT, #"x-ibm-client-id"=API_KEY]])),

เมื่อดำเนินการเสร็จสิ้นขั้นตอนแล้ว สามารถปิดหน้าต่าง Power Query เพื่อกลับไปยังโปรแกรมไมโครซอฟต์เอ็กเซลได้ และเนื่องจากเราได้ตั้งค่าให้ Query: BOT_XRATE แสดงค่าเป็นตารางบนเวิร์กชีตไว้ในขั้นตอนก่อนหน้านี้แล้ว ข้อมูลจาก Query ดังกล่าวจะถูกแสดงยังจุดเดิมตามที่ได้ตั้งค่าไว้
ผู้ใช้สามารถทดสอบการเปลี่ยนค่าพารามิเตอร์ในตารางเป็นค่าอื่น เช่น เปลี่ยนวันเริ่มต้นในการดึงข้อมูล หลังจากเปลี่ยนค่าในเซลแล้ว สามารถอัปเดตการดึงข้อมูลด้วยการไปที่เมนู Data > Refresh All ข้อมูลในตารางข้อมูลที่ดึงมาจากเว็บไซต์จะถูกเปลี่ยนไปเป็นค่าอื่นตามพารามิเตอร์ที่ระบุไว้ในตารางพารามิเตอร์

อินเตอร์เน็ตเป็นสื่อสำคัญที่ช่วยให้เราสามารถเข้าถึงข้อมูลได้หลากหลายและรวดเร็วมากขึ้น ข้อมูลเหล่านี้มีอยู่หลากหลายรูปแบบขึ้นกับลักษณะการนำไปใช้งาน ความหลากหลายเหล่านี้ผลักดันให้เกิดการพัฒนาเครื่องมือต่าง ๆ ที่จะช่วยให้สามารถนำข้อมูลเหล่านี้ไปใช้ประโยชน์ได้ง่ายขึ้น การเรียนรู้วิธีการใช้เครื่องมือเหล่านี้จึงจะช่วยให้เราใช้ประโยชน์จากข้อมูลได้อย่างมีประสิทธิภาพ และตอบโจทย์การใช้งานที่หลากหลาย รวมทั้งช่วยให้สามารถผลักกระบวนการทำงานเดิมที่ซ้ำซากให้เป็นหน้าที่ของเครื่องมือด้านดิจิทัล ซึ่งจะทำให้เราได้ลงแรงและเวลาเพื่อทำงานในส่วนอื่น เช่น งานที่ต้องอาศัยความคิดสร้างสรรค์ ซึ่งไม่สามารถถูกแทนที่ด้วยเครื่องมือเหล่านี้ต่อไป
สรุปเนื้อหาโดย พีรดล สามะศิริ
ตรวจทานโดย ดวงใจ จิตคงชื่น