ทดลองดึงข้อมูล Calendar ด้วย Google Calendar API บน Nodejs
พอดีได้ลองเล่นตัว Google Calendar API ก็เลยนำมาเขียนเป็นบทความแชร์ไว้ ซึ่ง Tutorial ทั้งหมดผมก็อ่านจาก Google Calendar API Quickstart ของมันแหละครับ ซึ่งข้อมูลอย่างละเอียดแนะนำอ่าน Guides,Quickstart เพิ่มเติมเอานะครับ ส่วน Source Code ทั้งหมดดูได้บน Github
Step 1 : Create Project
เริ่มต้นสร้างโปรเจ็ค ผมทำการสร้างโปรเจ็ค ด้วย
จากนั้นก็ทำการติดตั้ง dependencies ของ google
ต่อมาผมติดตั้ง hapi
ซึ่งเอาไว้รัน web serve (หรือใครถนัดใช้ express ก็เปลี่ยนได้ครับ)
และทำการสร้าง server ง่ายๆขึ้นมาตัวนึง ชื่อไฟล์ server.js
เพิ่ม scripts เข้าไปในไฟล์ package.json
แล้วสั่งรัน
จะได้ server ที่รันอยู่บน port 2345 แล้ว
Step 2 : Enable Calendar API
ต่อมาก่อนที่เราจะใช้งาน Calendar API นั้น ให้ทำการ enable ตัว Google Calendar API ก่อน เพื่อให้มีสิทธิ์ในการเรียกใช้งาน API โดยเข้าไปที่ Enable Google Calendar API (เลือก Project ที่เราต้องการ หรือไม่ก็สร้างขึ้นมาใหม่)
จากนั้นเลือกแท็ป Credentials ซ้ายมือ แล้วเลือก Oauth consent screen จากนั้นกรอก email และ Product Name
จากนั้นเลือก Credentials =>
Create credentials =>
OAuth client ID เลือก Others และตั้งชื่อตามที่ต้องการ
เมื่อสร้างเสร็จ ก็จะได้ไฟล์ JSON ทำการดาวน์โหลดมามาไว้ในโปรเจ็คของเรา ตั้งชื่อว่า client_secret.json
ตัวไฟล์ client_secret.json
จะมีข้อมูลของแอพเราอยู่ประมาณนี้
Step 3 : Run quickstart
ทำการดาวน์โหลดไฟล์จาก quickstart.js
โดยได้ทำการเปลี่ยนแค่ SCOPES
จาก
เป็น
สำหรับเพิ่ม permission เอาไว้จัดการ เพิ่มหรือลบ event ได้ ทดลองสั่งรัน
จะได้ output ออกมา (ไม่เหมือนกัน ขึ้นอยู่กับชื่อ project, clientId) ให้ก็อปไปวางไว้บน browser แล้วก็ทำการ Authorized จากนั้นก็ใส่ code กลับมาที่ terminal อีกรอบ
ไฟล์ autrorized จะถูกเซฟไว้ที่ ~/.credentials/calendar-nodejs-quickstart.json
ซึ่งมาถึงตรงนี้ หากใครแสดงรายชื่อ events บน Calendar ได้แล้ว แสดงว่าสามารถเรียกใช้ API ได้ เป็นอันจบ
แต่…เดี๋ยวก่อน ผมไม่อยากใช้การ รัน node quickstart.js
แบบ Tutorial ก็เลยทำเป็น library ซะเลย
Step 4 : Create library
ขั้นตอนนี้ผมจะนำไฟล์ quickstart.js
มาแปลงเป็น library เพื่อให้เรียกใช้งานง่ายๆผ่าน Server hapi พร้อมทั้งเพิ่มการสร้าง event เข้าไปใน Calendar ได้
สร้างไฟล์ lib/index.js
ขึ้นมา ในไฟล์ library ผมแปลงจาก quickstart.js
เป็น library แบบนี้
ซึ่งเวลาเรียกใช้งานผ่านทาง express ผมก็แค่
แต่ว่าทำเป็น callback ไม่ได้ใช้ Promise ซึ่งเวลาเรียกใช้งานจำเป็นที่จะต้องส่ง Callback ไปด้วย
Step 5 : Implement Server Side
ต่อมาในส่วน hapi server ผมอยากใช้มี route 2 อัน คือ
- GET
/events
: สำหรับแสดง events จาก google calendar - POST
/events
: สำหรับสร้าง events แบบเดียวกับสร้างในหน้า Calendar
แน่นอน ทั้งหมดผมทำเป็น API ไม่ได้มีหน้า UI ฉะนั้นการรับส่งข้อมูลก็จะเป็นแค่ JSON นะครับ
สร้างไฟล์ routes.js
ขึ้นมาดังนี้
สำหรับ hapi js เล็กน้อย ในเรื่อง routing เราสามารถกำหนดได้ทั้งhandler: function(request, reply) {}
หรือจะเป็นconfig: Object
ก็ได้ครับ รายละเอียดเพิ่มเติม http://hapijs.com/tutorials/routing
ต่อมาผมสร้างไฟล์ controller.js
ขึ้นมา
ผมเพิ่ม validate.js
เล็กน้อย เวลาที่ส่ง parameters สำหรับ POST method
จะได้ไม่มีปัญหา
สุดท้ายไฟล์ server.js
ทดลองสั่งรัน server
เข้าหน้าเว็บ http://localhost:2345/ เป็นอันเรียบร้อย
สรุป
ตัวอย่างทั้งหมดอันนี้ผมก็ศึกษาจาก Google Calendar API และลองทำเล่นๆเท่านั้น จะเห็นว่าไม่มีหน้า UI เนื่องจากผมกะเอาไปใช้งานร่วมกับคำสั่งพวก slash command ของ Slack หรือว่า bot service อื่นๆ ดูในอนาคตครับ
สุดท้าย Source Code ครับ
- Authors
-
Chai Phonbopit
เป็น Web Dev ในบริษัทแห่งหนึ่ง ทำงานมา 10 ปีกว่าๆ ด้วยภาษาและเทคโนโลยี เช่น JavaScript, Node.js, React, Vue และปัจจุบันกำลังสนใจในเรื่องของ Blockchain และ Crypto กำลังหัดเรียนภาษา Rust