feat: implement proxy URL handling for Telegram bot requests
CI / lint-and-test (push) Has been cancelled

This commit is contained in:
2026-07-12 21:42:59 +02:00
parent ec3cea94c9
commit 17f19e1708
2 changed files with 49 additions and 2 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
# Telegram Bot Token (from @BotFather) # Telegram Bot Token (from @BotFather)
TELEGRAM_BOT_TOKEN=8653489932:AAG_Ins2_z3sNHX8ZlGI4mhyzmUhWAWCZlg TELEGRAM_BOT_TOKEN=8653489932:AAEqODkhcWRkfA0aZmMW2PBUvTspmFgXg-I
# Direct PostgreSQL connection # Direct PostgreSQL connection
POSTGRES_HOST=192.168.178.3 POSTGRES_HOST=192.168.178.3
+48 -1
View File
@@ -7,12 +7,14 @@ import sys
from contextlib import suppress from contextlib import suppress
from datetime import datetime, timedelta, timezone from datetime import datetime, timedelta, timezone
from typing import Any from typing import Any
from urllib.parse import quote
import aiohttp.web as web import aiohttp.web as web
import asyncpg import asyncpg
from dotenv import load_dotenv from dotenv import load_dotenv
from telegram import Update from telegram import Update
from telegram.ext import Application, ExtBot from telegram.ext import Application, ExtBot
from telegram.request import HTTPXRequest
from db import close_pool, get_pool from db import close_pool, get_pool
from health import create_health_app, record_scheduler_run, set_start_time, set_telegram_polling from health import create_health_app, record_scheduler_run, set_start_time, set_telegram_polling
@@ -24,6 +26,25 @@ logger = logging.getLogger(__name__)
load_dotenv() load_dotenv()
def _get_proxy_url() -> str | None:
raw = (os.getenv("HTTPS_PROXY") or os.getenv("https_proxy") or "").strip()
if not raw:
return None
if "://" in raw:
return raw
parts = raw.split(":", 3)
if len(parts) != 4:
logger.warning(
"Ignoring invalid HTTPS_PROXY value (expected host:port:user:pass or full URL)"
)
return None
host, port, username, password = parts
return f"http://{quote(username, safe='')}:{quote(password, safe='')}@{host}:{port}"
def _ad_passes_filters(fields: dict, kw_row: dict) -> bool: def _ad_passes_filters(fields: dict, kw_row: dict) -> bool:
"""Check if an ad passes the keyword's price and postcode filters.""" """Check if an ad passes the keyword's price and postcode filters."""
price = fields.get("price") price = fields.get("price")
@@ -396,7 +417,33 @@ async def main() -> None:
except Exception: except Exception:
logger.exception("Failed to start Web UI (optional)") logger.exception("Failed to start Web UI (optional)")
app = Application.builder().token(os.getenv("TELEGRAM_BOT_TOKEN")).build() proxy_url = _get_proxy_url()
bot_request = HTTPXRequest(
connection_pool_size=10,
proxy_url=proxy_url,
read_timeout=30.0,
write_timeout=30.0,
connect_timeout=30.0,
pool_timeout=10.0,
media_write_timeout=60.0,
)
updates_request = HTTPXRequest(
connection_pool_size=10,
proxy_url=proxy_url,
read_timeout=30.0,
write_timeout=30.0,
connect_timeout=30.0,
pool_timeout=10.0,
media_write_timeout=60.0,
)
app = (
Application.builder()
.token(os.getenv("TELEGRAM_BOT_TOKEN"))
.request(bot_request)
.get_updates_request(updates_request)
.build()
)
scheduler = None scheduler = None
poll_task = None poll_task = None
bot_started = False bot_started = False