Chatbot03 : Backend web service with Flask

RPA (Robotic Process Automation)
2 min readOct 19, 2020

--

จาก ChatBot02 ที่มีการใช้ Dialog Flow ในการโต้ตอบ บางครั้งอาจไม่พอ เพราะเราอยากใส่สูตรคำนวน บางอย่างลงไป ซึ่งตรงนี้เราจะใช้ Python ในการเข้ามาช่วยแก้ปัญหา โดยทำเป็น Web Service ให้ Dialog Flow มาเรียกใช้ ก็เช่นเคยครับ ผมได้ความรู้มาจาก StackPython อีกแล้วครับท่าน

  1. สิ่งที่ต้องลง

1.1. Program สำหรับเขียน Python (ผมใช้ PyCharm)

1.2. Program Ngrok ไว้สำหรับ สร้าง url ชั่วคราว จาก local host เป็น Public

1.3. Code ตัวอย่าง https://drive.google.com/file/d/1Ne_dfGF680W9WliSn_IefsFHz-va78Vs/view. หรือตามข้างล่าง

#code by Stackpython
#Import Library
import json
import os
from flask import Flask
from flask import request
from flask import make_response

# Flask
app = Flask(__name__)
@app.route('/', methods=['POST'])

def MainFunction():

#รับ intent จาก Dailogflow
question_from_dailogflow_raw = request.get_json(silent=True, force=True)

#เรียกใช้ฟังก์ชัน generate_answer เพื่อแยกส่วนของคำถาม
answer_from_bot = generating_answer(question_from_dailogflow_raw)

#ตอบกลับไปที่ Dailogflow
r = make_response(answer_from_bot)
r.headers['Content-Type'] = 'application/json' #การตั้งค่าประเภทของข้อมูลที่จะตอบกลับไป

return r

def generating_answer(question_from_dailogflow_dict):

#Print intent ที่รับมาจาก Dailogflow
print(json.dumps(question_from_dailogflow_dict, indent=4 ,ensure_ascii=False))

#เก็บต่า ชื่อของ intent ที่รับมาจาก Dailogflow
intent_group_question_str = question_from_dailogflow_dict["queryResult"]["intent"]["displayName"]

#ลูปตัวเลือกของฟังก์ชั่นสำหรับตอบคำถามกลับ
if intent_group_question_str == 'หิวจัง':
answer_str = menu_recormentation()
elif intent_group_question_str == 'Yes-คำนวนน้ำหนัก':
answer_str = BMI(question_from_dailogflow_dict)
else: answer_str = "ผมไม่เข้าใจ คุณต้องการอะไร"

#สร้างการแสดงของ dict
answer_from_bot = {"fulfillmentText": answer_str}

#แปลงจาก dict ให้เป็น JSON
answer_from_bot = json.dumps(answer_from_bot, indent=4)

return answer_from_bot

def menu_recormentation(): #ฟังก์ชั่นสำหรับเมนูแนะนำ
menu_name = 'ข้าวขาหมู'
answer_function = menu_name + ' สิ น่ากินนะ'
return answer_function

def BMI(respond_dict): #ฟังก์ชั่นสำหรับคำนวนน้ำหนัก

#เก็บค่าของ Weight กับ Height
weight1 = float(respond_dict["queryResult"]["outputContexts"][1]["parameters"]["Weight.original"])
height1 = float(respond_dict["queryResult"]["outputContexts"][1]["parameters"]["Height.original"])

#คำนวนน้ำหนัก
BMI = weight1/(height1/100)**2
if BMI < 18.5 :
answer_function = "ผอมจัง"
elif 18.5 <= BMI < 23.0:
answer_function = "สมส่วน"
elif 23.0 <= BMI < 25.0:
answer_function = "ค่อนข้างอ้วน"
elif 25.0 <= BMI < 30:
answer_function = "อ้วนล่ะนะ"
else :
answer_function = "อ้วนมากจ้าา"
return answer_function

#Flask
if __name__ == '__main__':
port = int(os.getenv('PORT', 5000))
print("Starting app on port %d" % port)
app.run(debug=False, port=port, host='0.0.0.0', threaded=True)

3. วิธีการ Run ngrok หลังจาก install แล้ว

3.1. สำหรับ windows > ngrok.exe - ngrok http 5000

3.2. สำหรับ Macbook > ngrok http 5000

4. คัดลอง URL จากข้อ 3 ไปวางใน Dialog Flow

5. และต้องไป Enable Intent ที่เราต้องการด้วย ไปที่ Fullfillment

--

--

No responses yet