Docfile commited on
Commit
35011e5
·
verified ·
1 Parent(s): 534151b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +144 -44
app.py CHANGED
@@ -7,9 +7,14 @@ import os
7
  from tempfile import NamedTemporaryFile
8
  import tempfile
9
  from datetime import datetime
 
10
 
11
  app = Flask(__name__)
12
 
 
 
 
 
13
  # Configuration de Gemini
14
  generation_config = {
15
  "temperature": 1,
@@ -50,43 +55,59 @@ def send_image_to_telegram(image_path, caption=""):
50
  try:
51
  # Vérifier que le fichier existe et est lisible
52
  if not os.path.exists(image_path):
 
53
  return False, f"Le fichier {image_path} n'existe pas"
54
 
55
- # Vérifier la taille du fichier (limite Telegram: 50MB pour les photos)
56
  file_size = os.path.getsize(image_path)
57
- if file_size > 50 * 1024 * 1024: # 50MB
58
- return False, f"Fichier trop volumineux: {file_size} bytes (limite: 50MB)"
 
 
 
 
 
 
59
 
60
- print(f"Envoi de l'image: {image_path} (taille: {file_size} bytes)")
61
- print(f"Chat ID: {TELEGRAM_CHAT_ID}")
62
- print(f"Caption: {caption}")
63
 
 
64
  with open(image_path, 'rb') as photo:
65
- files = {'photo': photo}
66
  data = {
67
  'chat_id': TELEGRAM_CHAT_ID,
68
- 'caption': caption[:1024] # Telegram limite les captions à 1024 caractères
69
  }
70
 
71
- response = requests.post(url, files=files, data=data, timeout=60) # Timeout plus long
 
72
 
73
- print(f"Réponse HTTP: {response.status_code}")
74
- print(f"Contenu de la réponse: {response.text}")
75
 
76
  if response.status_code == 200:
77
  response_json = response.json()
78
  if response_json.get('ok'):
 
79
  return True, "Image envoyée avec succès"
80
  else:
81
- return False, f"Erreur API Telegram: {response_json.get('description', 'Erreur inconnue')}"
 
 
82
  else:
 
83
  return False, f"Erreur HTTP {response.status_code}: {response.text}"
84
 
85
  except requests.exceptions.Timeout:
 
86
  return False, "Timeout lors de l'envoi vers Telegram"
87
  except requests.exceptions.RequestException as e:
 
88
  return False, f"Erreur de requête: {str(e)}"
89
  except Exception as e:
 
90
  return False, f"Erreur inattendue: {str(e)}"
91
 
92
  def test_bot_permissions():
@@ -97,29 +118,22 @@ def test_bot_permissions():
97
  data = {'chat_id': TELEGRAM_CHAT_ID}
98
  response = requests.post(url, data=data, timeout=30)
99
 
 
 
 
100
  if response.status_code == 200:
101
  chat_info = response.json()
102
  if chat_info.get('ok'):
103
- return True, f"Bot autorisé dans le chat: {chat_info['result']['title']}"
104
  else:
105
  return False, f"Erreur API: {chat_info.get('description')}"
106
  else:
107
- return False, f"Erreur HTTP: {response.status_code}"
108
 
109
  except Exception as e:
 
110
  return False, f"Erreur: {str(e)}"
111
 
112
- # Nouvelle route pour tester les permissions
113
- @app.route('/test_bot_permissions', methods=['GET'])
114
- def test_bot_permissions_route():
115
- """Route pour tester les permissions du bot."""
116
- success, message = test_bot_permissions()
117
- return jsonify({
118
- "success": success,
119
- "message": message
120
- })
121
-
122
-
123
  def send_message_to_telegram(message):
124
  """Envoie un message texte vers le groupe Telegram."""
125
  url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage"
@@ -134,13 +148,28 @@ def send_message_to_telegram(message):
134
  response = requests.post(url, data=data, timeout=30)
135
 
136
  if response.status_code == 200:
137
- return True, "Message envoyé avec succès"
 
 
 
 
138
  else:
139
  return False, f"Erreur Telegram: {response.status_code} - {response.text}"
140
 
141
  except Exception as e:
 
142
  return False, f"Erreur lors de l'envoi: {str(e)}"
143
 
 
 
 
 
 
 
 
 
 
 
144
  @app.route('/', methods=['GET'])
145
  def svt():
146
  """Renders the SVT page."""
@@ -234,31 +263,73 @@ def svt_submit():
234
  option = request.form.get('option')
235
  images = request.files.getlist('images')
236
 
 
 
 
237
  content = [f"J'aimerais que tu traites entièrement cet exercice en respectant scrupuleusement la méthodologie d'SVT suivante :\n\n{methodologie_svt[option]}\n\nLe type d'exercice selon la méthodologie est : {option}. Voici les images de l'exercice:"]
238
  temp_files = []
239
  telegram_results = []
240
 
241
  try:
 
 
 
 
242
  # Traitement des images
243
  for i, image in enumerate(images):
244
- if image:
245
- with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(image.filename)[1]) as temp_file:
 
 
 
 
 
 
 
 
246
  image.save(temp_file.name)
247
  temp_files.append(temp_file.name)
248
- content.append(PIL.Image.open(temp_file.name))
249
-
250
- # Envoi de l'image vers Telegram
251
- timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
252
- caption = f"📚 Exercice SVT - {option}\n🕐 {timestamp}\n📄 Image {i+1}/{len(images)}"
253
 
254
- success, message = send_image_to_telegram(temp_file.name, caption)
255
- telegram_results.append({
256
- 'image': f"Image {i+1}",
257
- 'success': success,
258
- 'message': message
259
- })
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
260
 
261
  # Génération de la réponse avec Gemini
 
262
  response = client.models.generate_content(
263
  model="gemini-2.5-flash",
264
  contents=[content],
@@ -268,17 +339,21 @@ def svt_submit():
268
  )
269
 
270
  answer = response.candidates[0].content.parts[0].text
 
271
 
272
  # Envoi de la réponse vers Telegram
273
- telegram_message = f"🤖 <b>Réponse générée</b>\n\n📝 <b>Type:</b> {option}\n\n{answer[:4000]}..." # Limité à 4000 caractères
274
- send_message_to_telegram(telegram_message)
 
275
 
276
  return jsonify({
277
  "response": answer,
278
- "telegram_status": telegram_results
 
279
  })
280
 
281
  except Exception as e:
 
282
  error_message = f"❌ <b>Erreur lors du traitement</b>\n\n🔍 <b>Type:</b> {option}\n💥 <b>Erreur:</b> {str(e)}"
283
  send_message_to_telegram(error_message)
284
 
@@ -292,9 +367,11 @@ def svt_submit():
292
  # Nettoyage des fichiers temporaires
293
  for temp_file in temp_files:
294
  try:
295
- os.unlink(temp_file)
 
 
296
  except Exception as e:
297
- print(f"Error deleting temporary file {temp_file}: {e}")
298
 
299
  @app.route('/test_telegram', methods=['GET'])
300
  def test_telegram():
@@ -305,5 +382,28 @@ def test_telegram():
305
  "message": message
306
  })
307
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
308
  if __name__ == '__main__':
309
  app.run(debug=True)
 
7
  from tempfile import NamedTemporaryFile
8
  import tempfile
9
  from datetime import datetime
10
+ import logging
11
 
12
  app = Flask(__name__)
13
 
14
+ # Configuration du logging pour débugger
15
+ logging.basicConfig(level=logging.DEBUG)
16
+ logger = logging.getLogger(__name__)
17
+
18
  # Configuration de Gemini
19
  generation_config = {
20
  "temperature": 1,
 
55
  try:
56
  # Vérifier que le fichier existe et est lisible
57
  if not os.path.exists(image_path):
58
+ logger.error(f"Le fichier {image_path} n'existe pas")
59
  return False, f"Le fichier {image_path} n'existe pas"
60
 
61
+ # Vérifier la taille du fichier (limite Telegram: 10MB pour les photos via API)
62
  file_size = os.path.getsize(image_path)
63
+ if file_size > 10 * 1024 * 1024: # 10MB pour l'API Bot
64
+ logger.error(f"Fichier trop volumineux: {file_size} bytes")
65
+ return False, f"Fichier trop volumineux: {file_size} bytes (limite: 10MB)"
66
+
67
+ # Vérifier que le fichier n'est pas vide
68
+ if file_size == 0:
69
+ logger.error(f"Fichier vide: {image_path}")
70
+ return False, f"Fichier vide: {image_path}"
71
 
72
+ logger.info(f"Envoi de l'image: {image_path} (taille: {file_size} bytes)")
73
+ logger.info(f"Chat ID: {TELEGRAM_CHAT_ID}")
74
+ logger.info(f"Caption: {caption}")
75
 
76
+ # Ouvrir et envoyer le fichier
77
  with open(image_path, 'rb') as photo:
78
+ files = {'photo': ('image.jpg', photo, 'image/jpeg')}
79
  data = {
80
  'chat_id': TELEGRAM_CHAT_ID,
81
+ 'caption': caption[:1024] if caption else "" # Telegram limite les captions à 1024 caractères
82
  }
83
 
84
+ logger.debug(f"Données envoyées: {data}")
85
+ response = requests.post(url, files=files, data=data, timeout=120)
86
 
87
+ logger.info(f"Réponse HTTP: {response.status_code}")
88
+ logger.debug(f"Contenu de la réponse: {response.text}")
89
 
90
  if response.status_code == 200:
91
  response_json = response.json()
92
  if response_json.get('ok'):
93
+ logger.info("Image envoyée avec succès")
94
  return True, "Image envoyée avec succès"
95
  else:
96
+ error_msg = response_json.get('description', 'Erreur inconnue')
97
+ logger.error(f"Erreur API Telegram: {error_msg}")
98
+ return False, f"Erreur API Telegram: {error_msg}"
99
  else:
100
+ logger.error(f"Erreur HTTP {response.status_code}: {response.text}")
101
  return False, f"Erreur HTTP {response.status_code}: {response.text}"
102
 
103
  except requests.exceptions.Timeout:
104
+ logger.error("Timeout lors de l'envoi vers Telegram")
105
  return False, "Timeout lors de l'envoi vers Telegram"
106
  except requests.exceptions.RequestException as e:
107
+ logger.error(f"Erreur de requête: {str(e)}")
108
  return False, f"Erreur de requête: {str(e)}"
109
  except Exception as e:
110
+ logger.error(f"Erreur inattendue: {str(e)}")
111
  return False, f"Erreur inattendue: {str(e)}"
112
 
113
  def test_bot_permissions():
 
118
  data = {'chat_id': TELEGRAM_CHAT_ID}
119
  response = requests.post(url, data=data, timeout=30)
120
 
121
+ logger.info(f"Test permissions - Status: {response.status_code}")
122
+ logger.debug(f"Test permissions - Response: {response.text}")
123
+
124
  if response.status_code == 200:
125
  chat_info = response.json()
126
  if chat_info.get('ok'):
127
+ return True, f"Bot autorisé dans le chat: {chat_info['result'].get('title', 'Chat sans titre')}"
128
  else:
129
  return False, f"Erreur API: {chat_info.get('description')}"
130
  else:
131
+ return False, f"Erreur HTTP: {response.status_code} - {response.text}"
132
 
133
  except Exception as e:
134
+ logger.error(f"Erreur test permissions: {str(e)}")
135
  return False, f"Erreur: {str(e)}"
136
 
 
 
 
 
 
 
 
 
 
 
 
137
  def send_message_to_telegram(message):
138
  """Envoie un message texte vers le groupe Telegram."""
139
  url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage"
 
148
  response = requests.post(url, data=data, timeout=30)
149
 
150
  if response.status_code == 200:
151
+ response_json = response.json()
152
+ if response_json.get('ok'):
153
+ return True, "Message envoyé avec succès"
154
+ else:
155
+ return False, f"Erreur API: {response_json.get('description')}"
156
  else:
157
  return False, f"Erreur Telegram: {response.status_code} - {response.text}"
158
 
159
  except Exception as e:
160
+ logger.error(f"Erreur envoi message: {str(e)}")
161
  return False, f"Erreur lors de l'envoi: {str(e)}"
162
 
163
+ # Nouvelle route pour tester les permissions
164
+ @app.route('/test_bot_permissions', methods=['GET'])
165
+ def test_bot_permissions_route():
166
+ """Route pour tester les permissions du bot."""
167
+ success, message = test_bot_permissions()
168
+ return jsonify({
169
+ "success": success,
170
+ "message": message
171
+ })
172
+
173
  @app.route('/', methods=['GET'])
174
  def svt():
175
  """Renders the SVT page."""
 
263
  option = request.form.get('option')
264
  images = request.files.getlist('images')
265
 
266
+ logger.info(f"Traitement d'un exercice SVT: {option}")
267
+ logger.info(f"Nombre d'images reçues: {len(images)}")
268
+
269
  content = [f"J'aimerais que tu traites entièrement cet exercice en respectant scrupuleusement la méthodologie d'SVT suivante :\n\n{methodologie_svt[option]}\n\nLe type d'exercice selon la méthodologie est : {option}. Voici les images de l'exercice:"]
270
  temp_files = []
271
  telegram_results = []
272
 
273
  try:
274
+ # Test des permissions avant envoi
275
+ perm_success, perm_message = test_bot_permissions()
276
+ logger.info(f"Test permissions: {perm_success} - {perm_message}")
277
+
278
  # Traitement des images
279
  for i, image in enumerate(images):
280
+ if image and image.filename:
281
+ logger.info(f"Traitement de l'image {i+1}: {image.filename}")
282
+
283
+ # Créer un fichier temporaire avec l'extension correcte
284
+ file_extension = os.path.splitext(image.filename)[1].lower()
285
+ if not file_extension:
286
+ file_extension = '.jpg' # Extension par défaut
287
+
288
+ with tempfile.NamedTemporaryFile(delete=False, suffix=file_extension) as temp_file:
289
+ # Sauvegarder l'image
290
  image.save(temp_file.name)
291
  temp_files.append(temp_file.name)
 
 
 
 
 
292
 
293
+ # Vérifier que l'image a été sauvegardée correctement
294
+ if os.path.getsize(temp_file.name) > 0:
295
+ logger.info(f"Image sauvegardée: {temp_file.name} ({os.path.getsize(temp_file.name)} bytes)")
296
+
297
+ # Ajouter l'image au contenu pour Gemini
298
+ try:
299
+ pil_image = PIL.Image.open(temp_file.name)
300
+ content.append(pil_image)
301
+ logger.info(f"Image ajoutée au contenu Gemini: {pil_image.size}")
302
+ except Exception as e:
303
+ logger.error(f"Erreur lors de l'ouverture de l'image pour Gemini: {e}")
304
+
305
+ # Envoi de l'image vers Telegram
306
+ timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
307
+ caption = f"📚 Exercice SVT - {option}\n🕐 {timestamp}\n📄 Image {i+1}/{len([img for img in images if img.filename])}"
308
+
309
+ logger.info(f"Tentative d'envoi vers Telegram: {temp_file.name}")
310
+ success, message = send_image_to_telegram(temp_file.name, caption)
311
+ telegram_results.append({
312
+ 'image': f"Image {i+1} - {image.filename}",
313
+ 'success': success,
314
+ 'message': message
315
+ })
316
+
317
+ if success:
318
+ logger.info(f"✅ Image {i+1} envoyée avec succès")
319
+ else:
320
+ logger.error(f"❌ Échec envoi image {i+1}: {message}")
321
+ else:
322
+ logger.error(f"Fichier temporaire vide pour l'image {i+1}")
323
+ telegram_results.append({
324
+ 'image': f"Image {i+1} - {image.filename}",
325
+ 'success': False,
326
+ 'message': "Fichier temporaire vide"
327
+ })
328
+
329
+ logger.info(f"Résultats Telegram: {telegram_results}")
330
 
331
  # Génération de la réponse avec Gemini
332
+ logger.info("Génération de la réponse avec Gemini...")
333
  response = client.models.generate_content(
334
  model="gemini-2.5-flash",
335
  contents=[content],
 
339
  )
340
 
341
  answer = response.candidates[0].content.parts[0].text
342
+ logger.info("Réponse générée avec succès")
343
 
344
  # Envoi de la réponse vers Telegram
345
+ telegram_message = f"🤖 <b>Réponse générée</b>\n\n📝 <b>Type:</b> {option}\n\n{answer[:3500]}..."
346
+ msg_success, msg_message = send_message_to_telegram(telegram_message)
347
+ logger.info(f"Envoi réponse Telegram: {msg_success} - {msg_message}")
348
 
349
  return jsonify({
350
  "response": answer,
351
+ "telegram_status": telegram_results,
352
+ "bot_permissions": {"success": perm_success, "message": perm_message}
353
  })
354
 
355
  except Exception as e:
356
+ logger.error(f"Erreur lors du traitement: {str(e)}")
357
  error_message = f"❌ <b>Erreur lors du traitement</b>\n\n🔍 <b>Type:</b> {option}\n💥 <b>Erreur:</b> {str(e)}"
358
  send_message_to_telegram(error_message)
359
 
 
367
  # Nettoyage des fichiers temporaires
368
  for temp_file in temp_files:
369
  try:
370
+ if os.path.exists(temp_file):
371
+ os.unlink(temp_file)
372
+ logger.info(f"Fichier temporaire supprimé: {temp_file}")
373
  except Exception as e:
374
+ logger.error(f"Erreur lors de la suppression du fichier {temp_file}: {e}")
375
 
376
  @app.route('/test_telegram', methods=['GET'])
377
  def test_telegram():
 
382
  "message": message
383
  })
384
 
385
+ @app.route('/debug_telegram', methods=['GET'])
386
+ def debug_telegram():
387
+ """Route pour débugger les problèmes Telegram."""
388
+ results = {}
389
+
390
+ # Test 1: Permissions du bot
391
+ perm_success, perm_message = test_bot_permissions()
392
+ results['permissions'] = {"success": perm_success, "message": perm_message}
393
+
394
+ # Test 2: Envoi d'un message simple
395
+ msg_success, msg_message = send_message_to_telegram("🔧 Test de débogage")
396
+ results['message_test'] = {"success": msg_success, "message": msg_message}
397
+
398
+ # Test 3: Vérification des variables d'environnement
399
+ results['config'] = {
400
+ "bot_token_set": bool(TELEGRAM_BOT_TOKEN),
401
+ "chat_id_set": bool(TELEGRAM_CHAT_ID),
402
+ "bot_token_format": TELEGRAM_BOT_TOKEN.startswith("8180304240:") if TELEGRAM_BOT_TOKEN else False,
403
+ "chat_id_format": TELEGRAM_CHAT_ID.startswith("-") if TELEGRAM_CHAT_ID else False
404
+ }
405
+
406
+ return jsonify(results)
407
+
408
  if __name__ == '__main__':
409
  app.run(debug=True)