feat: support Telegram proxy
This commit is contained in:
parent
ce9acabde5
commit
48a93425dd
|
|
@ -1,6 +1,10 @@
|
||||||
# Токен от @BotFather
|
# Токен от @BotFather
|
||||||
BOT_TOKEN=
|
BOT_TOKEN=
|
||||||
|
|
||||||
|
# Прокси для Telegram API. Пусто — без прокси.
|
||||||
|
# В Docker на Linux: http://host.docker.internal:20171
|
||||||
|
TELEGRAM_PROXY=
|
||||||
|
|
||||||
# ComfyUI API
|
# ComfyUI API
|
||||||
COMFY_BASE_URL=http://192.168.31.113:8188
|
COMFY_BASE_URL=http://192.168.31.113:8188
|
||||||
WORKFLOW_T2I=workflows/txt2img.json
|
WORKFLOW_T2I=workflows/txt2img.json
|
||||||
|
|
|
||||||
15
README.md
15
README.md
|
|
@ -29,9 +29,24 @@ Copy-Item .env.example .env
|
||||||
Заполнить `.env`:
|
Заполнить `.env`:
|
||||||
|
|
||||||
- `BOT_TOKEN` — токен от `@BotFather`.
|
- `BOT_TOKEN` — токен от `@BotFather`.
|
||||||
|
- `TELEGRAM_PROXY` — прокси для Telegram API (пусто — напрямую).
|
||||||
- `COMFY_BASE_URL` — например `http://192.168.31.113:8188`.
|
- `COMFY_BASE_URL` — например `http://192.168.31.113:8188`.
|
||||||
- Остальные параметры можно оставить по умолчанию.
|
- Остальные параметры можно оставить по умолчанию.
|
||||||
|
|
||||||
|
### Прокси для Telegram
|
||||||
|
|
||||||
|
Если сервер не имеет прямого доступа к Telegram, укажи прокси V2RayA/HTTP/SOCKS5:
|
||||||
|
|
||||||
|
```dotenv
|
||||||
|
# Docker на Linux (V2RayA слушает на хосте)
|
||||||
|
TELEGRAM_PROXY=http://host.docker.internal:20171
|
||||||
|
|
||||||
|
# Запуск без Docker, на том же хосте
|
||||||
|
# TELEGRAM_PROXY=http://127.0.0.1:20171
|
||||||
|
```
|
||||||
|
|
||||||
|
Для SOCKS5 используй `socks5h://host.docker.internal:20170`; зависимость `socksio` уже включена в `requirements.txt`.
|
||||||
|
|
||||||
## Запуск
|
## Запуск
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
|
|
|
||||||
8
bot.py
8
bot.py
|
|
@ -44,13 +44,17 @@ class MpakoBot:
|
||||||
self._last_edit: dict[int, tuple[float, int]] = {}
|
self._last_edit: dict[int, tuple[float, int]] = {}
|
||||||
|
|
||||||
def run(self) -> None:
|
def run(self) -> None:
|
||||||
application = (
|
builder = (
|
||||||
Application.builder()
|
Application.builder()
|
||||||
.token(self._settings.bot_token)
|
.token(self._settings.bot_token)
|
||||||
.post_init(self._post_init)
|
.post_init(self._post_init)
|
||||||
.post_shutdown(self._post_shutdown)
|
.post_shutdown(self._post_shutdown)
|
||||||
.build()
|
|
||||||
)
|
)
|
||||||
|
if self._settings.telegram_proxy:
|
||||||
|
builder = builder.proxy(self._settings.telegram_proxy).get_updates_proxy(
|
||||||
|
self._settings.telegram_proxy
|
||||||
|
)
|
||||||
|
application = builder.build()
|
||||||
application.add_handler(CommandHandler("start", self._start))
|
application.add_handler(CommandHandler("start", self._start))
|
||||||
application.add_handler(CommandHandler("help", self._help))
|
application.add_handler(CommandHandler("help", self._help))
|
||||||
application.add_handler(CommandHandler("status", self._status))
|
application.add_handler(CommandHandler("status", self._status))
|
||||||
|
|
|
||||||
11
config.py
11
config.py
|
|
@ -55,6 +55,7 @@ def _user_ids(name: str) -> frozenset[int]:
|
||||||
@dataclass(frozen=True)
|
@dataclass(frozen=True)
|
||||||
class Settings:
|
class Settings:
|
||||||
bot_token: str
|
bot_token: str
|
||||||
|
telegram_proxy: str | None = None
|
||||||
comfy_base_url: str = "http://192.168.31.113:8188"
|
comfy_base_url: str = "http://192.168.31.113:8188"
|
||||||
workflow_t2i: Path = PROJECT_ROOT / "workflows" / "txt2img.json"
|
workflow_t2i: Path = PROJECT_ROOT / "workflows" / "txt2img.json"
|
||||||
workflow_i2i: Path = PROJECT_ROOT / "workflows" / "img2img.json"
|
workflow_i2i: Path = PROJECT_ROOT / "workflows" / "img2img.json"
|
||||||
|
|
@ -88,8 +89,18 @@ class Settings:
|
||||||
if not base_url.startswith(("http://", "https://")):
|
if not base_url.startswith(("http://", "https://")):
|
||||||
raise ValueError("COMFY_BASE_URL должен начинаться с http:// или https://")
|
raise ValueError("COMFY_BASE_URL должен начинаться с http:// или https://")
|
||||||
|
|
||||||
|
proxy = os.getenv("TELEGRAM_PROXY", "").strip() or None
|
||||||
|
if proxy and not proxy.startswith(
|
||||||
|
("http://", "https://", "socks5://", "socks5h://")
|
||||||
|
):
|
||||||
|
raise ValueError(
|
||||||
|
"TELEGRAM_PROXY должен начинаться с http://, https://, "
|
||||||
|
"socks5:// или socks5h://"
|
||||||
|
)
|
||||||
|
|
||||||
settings = cls(
|
settings = cls(
|
||||||
bot_token=token,
|
bot_token=token,
|
||||||
|
telegram_proxy=proxy,
|
||||||
comfy_base_url=base_url.rstrip("/"),
|
comfy_base_url=base_url.rstrip("/"),
|
||||||
workflow_t2i=_path("WORKFLOW_T2I", "workflows/txt2img.json"),
|
workflow_t2i=_path("WORKFLOW_T2I", "workflows/txt2img.json"),
|
||||||
workflow_i2i=_path("WORKFLOW_I2I", "workflows/img2img.json"),
|
workflow_i2i=_path("WORKFLOW_I2I", "workflows/img2img.json"),
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ services:
|
||||||
bot:
|
bot:
|
||||||
build: .
|
build: .
|
||||||
env_file: .env
|
env_file: .env
|
||||||
|
extra_hosts:
|
||||||
|
- "host.docker.internal:host-gateway"
|
||||||
volumes:
|
volumes:
|
||||||
- ./storage:/app/storage
|
- ./storage:/app/storage
|
||||||
- ./data:/app/data
|
- ./data:/app/data
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
python-telegram-bot>=21.6,<23
|
python-telegram-bot>=21.6,<23
|
||||||
httpx>=0.27,<1
|
httpx[socks]>=0.27,<1
|
||||||
aiosqlite>=0.20,<1
|
aiosqlite>=0.20,<1
|
||||||
websockets>=13,<16
|
websockets>=13,<16
|
||||||
python-dotenv>=1.0,<2
|
python-dotenv>=1.0,<2
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue