diff --git a/README.md b/README.md index 53d1e04..a8afde5 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ cp serv/.env.example serv/.env - `NEW_QWEN_GIGACHAT_API_BASE_URL` - базовый URL inference API GigaChat - `NEW_QWEN_GIGACHAT_OAUTH_URL` - URL получения access token GigaChat - `NEW_QWEN_YANDEXGPT_MODEL` - имя модели для будущего YandexGPT adapter +- `NEW_QWEN_TELEGRAM_PROXY` - необязательный HTTPS прокси для доступа Telegram (например `http://127.0.0.1:7890`) - `NEW_QWEN_TOOL_POLICY` - режим инструментов: `full-access` - все инструменты `workspace-write` - без `exec_command` diff --git a/bot/.env.example b/bot/.env.example index 086e9bb..bfb1733 100644 --- a/bot/.env.example +++ b/bot/.env.example @@ -1,4 +1,4 @@ NEW_QWEN_BOT_TOKEN=0000000000:telegram-token NEW_QWEN_SERVER_URL=http://127.0.0.1:8080 NEW_QWEN_POLL_TIMEOUT=30 - +NEW_QWEN_TELEGRAM_PROXY=http://127.0.0.1:7890 diff --git a/bot/app.py b/bot/app.py index 999ca8b..f073b56 100644 --- a/bot/app.py +++ b/bot/app.py @@ -643,7 +643,7 @@ def handle_message(api: TelegramAPI, config: BotConfig, state: dict[str, Any], m def main() -> None: config = BotConfig.load() - api = TelegramAPI(config.token) + api = TelegramAPI(config.token, proxy_url=config.proxy_url) state = load_state() print("new-qwen bot polling started") while True: diff --git a/bot/config.py b/bot/config.py index 03bc483..d1ac2f7 100644 --- a/bot/config.py +++ b/bot/config.py @@ -21,6 +21,7 @@ class BotConfig: token: str server_url: str poll_timeout: int + proxy_url: str | None @classmethod def load(cls) -> "BotConfig": @@ -33,5 +34,5 @@ class BotConfig: token=token, server_url=os.environ.get("NEW_QWEN_SERVER_URL", "http://127.0.0.1:8080").rstrip("/"), poll_timeout=int(os.environ.get("NEW_QWEN_POLL_TIMEOUT", "30")), + proxy_url=os.environ.get("NEW_QWEN_TELEGRAM_PROXY", "").strip() or None, ) - diff --git a/bot/telegram_api.py b/bot/telegram_api.py index af9d3b2..9b0aa70 100644 --- a/bot/telegram_api.py +++ b/bot/telegram_api.py @@ -2,27 +2,31 @@ from __future__ import annotations import json from typing import Any -from urllib import parse, request +from urllib import parse, request as urllib_request class TelegramAPI: - def __init__(self, token: str) -> None: + def __init__(self, token: str, proxy_url: str | None = None) -> None: self.base_url = f"https://api.telegram.org/bot{token}" + handlers = [] + if proxy_url: + handlers.append(urllib_request.ProxyHandler({"https": proxy_url, "http": proxy_url})) + self.opener = urllib_request.build_opener(*handlers) if handlers else urllib_request.build_opener() def _post(self, method: str, payload: dict[str, Any]) -> dict[str, Any]: data = json.dumps(payload).encode("utf-8") - req = request.Request( + req = urllib_request.Request( f"{self.base_url}/{method}", data=data, headers={"Content-Type": "application/json"}, method="POST", ) - with request.urlopen(req, timeout=90) as response: + with self.opener.open(req, timeout=90) as response: return json.loads(response.read().decode("utf-8")) def _get(self, method: str, params: dict[str, Any]) -> dict[str, Any]: query = parse.urlencode(params) - with request.urlopen(f"{self.base_url}/{method}?{query}", timeout=90) as response: + with self.opener.open(f"{self.base_url}/{method}?{query}", timeout=90) as response: return json.loads(response.read().decode("utf-8")) def get_updates(self, offset: int | None, timeout: int) -> list[dict[str, Any]]: @@ -34,4 +38,3 @@ class TelegramAPI: def send_message(self, chat_id: int, text: str) -> None: self._post("sendMessage", {"chat_id": chat_id, "text": text}) -