Hamdy Doma commited on
Commit
a37d5b9
·
1 Parent(s): dd4b661

Use Vercel as reverse proxy for Telegram API to bypass HF firewall

Browse files
Files changed (3) hide show
  1. api/app.py +4 -7
  2. api/routes.py +39 -0
  3. messaging/platforms/telegram.py +7 -0
api/app.py CHANGED
@@ -7,14 +7,11 @@ import logging
7
  import os
8
  import socket
9
 
10
- # --- HUGGING FACE SPACES DNS/IPV6 FIX ---
11
- # Force IPv4 and bypass DNS hanging for api.telegram.org
12
  old_getaddrinfo = socket.getaddrinfo
13
- def new_getaddrinfo(host, port, *args, **kwargs):
14
- if host == "api.telegram.org":
15
- # Hardcode Telegram API IP to bypass broken DNS on Hugging Face
16
- return [(socket.AF_INET, socket.SOCK_STREAM, 6, '', ('149.154.167.220', port))]
17
- responses = old_getaddrinfo(host, port, *args, **kwargs)
18
  return [response for response in responses if response[0] == socket.AF_INET]
19
  socket.getaddrinfo = new_getaddrinfo
20
  # ------------------------------------
 
7
  import os
8
  import socket
9
 
10
+ # --- HUGGING FACE SPACES IPV6 FIX ---
11
+ # Force IPv4 only to prevent networking issues on broken IPv6 routes
12
  old_getaddrinfo = socket.getaddrinfo
13
+ def new_getaddrinfo(*args, **kwargs):
14
+ responses = old_getaddrinfo(*args, **kwargs)
 
 
 
15
  return [response for response in responses if response[0] == socket.AF_INET]
16
  socket.getaddrinfo = new_getaddrinfo
17
  # ------------------------------------
api/routes.py CHANGED
@@ -251,3 +251,42 @@ async def telegram_webhook(request: Request):
251
  except Exception as e:
252
  logger.error(f"WEBHOOK_ERR: {e}")
253
  return {"status": "error", "message": str(e)}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
251
  except Exception as e:
252
  logger.error(f"WEBHOOK_ERR: {e}")
253
  return {"status": "error", "message": str(e)}
254
+
255
+ @router.api_route("/proxy/telegram/{path:path}", methods=["GET", "POST"])
256
+ async def telegram_proxy(path: str, request: Request):
257
+ """Proxy Telegram API requests to bypass Hugging Face blocking."""
258
+ import httpx
259
+
260
+ target_url = f"https://api.telegram.org/{path}"
261
+
262
+ # Read the body
263
+ body = await request.body()
264
+
265
+ # Forward headers, but exclude host
266
+ headers = dict(request.headers)
267
+ headers.pop("host", None)
268
+
269
+ async with httpx.AsyncClient() as client:
270
+ try:
271
+ req = client.build_request(
272
+ request.method,
273
+ target_url,
274
+ headers=headers,
275
+ content=body
276
+ )
277
+ resp = await client.send(req)
278
+
279
+ # Return response
280
+ response_headers = dict(resp.headers)
281
+ response_headers.pop("content-encoding", None)
282
+ response_headers.pop("content-length", None)
283
+
284
+ return Response(
285
+ content=resp.content,
286
+ status_code=resp.status_code,
287
+ headers=response_headers,
288
+ media_type=resp.headers.get("content-type")
289
+ )
290
+ except Exception as e:
291
+ logger.error(f"PROXY_ERR: Failed to proxy to Telegram: {e}")
292
+ return Response(content=str(e), status_code=500)
messaging/platforms/telegram.py CHANGED
@@ -139,6 +139,13 @@ class TelegramPlatform(MessagingPlatform):
139
 
140
  # Build Application
141
  builder = Application.builder().token(self.bot_token).request(request)
 
 
 
 
 
 
 
142
  self._application = builder.build()
143
 
144
  # Register Internal Handlers
 
139
 
140
  # Build Application
141
  builder = Application.builder().token(self.bot_token).request(request)
142
+
143
+ # --- HF PROXY FIX ---
144
+ # If running on Hugging Face, route through the Vercel proxy
145
+ if os.environ.get("SPACE_ID"):
146
+ builder.base_url("https://my-free-claude.vercel.app/proxy/telegram/bot")
147
+ logger.info("Using Vercel proxy for Telegram API requests")
148
+
149
  self._application = builder.build()
150
 
151
  # Register Internal Handlers