feat: implement proxy URL handling for Telegram bot requests
CI / lint-and-test (push) Has been cancelled
CI / lint-and-test (push) Has been cancelled
This commit is contained in:
+1
-1
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user