เชื่อมต่อ Chatbot กับ API: ตัวอย่างการใช้งาน API พยากรณ์อากาศ
ในบทความที่แล้ว เราได้เรียนรู้ถึงวิธีการเลือก API ภาษาไทยที่เหมาะสมกับ Chatbot ของคุณ คราวนี้ เราจะมาลงมือปฏิบัติจริง โดยจะเชื่อมต่อ Chatbot ของเรากับ API พยากรณ์อากาศ เพื่อให้ Chatbot สามารถตอบคำถามเกี่ยวกับสภาพอากาศได้ เช่น "วันนี้ฝนจะตกไหม" หรือ "อุณหภูมิในกรุงเทพฯ ตอนนี้เท่าไหร่"
ในบทนี้ เราจะใช้ Python เป็นภาษาหลักในการพัฒนา และจะใช้ไลบรารี `requests` สำหรับการเรียกใช้งาน API และไลบรารี `Flask` สำหรับสร้าง Webhook endpoint ที่ Chatbot จะสื่อสารด้วย (แม้ว่าคุณอาจจะใช้ framework อื่น เช่น Django ก็ได้ แต่ Flask เป็นตัวเลือกที่เรียบง่ายและเหมาะสำหรับการเริ่มต้น)
ขั้นตอนที่ 1: ติดตั้งไลบรารีที่จำเป็น
ก่อนอื่น เราต้องติดตั้งไลบรารี `requests` และ `Flask` ก่อน สามารถทำได้โดยใช้ `pip` ดังนี้:
pip install requests flask
ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง Python และ pip เรียบร้อยแล้ว หากยังไม่ได้ติดตั้ง สามารถดาวน์โหลดได้จาก เว็บไซต์ Python
ขั้นตอนที่ 2: เลือก API พยากรณ์อากาศ
มี API พยากรณ์อากาศให้เลือกใช้งานมากมาย ทั้งฟรีและเสียเงิน ในตัวอย่างนี้ เราจะใช้ API ฟรีจาก OpenWeatherMap เนื่องจากใช้งานง่ายและมีข้อมูลที่ครอบคลุม (แต่ต้องสมัครสมาชิกและรับ API Key ก่อนใช้งาน)
หลังจากสมัครสมาชิกแล้ว ให้ไปที่หน้า API keys ในบัญชีของคุณ และคัดลอก API Key เก็บไว้ เราจะใช้ API Key นี้ในการเรียกใช้งาน API
ขั้นตอนที่ 3: เขียนโค้ด Python สำหรับเรียกใช้งาน API
ต่อไป เราจะเขียนโค้ด Python เพื่อเรียกใช้งาน API พยากรณ์อากาศของ OpenWeatherMap โดยจะรับชื่อเมืองเป็น input และแสดงผลข้อมูลสภาพอากาศ:
import requests
import json
def get_weather(city, api_key):
"""
ดึงข้อมูลสภาพอากาศจาก OpenWeatherMap API
Args:
city (str): ชื่อเมืองที่ต้องการทราบสภาพอากาศ
api_key (str): API Key ของ OpenWeatherMap
Returns:
dict: ข้อมูลสภาพอากาศในรูปแบบ JSON หรือ None หากเกิดข้อผิดพลาด
"""
base_url = "http://api.openweathermap.org/data/2.5/weather"
params = {
"q": city,
"appid": api_key,
"units": "metric", # แสดงผลเป็นองศาเซลเซียส
"lang": "th" # แสดงผลเป็นภาษาไทย (ถ้ามี)
}
try:
response = requests.get(base_url, params=params)
response.raise_for_status() # ตรวจสอบ HTTP status code (ถ้าไม่ใช่ 200 OK จะเกิด exception)
data = response.json()
return data
except requests.exceptions.RequestException as e:
print(f"เกิดข้อผิดพลาดในการเรียก API: {e}")
return None
except json.JSONDecodeError as e:
print(f"เกิดข้อผิดพลาดในการแปลง JSON: {e}")
return None
# ตัวอย่างการใช้งาน
if __name__ == '__main__':
api_key = "YOUR_API_KEY" # แทนที่ด้วย API Key ของคุณ
city = "Bangkok"
weather_data = get_weather(city, api_key)
if weather_data:
print(f"สภาพอากาศใน {city}:")
print(f" - อุณหภูมิ: {weather_data['main']['temp']} °C")
print(f" - สภาพอากาศ: {weather_data['weather'][0]['description']}")
print(f" - ความชื้น: {weather_data['main']['humidity']} %")
else:
print("ไม่สามารถดึงข้อมูลสภาพอากาศได้")
คำอธิบายโค้ด:
- `get_weather(city, api_key)`: ฟังก์ชันนี้รับชื่อเมืองและ API Key เป็น input จากนั้นจะสร้าง URL สำหรับเรียก API ของ OpenWeatherMap โดยใส่ parameters ที่จำเป็น เช่น ชื่อเมือง, API Key, หน่วยอุณหภูมิ (metric), และภาษา (th)
- `requests.get(base_url, params=params)`: ใช้ไลบรารี `requests` เพื่อส่ง HTTP GET request ไปยัง API
- `response.raise_for_status()`: ตรวจสอบว่าการเรียก API สำเร็จหรือไม่ ถ้าไม่สำเร็จ (เช่น HTTP status code เป็น 404 หรือ 500) จะเกิด exception
- `response.json()`: แปลง response ที่ได้จาก API (ซึ่งอยู่ในรูปแบบ JSON) เป็น Python dictionary
- `try...except`: ใช้ `try...except` เพื่อจัดการกับข้อผิดพลาดที่อาจเกิดขึ้น เช่น ข้อผิดพลาดในการเรียก API หรือข้อผิดพลาดในการแปลง JSON
- ส่วน `if __name__ == '__main__':` เป็นส่วนที่ใช้ทดสอบฟังก์ชัน `get_weather()` โดยจะกำหนด API Key และชื่อเมือง จากนั้นเรียกฟังก์ชันและแสดงผลข้อมูลสภาพอากาศ
ข้อผิดพลาดที่พบบ่อย:
- Invalid API Key: ตรวจสอบให้แน่ใจว่าคุณได้ใส่ API Key ที่ถูกต้อง
- City Not Found: ตรวจสอบให้แน่ใจว่าคุณได้ใส่ชื่อเมืองที่ถูกต้อง (OpenWeatherMap อาจไม่รู้จักชื่อเมืองที่คุณใส่)
- Connection Error: ตรวจสอบว่าคุณมีการเชื่อมต่ออินเทอร์เน็ต
- Rate Limit Exceeded: API ฟรีของ OpenWeatherMap มีข้อจำกัดในการเรียกใช้งาน (rate limit) หากคุณเรียกใช้งาน API บ่อยเกินไป คุณอาจจะเจอปัญหา rate limit exceeded
ขั้นตอนที่ 4: สร้าง Webhook Endpoint ด้วย Flask
ตอนนี้ เรามีโค้ดที่สามารถเรียกใช้งาน API พยากรณ์อากาศได้แล้ว ขั้นตอนต่อไปคือการสร้าง Webhook endpoint ที่ Chatbot จะสื่อสารด้วย เราจะใช้ Flask ในการสร้าง endpoint นี้:
from flask import Flask, request, jsonify
app = Flask(__name__)
API_KEY = "YOUR_API_KEY" # แทนที่ด้วย API Key ของคุณ
@app.route('/webhook', methods=['POST'])
def webhook():
"""
Webhook endpoint สำหรับรับข้อความจาก Chatbot
Returns:
str: ข้อความตอบกลับไปยัง Chatbot
"""
req = request.get_json(silent=True, force=True)
query_result = req.get('queryResult')
if query_result:
intent = query_result.get('intent').get('displayName')
parameters = query_result.get('parameters')
if intent == 'WeatherIntent': # สมมติว่า Chatbot ส่ง intent ชื่อ WeatherIntent
city = parameters.get('geo-city') # สมมติว่า Chatbot ส่งชื่อเมืองใน parameter ชื่อ geo-city
if city:
weather_data = get_weather(city, API_KEY)
if weather_data:
temperature = weather_data['main']['temp']
description = weather_data['weather'][0]['description']
humidity = weather_data['main']['humidity']
response_text = f"สภาพอากาศใน {city}: อุณหภูมิ {temperature} °C, สภาพอากาศ {description}, ความชื้น {humidity}%"
else:
response_text = "ไม่สามารถดึงข้อมูลสภาพอากาศได้"
else:
response_text = "กรุณาระบุชื่อเมือง"
else:
response_text = "ไม่เข้าใจคำถาม"
else:
response_text = "ไม่ได้รับข้อมูลจาก Chatbot"
return jsonify({'fulfillmentText': response_text})
if __name__ == '__main__':
app.run(debug=True)
คำอธิบายโค้ด:
- `@app.route('/webhook', methods=['POST'])`: กำหนด route `/webhook` สำหรับรับ HTTP POST request จาก Chatbot
- `request.get_json(silent=True, force=True)`: อ่าน JSON data ที่ส่งมาจาก Chatbot
- `query_result = req.get('queryResult')`: ดึงข้อมูลจาก `queryResult` ซึ่งเป็นส่วนที่ Chatbot ส่งข้อมูลเกี่ยวกับ intent และ parameters
- `intent = query_result.get('intent').get('displayName')`: ดึงชื่อ intent
- `parameters = query_result.get('parameters')`: ดึง parameters
- `if intent == 'WeatherIntent':`: ตรวจสอบว่า intent คือ `WeatherIntent` หรือไม่ (สมมติว่า Chatbot ส่ง intent นี้เมื่อผู้ใช้ถามเกี่ยวกับสภาพอากาศ)
- `city = parameters.get('geo-city')`: ดึงชื่อเมืองจาก parameter `geo-city` (สมมติว่า Chatbot ส่งชื่อเมืองใน parameter นี้)
- `get_weather(city, API_KEY)`: เรียกฟังก์ชัน `get_weather()` เพื่อดึงข้อมูลสภาพอากาศ
- `response_text = ...`: สร้างข้อความตอบกลับไปยัง Chatbot
- `return jsonify({'fulfillmentText': response_text})`: ส่งข้อความตอบกลับไปยัง Chatbot ในรูปแบบ JSON
- `app.run(debug=True)`: รัน Flask application ใน debug mode (สำหรับพัฒนา)
ข้อผิดพลาดที่พบบ่อย:
- Incorrect Intent Name or Parameter Name: ตรวจสอบให้แน่ใจว่าชื่อ intent และ parameter ที่ใช้ในโค้ดตรงกับที่ Chatbot ส่งมา
- JSON Decode Error: ตรวจสอบว่า JSON data ที่ส่งมาจาก Chatbot ถูกต้องหรือไม่
- Missing API Key: ตรวจสอบให้แน่ใจว่าคุณได้ใส่ API Key ที่ถูกต้อง
ขั้นตอนที่ 5: กำหนดค่า Chatbot ให้ส่ง request ไปยัง Webhook Endpoint
ขั้นตอนสุดท้ายคือการกำหนดค่า Chatbot ของคุณให้ส่ง HTTP POST request ไปยัง Webhook endpoint ที่เราสร้างขึ้น (ในตัวอย่างนี้คือ `/webhook`) เมื่อผู้ใช้ถามเกี่ยวกับสภาพอากาศ วิธีการนี้จะแตกต่างกันไปขึ้นอยู่กับ platform ที่คุณใช้สร้าง Chatbot (เช่น Dialogflow, Rasa, Microsoft Bot Framework)
โดยทั่วไป คุณจะต้องกำหนดค่า intent (เช่น `WeatherIntent`) และ parameters (เช่น `geo-city`) ใน Chatbot platform จากนั้นกำหนดค่าให้ Chatbot ส่งข้อมูลเหล่านี้ไปยัง Webhook endpoint ของคุณ
ข้อควรระวัง:
- Security: หากคุณกำลังใช้งาน Webhook endpoint ใน production environment ควรพิจารณาเรื่อง security เช่น การใช้ HTTPS และการตรวจสอบ signature ของ request ที่ส่งมาจาก Chatbot
- Error Handling: ควรเพิ่ม error handling ในโค้ดของคุณเพื่อจัดการกับข้อผิดพลาดที่อาจเกิดขึ้น เช่น ข้อผิดพลาดในการเรียก API หรือข้อผิดพลาดในการแปลง JSON
ในบทความนี้ เราได้เรียนรู้วิธีการเชื่อมต่อ Chatbot กับ API พยากรณ์อากาศ โดยใช้ Python, Flask, และ OpenWeatherMap API ในบทความถัดไป เราจะมาดูตัวอย่างการใช้งาน API แปลภาษา