Evaaaaa06 commited on
Commit
b92f1fc
·
verified ·
1 Parent(s): 3b91af5

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +50 -76
main.py CHANGED
@@ -91,13 +91,21 @@ def upload_image_to_imgur_with_token(image_path, access_token):
91
  print("圖片上傳例外:", e)
92
  return None
93
 
94
- def generate_image_with_gemini(prompt):
95
  model_name = "gemini-2.0-flash-exp-image-generation"
96
  image_model = genai.GenerativeModel(model_name)
 
97
  response = image_model.generate_content(prompt)
98
  if response.parts and hasattr(response.parts[0], "inline_data"):
99
  image_data = response.parts[0].inline_data.data
100
  with tempfile.NamedTemporaryFile(delete=False, suffix=".png", dir="/tmp") as tmp_file:
 
 
 
 
 
 
 
101
  tmp_file.write(image_data)
102
  return tmp_file.name
103
  return None
@@ -159,104 +167,70 @@ def get_previous_message(user_id):
159
  # 主程式(圖片與文字)
160
  #==========================
161
  # 建立 chat_sessions 字典
162
- chat_sessions = {}
163
- @line_handler.add(MessageEvent, message=(ImageMessage,TextMessage))
164
  def handle_image_message(event):
165
  user_id = event.source.user_id
166
- if user_id in chat_sessions:
167
- chat = chat_sessions[user_id]
168
- else:
169
- chat = model.start_chat(history=[])
170
- chat_sessions[user_id] = chat
171
 
172
-
173
- # 從 LINE API 獲取圖片數據
174
- image_path = get_image_url(event.message.id)
175
- if image_path:
176
- try:
177
- # 處理圖片或進行進一步分析
178
- print(f"圖片已保存至: {image_path}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
179
  store_user_message(user_id, "image", image_path)
180
- # 回應用戶
181
- line_bot_api.reply_message(event.reply_token,TextSendMessage(text="圖片已接收成功囉,幫我輸入你想詢問的問題喔~"))
182
- except:
183
- line_bot_api.reply_message(event.reply_token,TextSendMessage(text="沒有接收到圖片~"))
184
-
185
  previous_message = get_previous_message(user_id)
186
- # 獲取傳送圖片後的用戶問題(文字)
187
  if previous_message and previous_message["type"] == "image" and event.message.type == "text":
188
- # 獲取上一則圖片訊息的路徑
189
  image_path = previous_message["content"]
190
-
191
- # 儲存當前文字訊息
192
  user_text = event.message.text
193
  store_user_message(user_id, "text", user_text)
194
-
195
  try:
196
- # 確保圖片存在
197
  if not os.path.exists(image_path):
198
  raise FileNotFoundError(f"圖片路徑無效:{image_path}")
199
-
200
  organ = PIL.Image.open(image_path)
201
  completion = chat.send_message([user_text, organ])
202
  out = completion.text
203
-
204
  except Exception as e:
205
  out = f"發生錯誤: {e}"
206
-
207
  else:
208
- global working_status
209
- # 檢查事件類型和訊息類型
210
- if event.type != "message" or event.message.type != "text":
211
- # 回覆錯誤訊息
212
- line_bot_api.reply_message(
213
- event.reply_token,
214
- TextSendMessage(text="Event type error:[No message or the message does not contain text]")
215
- )
216
-
217
- # 檢查使用者是否輸入 "再見"
218
- elif event.message.text == "再見":
219
- # 回覆 "Bye!"
220
- line_bot_api.reply_message(event.reply_token,TextSendMessage(text="Bye!"))
221
  return
222
-
223
- # 檢查是否正在與使用者交談
224
- elif working_status:
225
- try:
226
-
227
- if user_text and user_text.startswith("請幫我生成圖片"):
228
- prompt = user_text.replace("請幫我生成圖片", "").strip()
229
-
230
- image_path_gen = generate_image_with_gemini(prompt)
231
- if image_path:
232
- # 使用 Access Token 上傳至 Imgur
233
- IMGUR_ACCESS_TOKEN = os.environ.get("IMGUR_ACCESS_TOKEN")
234
- image_url = upload_image_to_imgur_with_token(image_path, IMGUR_ACCESS_TOKEN)
235
-
236
- if image_url:
237
- line_bot_api.reply_message(event.reply_token,ImageSendMessage(original_content_url=image_url, preview_image_url=image_url))
238
- else:
239
- line_bot_api.reply_message(event.reply_token, TextSendMessage(text="圖片上傳失敗,請稍後再試~"))
240
- # 取得使用者輸入的文字
241
  prompt = event.message.text
242
- store_user_message(user_id, "text", prompt)
243
-
244
- # 使用 Gemini 模型生成文字
245
  completion = chat.send_message(prompt)
246
- # 檢查生成結果是否為空
247
- if (completion.text != None):
248
- # 取得生成結果
249
- out = completion.text
250
- else:
251
- # 回覆 "Gemini沒答案!請換個說法!"
252
- out = "我不太懂什麼意思也~"
253
  except:
254
- # 處理錯誤
255
- out = "執行出錯!請換個說法!"
256
 
257
-
258
- # 回覆生成結果
259
- line_bot_api.reply_message(event.reply_token,TextSendMessage(text=out))
260
 
261
 
262
  if __name__ == "__main__":
 
91
  print("圖片上傳例外:", e)
92
  return None
93
 
94
+ def generate_image_with_gemini(prompt, size=(512, 512)):
95
  model_name = "gemini-2.0-flash-exp-image-generation"
96
  image_model = genai.GenerativeModel(model_name)
97
+ prompt += f",尺寸:{size[0]}x{size[1]}"
98
  response = image_model.generate_content(prompt)
99
  if response.parts and hasattr(response.parts[0], "inline_data"):
100
  image_data = response.parts[0].inline_data.data
101
  with tempfile.NamedTemporaryFile(delete=False, suffix=".png", dir="/tmp") as tmp_file:
102
+ # 清理先前生成的暫存圖檔(選擇性,可加強)
103
+ for f in os.listdir("/tmp"):
104
+ if f.endswith(".png") and os.path.getmtime(f"/tmp/{f}") < os.path.getmtime(tmp_file.name):
105
+ try:
106
+ os.remove(f"/tmp/{f}")
107
+ except:
108
+ pass
109
  tmp_file.write(image_data)
110
  return tmp_file.name
111
  return None
 
167
  # 主程式(圖片與文字)
168
  #==========================
169
  # 建立 chat_sessions 字典
170
+ @line_handler.add(MessageEvent, message=(ImageMessage, TextMessage))
 
171
  def handle_image_message(event):
172
  user_id = event.source.user_id
173
+ chat = chat_sessions.get(user_id) or model.start_chat(history=[])
174
+ chat_sessions[user_id] = chat
 
 
 
175
 
176
+ user_text = event.message.text if event.message.type == "text" else None
177
+
178
+ if user_text and user_text.startswith("請幫我生成圖片"):
179
+ prompt = user_text.replace("請幫我生成圖片", "").strip()
180
+
181
+ image_path = generate_image_with_gemini(prompt, size=(512, 512))
182
+ if image_path:
183
+ image_url = f"https://your-domain.com/tmp/{os.path.basename(image_path)}"
184
+ line_bot_api.reply_message(
185
+ event.reply_token,
186
+ [
187
+ TextSendMessage(text="這是我為你生成的圖片喔~ ✨"),
188
+ ImageSendMessage(original_content_url=image_url, preview_image_url=image_url)
189
+ ]
190
+ )
191
+ else:
192
+ line_bot_api.reply_message(event.reply_token, TextSendMessage(text="圖片生成失敗,請稍後再試~"))
193
+ return
194
+
195
+ if event.message.type == "image":
196
+ image_path = get_image_url(event.message.id)
197
+ if image_path:
198
  store_user_message(user_id, "image", image_path)
199
+ line_bot_api.reply_message(event.reply_token, TextSendMessage(text="圖片已接收成功囉,幫我輸入你想詢問的問題喔~"))
200
+ else:
201
+ line_bot_api.reply_message(event.reply_token, TextSendMessage(text="沒有接收到圖片~"))
202
+ return
203
+
204
  previous_message = get_previous_message(user_id)
 
205
  if previous_message and previous_message["type"] == "image" and event.message.type == "text":
 
206
  image_path = previous_message["content"]
 
 
207
  user_text = event.message.text
208
  store_user_message(user_id, "text", user_text)
 
209
  try:
 
210
  if not os.path.exists(image_path):
211
  raise FileNotFoundError(f"圖片路徑無效:{image_path}")
 
212
  organ = PIL.Image.open(image_path)
213
  completion = chat.send_message([user_text, organ])
214
  out = completion.text
 
215
  except Exception as e:
216
  out = f"發生錯誤: {e}"
 
217
  else:
218
+ if event.message.type != "text":
219
+ line_bot_api.reply_message(event.reply_token, TextSendMessage(text="請輸入文字或圖片~"))
 
 
 
 
 
 
 
 
 
 
 
220
  return
221
+ if event.message.text == "再見":
222
+ line_bot_api.reply_message(event.reply_token, TextSendMessage(text="Bye!"))
223
+ return
224
+ if working_status:
225
+ try:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
226
  prompt = event.message.text
227
+ store_user_message(user_id, "text", prompt)
 
 
228
  completion = chat.send_message(prompt)
229
+ out = completion.text if completion.text else "我不太懂什麼意思也~"
 
 
 
 
 
 
230
  except:
231
+ out = "執行出錯!請換個說法!"
 
232
 
233
+ line_bot_api.reply_message(event.reply_token, TextSendMessage(text=out))
 
 
234
 
235
 
236
  if __name__ == "__main__":