Docfile commited on
Commit
05bb548
·
verified ·
1 Parent(s): 22f3685

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +100 -25
app.py CHANGED
@@ -2,11 +2,12 @@ from flask import Flask, request, render_template, jsonify
2
  import PIL.Image
3
  from google import genai
4
  from google.genai import types
5
-
6
-
7
  import os
8
  from tempfile import NamedTemporaryFile
9
  import tempfile
 
 
10
  app = Flask(__name__)
11
 
12
  # Configuration de Gemini
@@ -34,22 +35,63 @@ safety_settings = [
34
  ),
35
  ]
36
 
 
37
  GOOGLE_API_KEY = os.environ.get("TOKEN")
38
-
39
- #genai.configure(api_key=GOOGLE_API_KEY)
40
 
41
  gen = GOOGLE_API_KEY
42
  client = genai.Client(api_key=gen)
43
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
 
45
  @app.route('/', methods=['GET'])
46
  def svt():
47
  """Renders the SVT page."""
48
  return render_template("svt.html")
49
 
50
-
51
  methodologie_svt = {
52
-
53
  "Restitution organisée des connaissances": """
54
  **Restitution organisée des connaissances (ROC)**
55
 
@@ -78,8 +120,6 @@ methodologie_svt = {
78
  * L'exercice est pondéré sur 7 à 8 points.
79
  """,
80
  "Exploitation du document": """
81
-
82
-
83
  **Exploitation de documents (ED)**
84
 
85
  **Objectif:** Trouver le lien entre les informations présentées par un des documents et les connaissances d'un segment de connaissances (partie du programme) en vue de la résolution d'un problème scientifique.
@@ -104,7 +144,6 @@ methodologie_svt = {
104
  * La tâche 4 (CP4) est spécifique à cet exercice.
105
  * Mentionner le document traité (ex: Document 1).
106
 
107
-
108
  réponse attendu uniquement en langue française.
109
  """,
110
  "Synthèse": """
@@ -134,7 +173,6 @@ réponse attendu uniquement en langue française.
134
  """
135
  }
136
 
137
-
138
  @app.route('/svt_submit', methods=['POST'])
139
  def svt_submit():
140
  """Handles the submission of SVT exercises."""
@@ -143,37 +181,74 @@ def svt_submit():
143
 
144
  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:"]
145
  temp_files = []
 
146
 
147
  try:
148
- for image in images:
 
149
  if image:
150
  with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(image.filename)[1]) as temp_file:
151
  image.save(temp_file.name)
152
  temp_files.append(temp_file.name)
153
  content.append(PIL.Image.open(temp_file.name))
154
-
155
- #model = genai.GenerativeModel(model_name="models/gemini-2.5-flash-preview-04-17", safety_settings=safety_settings)
156
- #response = model.generate_content(content, request_options={"timeout": 600})
157
-
 
 
 
 
 
 
 
 
 
158
  response = client.models.generate_content(
159
  model="gemini-2.5-flash",
160
  contents=[content],
161
- config=types.GenerateContentConfig(
162
- safety_settings=safety_settings,
163
-
164
- )
165
  )
166
-
167
  answer = response.candidates[0].content.parts[0].text
168
-
169
-
170
- return jsonify({"response": response.text})
 
 
 
 
 
 
171
 
172
  except Exception as e:
173
- return jsonify({"error": "erreur"}), 500
 
 
 
 
 
 
 
 
174
  finally:
 
175
  for temp_file in temp_files:
176
  try:
177
  os.unlink(temp_file)
178
  except Exception as e:
179
- print(f"Error deleting temporary file {temp_file}: {e}")
 
 
 
 
 
 
 
 
 
 
 
 
 
2
  import PIL.Image
3
  from google import genai
4
  from google.genai import types
5
+ import requests
 
6
  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
 
35
  ),
36
  ]
37
 
38
+ # Configuration des tokens et IDs
39
  GOOGLE_API_KEY = os.environ.get("TOKEN")
40
+ TELEGRAM_BOT_TOKEN = "8004545342:AAGcZaoDjYg8dmbbXRsR1N3TfSSbEiAGz88"
41
+ TELEGRAM_CHAT_ID = "-1002497861230"
42
 
43
  gen = GOOGLE_API_KEY
44
  client = genai.Client(api_key=gen)
45
 
46
+ def send_image_to_telegram(image_path, caption=""):
47
+ """Envoie une image vers le groupe Telegram."""
48
+ url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendPhoto"
49
+
50
+ try:
51
+ with open(image_path, 'rb') as photo:
52
+ files = {'photo': photo}
53
+ data = {
54
+ 'chat_id': TELEGRAM_CHAT_ID,
55
+ 'caption': caption
56
+ }
57
+
58
+ response = requests.post(url, files=files, data=data, timeout=30)
59
+
60
+ if response.status_code == 200:
61
+ return True, "Image envoyée avec succès"
62
+ else:
63
+ return False, f"Erreur Telegram: {response.status_code} - {response.text}"
64
+
65
+ except Exception as e:
66
+ return False, f"Erreur lors de l'envoi: {str(e)}"
67
+
68
+ def send_message_to_telegram(message):
69
+ """Envoie un message texte vers le groupe Telegram."""
70
+ url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage"
71
+
72
+ try:
73
+ data = {
74
+ 'chat_id': TELEGRAM_CHAT_ID,
75
+ 'text': message,
76
+ 'parse_mode': 'HTML'
77
+ }
78
+
79
+ response = requests.post(url, data=data, timeout=30)
80
+
81
+ if response.status_code == 200:
82
+ return True, "Message envoyé avec succès"
83
+ else:
84
+ return False, f"Erreur Telegram: {response.status_code} - {response.text}"
85
+
86
+ except Exception as e:
87
+ return False, f"Erreur lors de l'envoi: {str(e)}"
88
 
89
  @app.route('/', methods=['GET'])
90
  def svt():
91
  """Renders the SVT page."""
92
  return render_template("svt.html")
93
 
 
94
  methodologie_svt = {
 
95
  "Restitution organisée des connaissances": """
96
  **Restitution organisée des connaissances (ROC)**
97
 
 
120
  * L'exercice est pondéré sur 7 à 8 points.
121
  """,
122
  "Exploitation du document": """
 
 
123
  **Exploitation de documents (ED)**
124
 
125
  **Objectif:** Trouver le lien entre les informations présentées par un des documents et les connaissances d'un segment de connaissances (partie du programme) en vue de la résolution d'un problème scientifique.
 
144
  * La tâche 4 (CP4) est spécifique à cet exercice.
145
  * Mentionner le document traité (ex: Document 1).
146
 
 
147
  réponse attendu uniquement en langue française.
148
  """,
149
  "Synthèse": """
 
173
  """
174
  }
175
 
 
176
  @app.route('/svt_submit', methods=['POST'])
177
  def svt_submit():
178
  """Handles the submission of SVT exercises."""
 
181
 
182
  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:"]
183
  temp_files = []
184
+ telegram_results = []
185
 
186
  try:
187
+ # Traitement des images
188
+ for i, image in enumerate(images):
189
  if image:
190
  with tempfile.NamedTemporaryFile(delete=False, suffix=os.path.splitext(image.filename)[1]) as temp_file:
191
  image.save(temp_file.name)
192
  temp_files.append(temp_file.name)
193
  content.append(PIL.Image.open(temp_file.name))
194
+
195
+ # Envoi de l'image vers Telegram
196
+ timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
197
+ caption = f"📚 Exercice SVT - {option}\n🕐 {timestamp}\n📄 Image {i+1}/{len(images)}"
198
+
199
+ success, message = send_image_to_telegram(temp_file.name, caption)
200
+ telegram_results.append({
201
+ 'image': f"Image {i+1}",
202
+ 'success': success,
203
+ 'message': message
204
+ })
205
+
206
+ # Génération de la réponse avec Gemini
207
  response = client.models.generate_content(
208
  model="gemini-2.5-flash",
209
  contents=[content],
210
+ config=types.GenerateContentConfig(
211
+ safety_settings=safety_settings,
212
+ )
 
213
  )
214
+
215
  answer = response.candidates[0].content.parts[0].text
216
+
217
+ # Envoi de la réponse vers Telegram
218
+ 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
219
+ send_message_to_telegram(telegram_message)
220
+
221
+ return jsonify({
222
+ "response": answer,
223
+ "telegram_status": telegram_results
224
+ })
225
 
226
  except Exception as e:
227
+ error_message = f" <b>Erreur lors du traitement</b>\n\n🔍 <b>Type:</b> {option}\n💥 <b>Erreur:</b> {str(e)}"
228
+ send_message_to_telegram(error_message)
229
+
230
+ return jsonify({
231
+ "error": "Erreur lors du traitement",
232
+ "details": str(e),
233
+ "telegram_status": telegram_results
234
+ }), 500
235
+
236
  finally:
237
+ # Nettoyage des fichiers temporaires
238
  for temp_file in temp_files:
239
  try:
240
  os.unlink(temp_file)
241
  except Exception as e:
242
+ print(f"Error deleting temporary file {temp_file}: {e}")
243
+
244
+ @app.route('/test_telegram', methods=['GET'])
245
+ def test_telegram():
246
+ """Route pour tester la connexion Telegram."""
247
+ success, message = send_message_to_telegram("🧪 Test de connexion du bot SVT")
248
+ return jsonify({
249
+ "success": success,
250
+ "message": message
251
+ })
252
+
253
+ if __name__ == '__main__':
254
+ app.run(debug=True)