Docfile commited on
Commit
501a7f8
·
verified ·
1 Parent(s): 35011e5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +134 -60
app.py CHANGED
@@ -8,6 +8,8 @@ from tempfile import NamedTemporaryFile
8
  import tempfile
9
  from datetime import datetime
10
  import logging
 
 
11
 
12
  app = Flask(__name__)
13
 
@@ -48,67 +50,155 @@ TELEGRAM_CHAT_ID = "-4972732072"
48
  gen = GOOGLE_API_KEY
49
  client = genai.Client(api_key=gen)
50
 
51
- def send_image_to_telegram(image_path, caption=""):
52
- """Envoie une image vers le groupe Telegram avec meilleure gestion d'erreurs."""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendPhoto"
 
 
 
54
 
 
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():
114
  """Teste les permissions du bot dans le groupe."""
@@ -134,33 +224,14 @@ def test_bot_permissions():
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"
140
-
141
- try:
142
- data = {
143
- 'chat_id': TELEGRAM_CHAT_ID,
144
- 'text': message,
145
- 'parse_mode': 'HTML'
146
- }
147
-
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."""
@@ -403,6 +474,9 @@ def debug_telegram():
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__':
 
8
  import tempfile
9
  from datetime import datetime
10
  import logging
11
+ import socket
12
+ import dns.resolver
13
 
14
  app = Flask(__name__)
15
 
 
50
  gen = GOOGLE_API_KEY
51
  client = genai.Client(api_key=gen)
52
 
53
+ def test_network_connectivity():
54
+ """Teste la connectivité réseau de base."""
55
+ results = {}
56
+
57
+ # Test 1: Ping Google DNS
58
+ try:
59
+ socket.create_connection(("8.8.8.8", 53), timeout=5)
60
+ results['google_dns'] = {"success": True, "message": "Connexion à Google DNS réussie"}
61
+ except Exception as e:
62
+ results['google_dns'] = {"success": False, "message": f"Échec connexion Google DNS: {str(e)}"}
63
+
64
+ # Test 2: Résolution DNS de google.com
65
+ try:
66
+ socket.gethostbyname("google.com")
67
+ results['dns_google'] = {"success": True, "message": "Résolution DNS google.com réussie"}
68
+ except Exception as e:
69
+ results['dns_google'] = {"success": False, "message": f"Échec résolution DNS google.com: {str(e)}"}
70
+
71
+ # Test 3: Résolution DNS de api.telegram.org
72
+ try:
73
+ ip = socket.gethostbyname("api.telegram.org")
74
+ results['dns_telegram'] = {"success": True, "message": f"Résolution DNS api.telegram.org réussie: {ip}"}
75
+ except Exception as e:
76
+ results['dns_telegram'] = {"success": False, "message": f"Échec résolution DNS api.telegram.org: {str(e)}"}
77
+
78
+ # Test 4: Connexion HTTPS à api.telegram.org
79
+ try:
80
+ response = requests.get("https://api.telegram.org/", timeout=10)
81
+ results['https_telegram'] = {"success": True, "message": f"Connexion HTTPS réussie: {response.status_code}"}
82
+ except Exception as e:
83
+ results['https_telegram'] = {"success": False, "message": f"Échec connexion HTTPS: {str(e)}"}
84
+
85
+ return results
86
+
87
+ def send_image_to_telegram_with_fallback(image_path, caption=""):
88
+ """Envoie une image vers le groupe Telegram avec différentes méthodes."""
89
+
90
+ # Méthode 1: URL standard
91
  url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendPhoto"
92
+ result = _try_send_image(url, image_path, caption, "URL standard")
93
+ if result[0]:
94
+ return result
95
 
96
+ # Méthode 2: Essayer avec l'IP directe (nécessite de résoudre l'IP d'abord)
97
  try:
98
+ ip = socket.gethostbyname("api.telegram.org")
99
+ url_ip = f"https://{ip}/bot{TELEGRAM_BOT_TOKEN}/sendPhoto"
100
+ result = _try_send_image(url_ip, image_path, caption, "IP directe",
101
+ headers={"Host": "api.telegram.org"})
102
+ if result[0]:
103
+ return result
104
+ except Exception as e:
105
+ logger.error(f"Impossible de résoudre l'IP: {e}")
106
+
107
+ return False, "Toutes les méthodes ont échoué"
108
+
109
+ def _try_send_image(url, image_path, caption, method_name, headers=None):
110
+ """Tentative d'envoi d'image avec une méthode spécifique."""
111
+ try:
112
+ logger.info(f"Tentative d'envoi avec {method_name}: {url}")
113
+
114
  if not os.path.exists(image_path):
 
115
  return False, f"Le fichier {image_path} n'existe pas"
116
 
 
117
  file_size = os.path.getsize(image_path)
118
+ if file_size > 10 * 1024 * 1024:
119
+ return False, f"Fichier trop volumineux: {file_size} bytes"
 
120
 
 
121
  if file_size == 0:
 
122
  return False, f"Fichier vide: {image_path}"
123
 
 
 
 
 
 
124
  with open(image_path, 'rb') as photo:
125
  files = {'photo': ('image.jpg', photo, 'image/jpeg')}
126
  data = {
127
  'chat_id': TELEGRAM_CHAT_ID,
128
+ 'caption': caption[:1024] if caption else ""
129
  }
130
 
131
+ # Augmenter le timeout et ajouter des headers si nécessaire
132
+ request_headers = headers or {}
133
+ response = requests.post(url, files=files, data=data,
134
+ timeout=30, headers=request_headers)
135
 
136
+ logger.info(f"{method_name} - Réponse HTTP: {response.status_code}")
 
137
 
138
  if response.status_code == 200:
139
  response_json = response.json()
140
  if response_json.get('ok'):
141
+ logger.info(f" {method_name} - Envoi réussi")
142
+ return True, f"{method_name} - Image envoyée avec succès"
143
  else:
144
  error_msg = response_json.get('description', 'Erreur inconnue')
145
+ return False, f"{method_name} - Erreur API: {error_msg}"
 
146
  else:
147
+ return False, f"{method_name} - Erreur HTTP {response.status_code}: {response.text}"
 
148
 
 
 
 
 
 
 
149
  except Exception as e:
150
+ logger.error(f"{method_name} - Erreur: {str(e)}")
151
+ return False, f"{method_name} - Erreur: {str(e)}"
152
+
153
+ def send_message_to_telegram_with_fallback(message):
154
+ """Envoie un message texte avec fallback."""
155
+
156
+ # Méthode 1: URL standard
157
+ url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage"
158
+ result = _try_send_message(url, message, "URL standard")
159
+ if result[0]:
160
+ return result
161
+
162
+ # Méthode 2: IP directe
163
+ try:
164
+ ip = socket.gethostbyname("api.telegram.org")
165
+ url_ip = f"https://{ip}/bot{TELEGRAM_BOT_TOKEN}/sendMessage"
166
+ result = _try_send_message(url_ip, message, "IP directe",
167
+ headers={"Host": "api.telegram.org"})
168
+ if result[0]:
169
+ return result
170
+ except Exception as e:
171
+ logger.error(f"Impossible de résoudre l'IP: {e}")
172
+
173
+ return False, "Toutes les méthodes ont échoué"
174
+
175
+ def _try_send_message(url, message, method_name, headers=None):
176
+ """Tentative d'envoi de message avec une méthode spécifique."""
177
+ try:
178
+ data = {
179
+ 'chat_id': TELEGRAM_CHAT_ID,
180
+ 'text': message,
181
+ 'parse_mode': 'HTML'
182
+ }
183
+
184
+ request_headers = headers or {}
185
+ response = requests.post(url, data=data, timeout=30, headers=request_headers)
186
+
187
+ if response.status_code == 200:
188
+ response_json = response.json()
189
+ if response_json.get('ok'):
190
+ return True, f"{method_name} - Message envoyé avec succès"
191
+ else:
192
+ return False, f"{method_name} - Erreur API: {response_json.get('description')}"
193
+ else:
194
+ return False, f"{method_name} - Erreur HTTP: {response.status_code}"
195
+
196
+ except Exception as e:
197
+ return False, f"{method_name} - Erreur: {str(e)}"
198
+
199
+ # Remplacer les anciennes fonctions par les nouvelles
200
+ send_image_to_telegram = send_image_to_telegram_with_fallback
201
+ send_message_to_telegram = send_message_to_telegram_with_fallback
202
 
203
  def test_bot_permissions():
204
  """Teste les permissions du bot dans le groupe."""
 
224
  logger.error(f"Erreur test permissions: {str(e)}")
225
  return False, f"Erreur: {str(e)}"
226
 
227
+ # Nouvelle route pour diagnostiquer les problèmes réseau
228
+ @app.route('/network_test', methods=['GET'])
229
+ def network_test():
230
+ """Route pour tester la connectivité réseau."""
231
+ results = test_network_connectivity()
232
+ return jsonify(results)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
233
 
234
+ # Route pour tester les permissions
235
  @app.route('/test_bot_permissions', methods=['GET'])
236
  def test_bot_permissions_route():
237
  """Route pour tester les permissions du bot."""
 
474
  "chat_id_format": TELEGRAM_CHAT_ID.startswith("-") if TELEGRAM_CHAT_ID else False
475
  }
476
 
477
+ # Test 4: Diagnostic réseau
478
+ results['network'] = test_network_connectivity()
479
+
480
  return jsonify(results)
481
 
482
  if __name__ == '__main__':