test / app.py
yjhuang
create app
5306003
## import require packages ##
from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
import os
import google.generativeai as genai
## API Key: 直接用 os.getenv ##
LINE_TOKEN = os.getenv('LINE_TOKEN')
LINE_SECRET = os.getenv('LINE_SECRET')
GEMINI_API_KEY = os.getenv('GEMINI_API_KEY')
## Step 1. 設定初始 Flask 應用程式 ##
app = Flask(__name__)
api = LineBotApi(LINE_TOKEN)
handler = WebhookHandler(LINE_SECRET) # 負責處理來自 LINE 伺服器 Webhook 事件的物件
genai.configure(api_key=GEMINI_API_KEY)
## Step 2. 設定測試碼 (非必需) ##
# 只是測試 API 運作是否正常, 正常的話你訪問網頁會看到 return 的那段
@app.get("/")
def hello():
return 'Hello, this is Gemini!'
## Step 3. 設定 Webhook 入口 ##
# 當 Flask 收到 POST 請求(LINE 發送的 Webhook 事件),會執行驗證&解析內容
@app.post("/")
def callback():
print(request.headers)
signature = request.headers['X-Line-Signature'] # 取得 LINE 伺服器傳來的簽章
body = request.get_data(as_text=True) # 取得使用者傳來的 JSON 資料
print(body)
app.logger.info("Request body: " + body) # 記錄請求內容
try:
handler.handle(body, signature) # 驗證簽章並交給 handler 處理
except InvalidSignatureError:
print("電子簽章錯誤,請檢查密鑰是否正確!")
abort(400) # 回傳 400 錯誤(Bad Request)
return 'OK'
## Step 4. 註冊事件處理 ##
@handler.add(MessageEvent, message=TextMessage) # 如果 LINE 伺服器傳來 MessageEvent(訊息事件), 且為文字訊息 (TextMessage), 就執行
def handle_message(event):
user_text = event.message.text.strip() # 取得使用者傳來的訊息
# 以下就放你要做的事情
model = genai.GenerativeModel(model_name="gemini-1.5-flash") # 設定 Gemini AI
response = model.generate_content(user_text) # 讓 AI 產生回應
response_text = response.candidates[0].content.parts[0].text # 取得 AI 回應內容
# 傳送回應給使用者
api.reply_message(event.reply_token, TextSendMessage(text=response_text)) # 回應使用者
if __name__ == "__main__":
app.run(host='0.0.0.0', port = 7860)