Spaces:
Sleeping
Sleeping
Hamdy Doma commited on
Commit ·
a37d5b9
1
Parent(s): dd4b661
Use Vercel as reverse proxy for Telegram API to bypass HF firewall
Browse files- api/app.py +4 -7
- api/routes.py +39 -0
- 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
|
| 11 |
-
# Force IPv4
|
| 12 |
old_getaddrinfo = socket.getaddrinfo
|
| 13 |
-
def new_getaddrinfo(
|
| 14 |
-
|
| 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
|