Nai-Yun commited on
Commit
70d3638
·
verified ·
1 Parent(s): 01efb10

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +84 -0
app.py CHANGED
@@ -4,6 +4,9 @@ from flask import Flask, request, abort
4
  from linebot import LineBotApi, WebhookHandler
5
  from linebot.exceptions import InvalidSignatureError
6
  from linebot.models import MessageEvent, TextMessage, TextSendMessage, QuickReply, QuickReplyButton, MessageAction
 
 
 
7
 
8
  app = Flask(__name__)
9
 
@@ -26,6 +29,58 @@ def callback():
26
  abort(400)
27
  return 'OK'
28
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  # ================= 3. 多輪對話核心邏輯 =================
30
  @handler.add(MessageEvent, message=TextMessage)
31
  def handle_message(event):
@@ -50,6 +105,14 @@ def handle_message(event):
50
  )
51
  return
52
 
 
 
 
 
 
 
 
 
53
  # 取得該用戶當前的對話狀態
54
  state = user_states.get(user_id)
55
 
@@ -263,5 +326,26 @@ def handle_message(event):
263
  else:
264
  line_bot_api.reply_message(event.reply_token, TextSendMessage(text="請選擇下方的質地偏好選項,或是輸入「重新開始」喔!"))
265
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
266
  if __name__ == "__main__":
267
  app.run(host='0.0.0.0', port=7860)
 
4
  from linebot import LineBotApi, WebhookHandler
5
  from linebot.exceptions import InvalidSignatureError
6
  from linebot.models import MessageEvent, TextMessage, TextSendMessage, QuickReply, QuickReplyButton, MessageAction
7
+ import io
8
+ from PIL import Image
9
+ from linebot.models import MessageEvent, TextMessage, TextSendMessage, ImageMessage # 新增 ImageMessage
10
 
11
  app = Flask(__name__)
12
 
 
29
  abort(400)
30
  return 'OK'
31
 
32
+ # ================= 【新增】專門處理使用者傳送照片的邏輯 =================
33
+ @handler.add(MessageEvent, message=ImageMessage)
34
+ def handle_image(event):
35
+ user_id = event.source.user_id
36
+ state = user_states.get(user_id)
37
+
38
+ # 檢查使用者是否處於拍照精靈的等待狀態
39
+ if state and state.get("step") == "ASK_PHOTO_ITEM":
40
+ # 先給個回覆讓使用者知道精靈在看了
41
+ line_bot_api.reply_message(
42
+ event.reply_token,
43
+ TextSendMessage(text="✨ 收到照片!精靈正在用魔法辨識這款產品,請稍候...")
44
+ )
45
+
46
+ try:
47
+ # 1. 從 LINE 伺服器下載使用者傳的照片
48
+ message_content = line_bot_api.get_message_content(event.message.id)
49
+ image_bytes = io.BytesIO(message_content.content)
50
+ pil_image = Image.open(image_bytes)
51
+
52
+ # 2. 設定 Prompt,要求 Gemini 直接分析這張圖片
53
+ vision_prompt = """
54
+ 你現在是一位專業的台灣藥妝購物精靈。請看這張圖片中的產品:
55
+ 1. 辨識它是什麼真實的品牌與品名。
56
+ 2. 估算它在台灣藥妝店(如屈臣氏、康是美)的合理售價。
57
+ 3. 指出哪個商家買得到。
58
+
59
+ 請直接輸出以下格式的純文字(不需要包含其他廢話):
60
+ 品名:[產品完整名稱]
61
+ 售價:$[估計價格]
62
+ 商家:[推薦藥妝店名稱]
63
+ """
64
+
65
+ # 3. 把圖片和 Prompt 一起丟給 Gemini (支援多模態)
66
+ response = model.generate_content([vision_prompt, pil_image])
67
+ ai_reply = response.text
68
+
69
+ # 4. 將結果推播給使用者(目前先用文字,後續可升級成圖卡)
70
+ line_bot_api.push_message(
71
+ user_id,
72
+ TextSendMessage(text=f"🧚‍♀️ 辨識成功!\n\n{ai_reply}")
73
+ )
74
+
75
+ # 任務完成,清除狀態
76
+ del user_states[user_id]
77
+
78
+ except Exception as e:
79
+ line_bot_api.push_message(
80
+ user_id,
81
+ TextSendMessage(text=f"❌ 哎呀!精靈的眼睛剛剛眨了一下,沒看清楚照片。錯誤原因:\n{e}")
82
+ )
83
+
84
  # ================= 3. 多輪對話核心邏輯 =================
85
  @handler.add(MessageEvent, message=TextMessage)
86
  def handle_message(event):
 
105
  )
106
  return
107
 
108
+ if user_msg == "拍照精靈":
109
+ user_states[user_id] = {"step": "ASK_PHOTO_ITEM"}
110
+ line_bot_api.reply_message(
111
+ event.reply_token,
112
+ TextSendMessage(text="📷 歡迎開啟拍照精靈!\n您可以直接拍下商品照片傳給我,或是輸入「文字」來查詢商品售價喔!")
113
+ )
114
+ return
115
+
116
  # 取得該用戶當前的對話狀態
117
  state = user_states.get(user_id)
118
 
 
326
  else:
327
  line_bot_api.reply_message(event.reply_token, TextSendMessage(text="請選擇下方的質地偏好選項,或是輸入「重新開始」喔!"))
328
 
329
+
330
+
331
+ elif current_step == "ASK_PHOTO_ITEM":
332
+ # 如果使用者沒傳照片,而是傳純文字,就走這條路
333
+ text_prompt = f"請幫我查詢「{user_msg}」這款產品在台灣藥妝店的合理售價範圍與推薦購買商家。請簡單溫柔地回答,並條列出品名、價格、商家。"
334
+ try:
335
+ # 先回傳提示
336
+ line_bot_api.reply_message(event.reply_token, TextSendMessage(text="✨ 收到文字!精靈正在幫您查詢這款產品,請稍候..."))
337
+
338
+ # 呼叫 AI
339
+ response = model.generate_content(text_prompt)
340
+
341
+ # 用 push_message 推播結果
342
+ line_bot_api.push_message(user_id, TextSendMessage(text=f"🧚‍♀️ 查詢成功!\n\n{response.text}"))
343
+
344
+ except Exception as e:
345
+ line_bot_api.push_message(user_id, TextSendMessage(text=f"❌ 查詢失敗,錯誤原因:\n{e}"))
346
+
347
+ # 任務完成,清除狀態
348
+ del user_states[user_id]
349
+
350
  if __name__ == "__main__":
351
  app.run(host='0.0.0.0', port=7860)